公司導入 Laravel 分享 - 11. Request

基本的 Request 其實我們前面已經用到了,這裡主要說的其實是資料的驗證和 Model 的 fillable 屬性,和官網的 Request 章節並不相同。

一、資料驗證

如果我們想要對 request 抓回來的資料加一些資料驗證的規則,那我們必須自訂一個新的 Request,來取代 Request $request。
php artisan make:request PostRequest
會產生一個 Request 的檔案,放在 app/Http/Requests 底下。
  1. class PostRequest extends FormRequest
  2. {
  3. /**
  4. * Determine if the user is authorized to make this request.
  5. *
  6. * @return bool
  7. */
  8. public function authorize()
  9. {
  10. return false;
  11. }
  12.  
  13. /**
  14. * Get the validation rules that apply to the request.
  15. *
  16. * @return array
  17. */
  18. public function rules()
  19. {
  20. return [
  21. //
  22. ];
  23. }
  24. }
裡面預設有兩個 function:
第一個 authorize 是針對使用者授權,如果是 false 代表不通過,如果想在其他地方處理授權,這裡就直接調成 true。
第二個 function 就是這次的主題之一,資料驗證的規則撰寫。
  1. public function rules()
  2. {
  3. return [
  4. 'title' => 'required',
  5. 'content' => 'required',
  6. ];
  7. }
Laravel 提供的驗證方法有很多,請參考:https://laravel.com/docs/5.4/validation#available-validation-rules

使用時我們直接修改 controller 即可,系統會自動使用我們設定的 request 去做驗證。
  1. public function store(PostRequest $request)
  2. {
  3. ...
  4.  
  5. return redirect()->route('post.index');
  6. }
如果驗證失敗也會導回原來的頁面,錯誤訊息會被儲存在 session 中,所以我們可以根據錯誤訊息來顯示相關問題。
  1. @if (count($errors) > 0)
  2. <div class="alert alert-danger">
  3. <ul>
  4. @foreach ($errors->all() as $error)
  5. <li>{{ $error }}</li>
  6. @endforeach
  7. </ul>
  8. </div>
  9. @endif
如果想把錯誤訊息顯示在每個欄位下方,可以這麼寫
  1. <div class="form-group @if ($errors->has('title')) has-error @endif">
  2. {!! Form::label('title', '標題', ['class' => 'col-sm-2 control-label']) !!}
  3. <div class="col-sm-10">
  4. {!! Form::text('title', null, ['class' => 'form-control']) !!}
  5. @if ($errors->has('title'))
  6. <p class="help-block">{{ $errors->first('title') }}</p>
  7. @endif
  8. </div>
  9. </div>

二、Fillable

會說到這個屬性其實也是因為我們在儲存資料的時候,是要自己 new 一個物件,然後把值改一改再儲存。
  1. $post = new Post();
  2.  
  3. $post->title = $request->title;
  4. $post->content = $request->content;
  5.  
  6. $post->save();
其實有一個更快捷的方法↓↓↓
  1. // create
  2. Post::create($request->all());
  3.  
  4. //edit
  5. $post->update($request->all());
有發現程式少很多嗎?如果想要這麼方便的使用,就必須在 Model 裡面加一個 fillable 屬性。
  1. class Post extends Model
  2. {
  3. protected $fillable = ['title', 'content'];
  4. }
如果沒有加會出現找不到 _token 的錯誤,這是因為 $request 裡面包含了一個 _token 的變數,可是我們的資料表裡面沒有這個欄位。fillable 的功用就是過濾這些欄位,只有 fillable 裡有寫的欄位才會被存到資料庫中。

留言