公司導入 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 底下。
裡面預設有兩個 function:
- 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 [
- //
- ];
- }
- }
第一個 authorize 是針對使用者授權,如果是 false 代表不通過,如果想在其他地方處理授權,這裡就直接調成 true。
第二個 function 就是這次的主題之一,資料驗證的規則撰寫。
Laravel 提供的驗證方法有很多,請參考:https://laravel.com/docs/5.4/validation#available-validation-rules。
- public function rules()
- {
- return [
- 'title' => 'required',
- 'content' => 'required',
- ];
- }
使用時我們直接修改 controller 即可,系統會自動使用我們設定的 request 去做驗證。
如果驗證失敗也會導回原來的頁面,錯誤訊息會被儲存在 session 中,所以我們可以根據錯誤訊息來顯示相關問題。
- public function store(PostRequest $request)
- {
- ...
- return redirect()->route('post.index');
- }
如果想把錯誤訊息顯示在每個欄位下方,可以這麼寫
- @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();
有發現程式少很多嗎?如果想要這麼方便的使用,就必須在 Model 裡面加一個 fillable 屬性。
- // create
- Post::create($request->all());
- //edit
- $post->update($request->all());
如果沒有加會出現找不到 _token 的錯誤,這是因為 $request 裡面包含了一個 _token 的變數,可是我們的資料表裡面沒有這個欄位。fillable 的功用就是過濾這些欄位,只有 fillable 裡有寫的欄位才會被存到資料庫中。
- class Post extends Model
- {
- protected $fillable = ['title', 'content'];
- }
留言
張貼留言