Laravel:观察者和服务提供商之间的映射



我创建了一个观察者。但是当 save(( 事件从 ItemController 触发时,ItemObserver 的创建事件不起作用。

做错了什么,有人可以帮助我吗?

在此代码中,ItemObserver 用于在保存事件触发时将项目模型的名称字段大写。

>app
 >Observers
  >ItemObserver.php
 >Providers
  >ItemModelServiceProvider.php
 >Http
  >Controllers
   >ItemController.php
 >Models
  >Item.php

项目观察者.php

namespace AppObservers;
use AppModelsItem;
class ItemObserver
{
    /**
     * Accept Event And Done with Model
     *
     * @param Model $item
     * @return void
     */
    public function creating(Item $item)
    {
        $item->name = strtoupper($item->name);
    }
}

项目模型服务提供程序.php

namespace AppProviders;
use IlluminateSupportServiceProvider;
use AppModelsItem;
use AppObserversItemObserver;
class ItemModelServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        Item::observe(ItemObserver::class);
    }
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

项目控制器.php

namespace AppHttpControllers;
use AppModelsItem;
use IlluminateHttpRequest;
class ItemController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return IlluminateHttpResponse
     */
    public function index()
    {
        $items = AppModelsItem::orderBy('id', 'desc')->get();
        return view('items/list', compact('items'));
    }
    /**
     * Show the form for creating a new resource.
     *
     * @return IlluminateHttpResponse
     */
    public function create()
    {
        return view('items/create');
    }
    /**
     * Store a newly created resource in storage.
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpResponse
     */
    public function store(Request $request)
    {
        $item = new Item;
        $item->name = $request->get('name');
        $item->price = $request->get('price');
        $item->save();
        Session::flash('msg', 'Item has been saved.');
        return redirect('items')->with('msg', 'Item has been saved.');
    }
    /**
     * Display the specified resource.
     *
     * @param  AppModelsItem  $item
     * @return IlluminateHttpResponse
     */
    public function show(Item $item)
    {
        //
    }
    /**
     * Show the form for editing the specified resource.
     *
     * @param  AppModelsItem  $item
     * @return IlluminateHttpResponse
     */
    public function edit(Item $item)
    {
        //
    }
    /**
     * Update the specified resource in storage.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  AppModelsItem  $item
     * @return IlluminateHttpResponse
     */
    public function update(Request $request, Item $item)
    {
        //
    }
    /**
     * Remove the specified resource from storage.
     *
     * @param  AppModelsItem  $item
     * @return IlluminateHttpResponse
     */
    public function destroy(Item $item)
    {
        //
    }
}

项目.php

namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Item extends Model
{
}

创建自定义服务提供程序后,需要在 config/app.php 文件中注册。

'providers' => [
    ...
    AppProvidersItemModelServiceProvider::class,
],

如果在创建和更新时更改了模型属性值,则可以按如下方式使用和定义突变

class Item extends Model
{
    public function setNameAttribute($value)
    {
        $this->attributes['name'] = strtolower($value);
    }
}

最新更新