:::

15-7 利用模型觀察器建立使用者資料

  1. 上上個單元,我們用批量賦值的方式來寫入資料,其實,還有更快的方法,那就是利用$request->all(),把請求中的資料一次性全部寫入。
  2. 問題是,使用者編號user_id我們並沒有放在視圖中,由請求送過來,而是到了控制器中才即時去抓。這樣的好處是避免資料被竄改,但缺點就是無法利用$request->all(),把請求中的資料一次性全部寫入。
  3. 不過,我們可以利用模型的事件,搭配觀察器來自動產生需要的資料,詳情可參考:https://learnku.com/docs/laravel/5.8/eloquent/3931#events
  4. 首先,先建立一個購物車的觀察器:
    php artisan make:observer CartObserver --model=Cart
  5. 如此,會產生\專案\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();
            }
        }
    
    }
    
  6. 我們在建立資料時(creating)及更新資料時(updating),利用Auth::check()判斷是否已經登入(上面記得加入use App\Cart;use Illuminate\Support\Facades\Auth;

  7. 若是已經登入,則設定$cart->user_id屬性質為Auth::id(),亦即使用者編號,如此,當請求送出時,就會自動建立出user_id的值。

  8. 最後記得到\專案\app\Providers\AppServiceProvider.php註冊之,如此才會生效。
    use App\Observers\CartObserver;
    
    ...略...
    
    public function boot()
    {
        Cart::observe(CartObserver::class);
    }
  9. 接著,我們只要修改控制器\專案\app\Http\Controllers\CartController.php就可以用超簡單的語法將資料寫入資料庫了。
    public function store(CartRequest $request)
    {
        Cart::create($request->all());
        return [];
    }

到GitHub觀看此單元程式異動  


:::

書籍目錄

展開 | 闔起

快速登入


http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D1445%26tbsn%3D43

計數器

今天: 5050
昨天: 8625862586258625
總計: 8030657803065780306578030657803065780306578030657