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 [];
}