公司導入 Laravel 分享 - 11. Request

基本的 Request 其實我們前面已經用到了,這裡主要說的其實是資料的驗證和 Model 的 fillable 屬性,和官網的 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 裡有寫的欄位才會被存到資料庫中。

留言