Installing the package
You need to get the “laravel illuminate/html collective” which you can google.
First we’ll add it manually. Go here:
https://laravelcollective.com/docs/6.x/html
Edit your project’s composer.json
file to require laravelcollective/html
. Find your require block and add:
"laravelcollective/html": "6.*"
In terminal:
composer update
Now you need to add to any Model that’s going to use it. In this case add to the Post model:
use Collective\Html\Eloquent\FormAccessible;
Modifying the create form
@extends('layouts.app')
@section('content')
<h1>Create Post</h1>
{!! Form::open() !!}
<input type="text" name="title" placeholder="Enter title" />
<input type="submit" name="submit" />
{!! Form::close() !!}
@endsection
Remove the token as it'll create it for you. If you inspect your page form, you should see the token is added automatically. However if you submit the form you'll get an error. Its sending to the wrong URL.
Okay make these edits:
@extends('layouts.app')
@section('content')
<h1>Create Post</h1>
{!! Form::open(['method'=>'POST','route'=>'posts.store']) !!}
<input type="text" name="title" placeholder="Enter title" />
<input type="submit" name="submit" />
{!! Form::close() !!}
@endsection
Next add fields using the package like this:
@extends('layouts.app')
@section('content')
<h1>Create Post</h1>
{!! Form::open(['method'=>'POST','route'=>'posts.store']) !!}
<div class="form-group">
{!! Form::label('title','Title:') !!}
{!! Form::text('title',null,['class'=>'form-control']) !!}
</div>
<div class="form-group">
{!! Form::submit('Create Post',['class'=>'btn btn-primary']) !!}
</div>
{!! Form::close() !!}
@endsection
Modifying the edit/delete form
@extends('layouts.app')
@section('content')
<h1>Edit Post</h1>
{!! Form::model($post,['method'=>'PATCH','route'=>['posts.update',$post->id]]) !!}
{!! Form::label('title','Title:') !!}
{!! Form::text('title',null,['class'=>'form-control']) !!}
{!! Form::submit('Update Post',['class'=>'btn btn-info']) !!}
{!! Form::close() !!}
<!-- <form method="post" action="/posts/{{$post->id}}"> -->
{!! Form::open(['method'=>'DELETE','route'=>['posts.destroy',$post->id]]) !!}
{!! Form::submit('Delete Post',['class'=>'btn btn-danger']) !!}
{!! Form::close() !!}
@endsection
Basic Validation
Update the store function in PostController like this:
public function store(Request $request)
{
$this->validate($request,[
'title'=>'required|max:4'
]);
$post = new Post;
$post->title = $request->title;
$post->save();
return redirect('/posts');
}
Now the form won’t enter without a value.
Displaying Errors
The validate function will create an errors variable when it fails which can be used in the views. So in our create.blade.php add this part:
@extends('layouts.app')
@section('content')
<h1>Create Post</h1>
{!! Form::open(['method'=>'POST','route'=>'posts.store']) !!}
<div class="form-group">
{!! Form::label('title','Title:') !!}
{!! Form::text('title',null,['class'=>'form-control']) !!}
</div>
<div class="form-group">
{!! Form::submit('Create Post',['class'=>'btn btn-primary']) !!}
</div>
{!! Form::close() !!}
@if(count($errors)>0)
<div class="alert alert-danger">
@foreach($errors->all() as $error)
<li>{{$error}}
@endforeach
</div>
@endif
@endsection
You should see errors added to bottom of form now.
Advance validation
Instead of creating the validation inside the store function, we are going to create a validation class that we’ll call inside the store function.
To see all your functions available type:
php artisan
You’ll see make:request Create a new form request class
which is what we want to do. So next type this command:
php artisan make:request CreatePostRequest
You’ll find this file under App\Http\Requests. Open it and change authorize function to return true since we aren’t creating something that needs it.
Update rules function like so:
public function rules()
{
return [
'title'=>'required|max:4',
];
}
That’s it! Very simple. Now we need to use it in our PostsController.
use App\Http\Requests\CreatePostRequest;
public function store(CreatePostRequest $request)
{
$post = new Post;
$post->title = $request->title;
$post->save();
return redirect('/posts');
}