web-dev-qa-db-ja.com

Laravel 5イベントハンドラが起動しない

それで、私は新しいLaravel 5イベント方法論を試しています。

私のリポジトリでは、イベント「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');
    }

}

これまでに最もクリーンなコードを使い続けることができるように、誰かがこのプロセスをよりよく説明できますか?

どうもありがとう

17
Ed Stephenson

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',
    ],
];
27
John Berberich

php artisan optimizeを実行すると、イベントハンドラーがリスニングを開始するはずです。

Larachat slackチャネルのmattstaufferの功績です。

17
Carter Fort

私は走った

composer dumpautoload

に続く

php artisan clear-compiled

その後、私のイベントが始まりました。

12
jb360

同様の問題があり、vendor\compiled.phpファイルを削除して修正しました。次に、「composer update」を再度実行すると、ハンドラーが期待どおりに起動します。

0
kururin