:::
15-7 利用模型觀察器建立使用者資料
- 上上個單元,我們用批量賦值的方式來寫入資料,其實,還有更快的方法,那就是利用
$request->all(),把請求中的資料一次性全部寫入。 - 問題是,使用者編號user_id我們並沒有放在視圖中,由請求送過來,而是到了控制器中才即時去抓。這樣的好處是避免資料被竄改,但缺點就是無法利用
$request->all(),把請求中的資料一次性全部寫入。 - 不過,我們可以利用模型的事件,搭配觀察器來自動產生需要的資料,詳情可參考:https://learnku.com/docs/laravel/5.8/eloquent/3931#events
- 首先,先建立一個購物車的觀察器:
php artisan make:observer CartObserver --model=Cart - 如此,會產生
\專案\app\Observers\CartObserver.php,我們開啟觀察器,並刪掉不要的事件,增加自己想要的事件:<?php namespace App\Observers; use App\Cart; use Illuminate\Support\Facades\Auth; class CartObserver { /** * Handle the cart "creating" event. * * @param \App\Cart $cart * @return void */ public function creating(Cart $cart) { if (Auth::check()) { $cart->user_id = Auth::id(); } } /** * Handle the cart "updating" event. * * @param \App\Cart $cart * @return void */ public function updating(Cart $cart) { if (Auth::check()) { $cart->user_id = Auth::id(); } } } -
我們在建立資料時(
creating)及更新資料時(updating),利用Auth::check()判斷是否已經登入(上面記得加入use App\Cart;及use Illuminate\Support\Facades\Auth;) -
若是已經登入,則設定
$cart->user_id屬性質為Auth::id(),亦即使用者編號,如此,當請求送出時,就會自動建立出user_id的值。 - 最後記得到
\專案\app\Providers\AppServiceProvider.php註冊之,如此才會生效。use App\Observers\CartObserver; ...略... public function boot() { Cart::observe(CartObserver::class); } - 接著,我們只要修改控制器
\專案\app\Http\Controllers\CartController.php就可以用超簡單的語法將資料寫入資料庫了。public function store(CartRequest $request) { Cart::create($request->all()); return []; }
15-6 建立Request來做資料整理及檢查
