【问题标题】:Where should I put model saving event listener in laravel 5.1我应该在 laravel 5.1 中将模型保存事件监听器放在哪里
【发布时间】:2015-09-27 13:33:25
【问题描述】:

Laravel 文档说我应该像这样将模型事件放在 EventServiceProvider boot() 方法中。

public function boot(DispatcherContract $events)
{

    Raisefund::saved(function ($project) {
        //do something
    });

}

但我有很多想要听的模型。
所以我想知道将它全部放在EventServiceProvider 中是否是正确的方法。

【问题讨论】:

    标签: php laravel eloquent laravel-5.1


    【解决方案1】:

    你可以在你的模型boot方法中注册监听回调,例如:

    class User extends Eloquent {
      protected static function boot() {
        parent::boot();
    
        static::deleting(function ($user) {
          // deleting listener logic
        });
    
        static::saving(function ($user) {
          // saving listener logic
        });
      }
    }
    

    【讨论】:

    • 这不是 laravel 方式
    • 文档确实推荐了一种替代方法,但并未明确表示这是不好的。在某种程度上,这里更清楚,因为我可以查看我的模型,并且我知道哪些事件具有侦听器,而不是扎根于指向某处观察者的服务提供者。如果你有很多听众,也许其他地方会更好。
    • 我同意奥马尔的观点。有时你必须避免过于狂热。这个解决方案很好地解决了这个难题,当您需要调整某些东西时,不会让您在 8 个月内陷入 WTF。
    【解决方案2】:

    是的,没错,EventServiceProvider 是最适合它的地方。

    但是,您可以创建观察者来保持清洁。我会给你一个简单的例子。

    EventServiceProvider

    <?php 
    
    namespace App\Providers;
    
    use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
    use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
    
    use App\Models\Users;
    use App\Observers\UserObserver;
    
    /**
     * Event service provider class
     */
    class EventServiceProvider extends ServiceProvider
    {
        /**
         * Boot function
         *
         * @param DispatcherContract $events
         */
        public function boot(DispatcherContract $events)
        {
            parent::boot($events);
    
            Users::observe(new UserObserver());
        }
    }
    

    用户观察者

    <?php
    
    namespace App\Observers;
    
    /**
     * Observes the Users model
     */
    class UserObserver 
    {
        /**
         * Function will be triggerd when a user is updated
         * 
         * @param Users $model
         */
        public function updated($model)
        {
        }
    }
    

    Observer 将是执行savedupdatedcreated 等函数的地方。
    更多观察者信息:http://laravel.com/docs/5.0/eloquent#model-observers

    【讨论】:

    • 你把 UserObserver 放在哪里(文件夹名,文件名...)?
    • @JeremieGes 我在 App 目录中创建了一个名为 Observers 的新文件夹。之后,我在 App\Oberservers 目录中创建了一个名为 UserObserver.php 的文件。
    • 我需要在 composer.json 中注册一些东西吗?
    • @JeremieGes 不,你不必这样做。您只需将Users::observe(new UserObserver()); 添加到EventServiceProvider。之后它应该工作。您可以使用created 函数对其进行测试。只需在函数中添加die('test'); 之类的内容,看看它是否被触发。
    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多