公司導入 Laravel 分享 - 11. Request
基本的 Request 其實我們前面已經用到了,這裡主要說的其實是資料的驗證和 Model 的 fillable 屬性,和官網的 Request 章節並不相同。
第一個 authorize 是針對使用者授權,如果是 false 代表不通過,如果想在其他地方處理授權,這裡就直接調成 true。
第二個 function 就是這次的主題之一,資料驗證的規則撰寫。
使用時我們直接修改 controller 即可,系統會自動使用我們設定的 request 去做驗證。
一、資料驗證
如果我們想要對 request 抓回來的資料加一些資料驗證的規則,那我們必須自訂一個新的 Request,來取代 Request $request。php artisan make:request PostRequest會產生一個 Request 的檔案,放在 app/Http/Requests 底下。
class PostRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
裡面預設有兩個 function:第一個 authorize 是針對使用者授權,如果是 false 代表不通過,如果想在其他地方處理授權,這裡就直接調成 true。
第二個 function 就是這次的主題之一,資料驗證的規則撰寫。
public function rules()
{
return [
'title' => 'required',
'content' => 'required',
];
}
Laravel 提供的驗證方法有很多,請參考:https://laravel.com/docs/5.4/validation#available-validation-rules。使用時我們直接修改 controller 即可,系統會自動使用我們設定的 request 去做驗證。
public function store(PostRequest $request)
{
...
return redirect()->route('post.index');
}
如果驗證失敗也會導回原來的頁面,錯誤訊息會被儲存在 session 中,所以我們可以根據錯誤訊息來顯示相關問題。
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
如果想把錯誤訊息顯示在每個欄位下方,可以這麼寫
<div class="form-group @if ($errors->has('title')) has-error @endif">
{!! Form::label('title', '標題', ['class' => 'col-sm-2 control-label']) !!}
<div class="col-sm-10">
{!! Form::text('title', null, ['class' => 'form-control']) !!}
@if ($errors->has('title'))
<p class="help-block">{{ $errors->first('title') }}</p>
@endif
</div>
</div>
二、Fillable
會說到這個屬性其實也是因為我們在儲存資料的時候,是要自己 new 一個物件,然後把值改一改再儲存。$post = new Post(); $post->title = $request->title; $post->content = $request->content; $post->save();其實有一個更快捷的方法↓↓↓
// create Post::create($request->all()); //edit $post->update($request->all());有發現程式少很多嗎?如果想要這麼方便的使用,就必須在 Model 裡面加一個 fillable 屬性。
class Post extends Model
{
protected $fillable = ['title', 'content'];
}
如果沒有加會出現找不到 _token 的錯誤,這是因為 $request 裡面包含了一個 _token 的變數,可是我們的資料表裡面沒有這個欄位。fillable 的功用就是過濾這些欄位,只有 fillable 裡有寫的欄位才會被存到資料庫中。

留言
張貼留言