基本的 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 裡有寫的欄位才會被存到資料庫中。
留言
張貼留言