Laravelイベント使用心得

2413 ワード

最近プロジェクトをするのにちょうど「イベント」というものが使われているので、研究してみました(イベントにはいろいろな方法がありますが、ここでは一番よくあるものだけを紹介します)
1.app/Providers/EventServiceProviderの$listen[]に「AppEventsTestEvent'=>['AppListenersTestEventListener']と書く
2.php artisan event:generateの実行
3.このときEventsとListenerディレクトリの下に対応するTestEventとTestEventListenerファイルが生成されます(PS:EventsとListenerフレームワークはデフォルトではありません.コマンドを実行するとあります)
4.ここでは、イベントに必要なファイルが作成されています.TestEventListenerのhandle()メソッドは、イベントがトリガーされて実行されるメソッドです.つまり、イベントが出発すると、実行されるアクション(ビジネスロジック)がこのメソッドに書き込まれます.また、パラメータがTestEventの例、つまり、TestEventのpublic属性のものは、ここで使用できます.
5.どのようにしてイベントをトリガーしますか?簡単です.トリガーが必要な場所にevent(new TestEvent()を書けばいいです.イベントをトリガーしてhandle()の方法を自動的に実行します.ここまででほぼ終わりです.しかし、外部からhandle()のビジネスロジックにデータを伝えたい場合があります.どうすればいいですか.TestEvent()コンストラクタの変更:
class TestEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

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

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

こうしてevent(new TestEvent()ではevent(new TestEvent(‘私は通り抜けた文字列’)と書く.TestEventListenerのhandle(TestEvent$event)パラメータはTestEventインスタンスなので、$event->pで渡されたパラメータを取得できます.これで事件はすべておしまいだ
 
ここでlaravelのデザインにツッコミを入れたいのですが、ほとんどは優雅ですが、事件は本当にあまりなく、冗長でしょうが、やはり混乱しています.
1.名前が悪い、eventとListeners(イベントとリスナー)という名前が悪い、リスナーは何ですか?とても愚かです!実はリスナーは「イベント発生後、実行するアクション!」で、イベントとイベントを呼んだほうがいいと思います.イベントとイベントを呼んだほうがいいと思います.
2.ちょっと冗長ですが、なぜ2つ使わなければならないのでしょうかeventとListenersは、知らず知らずのうちに学習難帯を増やし、eventに直接「出発事件後に実行する動作」を書けばいいのではないでしょうか.Listenersの中のhandle($event)に書かなければなりません(phpの原因かもしれませんが、できません).
3.事件を実现する方法が多すぎて、これは良いことでも悪いことでもあります.このように多くの初心者は愚かで、目がくらくらして、どれを使うべきか分かりません.私はやはりpythonの考えが好きです“1つの事をして、1つの方法だけを使います”.
4.もう一つ、laravelの事件は私たちがよく言うclickのような事件とは同じではありません.簡単に言えば、clickイベントはユーザーがトリガーし、いつトリガーし、どのボタンがトリガーされるかは確定していません.どうせユーザーがトリガーし、実行するコードをバインドすればいいのです.しかしlaravelのイベントはそうではありません.その初志は実はコードのデカップリングのために使われています.イベントのトリガは私たちが計算したものです.あなたがどこでevent(new TestEvent()を呼び出して、どこでイベントをトリガしますか.(もちろんこれはデータベースのいくつかのcreating created updating updated saving savedイベントと区別されていますが、ここではあまり説明しないので、自分で研究する興味があります)