【问题标题】:Laravel 5 Event Handler Not FiringLaravel 5 事件处理程序未触发
【发布时间】:2015-02-01 12:15:09
【问题描述】:

所以我正在尝试新的 Laravel 5 Event 方法。

在我的存储库中,我正在触发事件“KitchenStored”:

//  Events
use App\Events\KitchenStored;

class EloquentKitchen implements KitchenInterface {

    public function store($input) {
        $kitchen        = new $this->kitchen;
        $kitchen->name  = $input['name'];
        $kitchen->save();

        \Event::fire(new KitchenStored($kitchen));

        return $kitchen;
    }

哪个成功触发了这个事件:

<?php namespace App\Events;

use App\Events\Event;

use Illuminate\Queue\SerializesModels;

class KitchenStored extends Event {

    use SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($kitchen)
    {
        $this->kitchen  = $kitchen;
    }

}

但是,它没有链接到这个处理程序:

<?php namespace App\Handlers\Events;

use App\Events\KitchenStored;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;

class AttachCurrentUserToKitchen {

    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct()
    {
        dd('handler');
    }

    /**
     * Handle the event.
     *
     * @param  KitchenStored  $event
     * @return void
     */
    public function handle(KitchenStored $event)
    {
        //
    }

}

我知道是因为 dd('handler');在请求生命周期内不会触发。

我已在此处向其侦听器注册了该事件:

<?php namespace App\Providers;

use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider {

    /**
     * The event handler mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        App\Events\KitchenStored::class => [
            App\Handlers\Events\AttachCurrentUserToKitchen::class
        ]
    ];

    /**
     * Register any other events for your application.
     *
     * @param  \Illuminate\Contracts\Events\Dispatcher  $events
     * @return void
     */
    public function boot(DispatcherContract $events)
    {
        parent::boot($events);
        Event::listen('App\Events\KitchenStored',
                    'App\Handlers\Events\AttachCurrentUserToKitchen');
    }

}

谁能更好地解释这个过程,以便我可以继续使用迄今为止最简洁的代码?

非常感谢

【问题讨论】:

    标签: php events laravel laravel-5


    【解决方案1】:

    EventServiceProvider.php 中,在使用::class 表示法引用类时包括前导\

    protected $listener = [
        \App\Events\KitchenStored::class => [
          \App\Handlers\Events\AttachCurrentUserToKitchen::class,
        ],
    ];
    

    您还可以添加 use 语句并保持您的侦听器映射简短:

    use App\Events\KitchenStored;
    use App\Handlers\Events\AttachCurrentUserToKitchen;
    ...
    protected $listener = [
        KitchenStored::class => [
          AttachCurrentUserToKitchen:class,
        ],
    ];
    

    或者只使用字符串表示法:

    protected $listener = [
        'App\Events\KitchenStored' => [
          'App\Handlers\Events\AttachCurrentUserToKitchen',
        ],
    ];
    

    【讨论】:

    • 使用 ::class 表示法更好,因为自动补全,避免拼写错误。
    • @systemovich omg 是的...移动了一个监听器,它停止工作,除了这个之外,所有路径都被自动重构,花了很长时间才找到这个问题,因为它没有抛出错误
    • 似乎是一个很好的建议(我总是想避免使用字符串),但不幸的是并没有为我解决问题。
    【解决方案2】:

    如果您运行php artisan optimize,您的事件处理程序应该开始监听。

    感谢来自 larachat slack 频道的 mattstauffer。

    【讨论】:

    • 真的很愚蠢,但我通过确保在 EventServiceProvider 类中导入正确的类解决了我的问题。
    • 再一次,就像 composer dump-autoload 一样,这绝对是一个解决方案,尽管现在不是用户的解决方案!
    • 这没有帮助。 Laravel 7,使用事件广播事件(新事件)→ 正在准备阶段,但不在生产阶段。
    【解决方案3】:

    我跑了

    composer dumpautoload
    

    紧随其后

    php artisan clear-compiled
    

    然后我的事件开始触发。

    【讨论】:

    • 在非调试环境中,这肯定是原因。我完全同意!
    • 这对我有用。我试图将事件和侦听器添加到我正在编写的自定义包中。我在我的实际应用程序中开发了它们,但是当我将它们移到包中时,我不断收到听众的类未找到错误。这就像一个魅力!
    • 是的,有时是这样的:/
    • 不适合我。我的 staging 工作正常,但生产仍然不顺利。
    • 第二个命令对我有用,非常感谢。
    【解决方案4】:

    不要像我一样在本地缓存你的事件来测试一些东西,然后忘记清除那个缓存?

    php artisan event:clear
    

    【讨论】:

      【解决方案5】:

      确保您的 EventServiceProvider 正在调用父注册函数。

      public function register() {
         parent::register():
      }
      

      【讨论】:

        【解决方案6】:

        我遇到了类似的问题,我通过删除 vendor\compiled.php 文件来修复它。然后我再次运行“composer update”,现在处理程序按预期触发。

        【讨论】:

          【解决方案7】:

          对我来说,我遇到了一个问题,即我有多个侦听器来处理单个事件。在这种情况下,侦听器按顺序执行。但是,如果其中一个侦听器返回 false,则不会执行所有其他侦听器。

          【讨论】:

            【解决方案8】:

            这是一个较老的问题,但我遇到了同样的问题,对我来说,这是因为我已将我的新事件添加到服务提供商,但至关重要的是 我没有导入它。对于 2020 年遇到此问题的任何人,请检查您是否已导入该事件。

            【讨论】:

              猜你喜欢
              • 2012-04-15
              • 2011-09-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多