[ Laravel 5.2 ドキュメント ] サービス -- イベント
1. はじめに
Laravel イベントはシンプルなオブザーバー パターンの実装を提供し、アプリケーションでイベントをサブスクライブして監視できるようにします。通常、イベント クラスは app/Events ディレクトリに保存され、リスナーは app/Listeners に保存されます。
2. イベント/リスナーの登録
Laravel 独自の EventServiceProvider は、イベント登録に便利な場所を提供します。 listen 属性には、イベント (キー) の配列と対応するリスナー (値) が含まれます。アプリケーションで必要な場合は、この配列に複数のイベントを追加できます。たとえば、PodcastWasPurchased イベントを追加してみましょう。
/** * 事件监听器映射 * * @var array */protected $listen = [ 'App\Events\PodcastWasPurchased' => [ 'App\Listeners\EmailPurchaseConfirmation', ],];
2.1 イベント/リスナー クラスの生成
もちろん、イベントとリスナーごとに手動でファイルを作成するのは面倒ですが、代わりに、次のように単純に追加できます。リスナーとイベントを EventServiceProvider に追加し、event:generate コマンドを使用します。このコマンドは、EventServiceProvider にリストされているすべてのイベントとリスナーを生成します。もちろん、既存のイベントとリスナーは作成されません。
php artisan event:generate
2.2 イベントを手動で登録する
さらに、イベントを EventServiceProvider の $listen 配列に登録する必要があります。イベント ファサードまたは IlluminateContractsEventsDispatcher コントラクトの特定の実装クラスを使用して、イベントをイベント ディスパッチャーとして手動で登録することもできます。
/** * Register any other events for your application. * * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */public function boot(DispatcherContract $events){ parent::boot($events); $events->listen('event.name', function ($foo, $bar) { // });}
イベント リスナーとしてワイルドカードを使用する
ワイルドカードを使用することもできます* リスナーを登録すると、同じリスナーを通じて複数のイベントをキャプチャできるようになります。ワイルドカード リスナーは、イベント データ配列全体をパラメーターとして受け取ります。
$events->listen('event.*', function (array $data) { //});
3. イベントを定義します
イベント クラスは、イベントを処理する単純なデータ コンテナーです。生成した PodcastWasPurchased イベントが Eloquent ORM オブジェクトを受信すると仮定した場合、 などの関連データ:
<?phpnamespace App\Events;use App\Podcast;use App\Events\Event;use Illuminate\Queue\SerializesModels;class PodcastWasPurchased extends Event{ use SerializesModels; public $podcast; /** * 创建新的事件实例 * * @param Podcast $podcast * @return void */ public function __construct(Podcast $podcast) { $this->podcast = $podcast; }}
ご覧のとおり、このイベント クラスには特定のロジックが含まれておらず、単なるコンテナーです。イベント オブジェクトがシリアル化されている場合、イベントで使用される SerializesModelstrait は PHP のシリアライズ関数を使用してすべての Eloquent モデルをシリアル化します。
4. リスナーを定義します
次に、イベント リスナーはハンドル メソッドのイベント インスタンスを受け取ります。 generate コマンドは、適切なイベント クラスとタイプ ヒント イベントをハンドル メソッドに自動的にインポートします。ハンドル メソッド内で、イベントに応答して必要なロジックを実行できます。
<?phpnamespace App\Listeners;use App\Events\PodcastWasPurchased;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Contracts\Queue\ShouldQueue;class EmailPurchaseConfirmation{ /** * 创建事件监听器 * * @return void */ public function __construct() { // } /** * 处理事件 * * @param PodcastWasPurchased $event * @return void */ public function handle(PodcastWasPurchased $event) { // Access the podcast using $event->podcast... }}
イベント リスナーは、コンストラクターで必要な依存関係をタイプヒントで指定することもできます。すべてのイベント リスナーはサービス コンテナーを通じて解決されるため、依存関係は自動的に挿入されます。
use Illuminate\Contracts\Mail\Mailer;public function __construct(Mailer $mailer){ $this->mailer = $mailer;}
Stopイベントが伝播し続けるのを防ぎます
他のリスナーへのイベントの伝播を停止したい場合があります。リスナーのハンドル メソッドから false を返すことでこれを行うことができます。
イベント リスナー キュー
イベント リスナーをキューに入れる必要がありますか?これほど簡単なことはありません。リスナー クラスに ShouldQueue インターフェイスを実装するだけです。Artisan コマンドのevent:generate によって生成されたリスナー クラスはすでに現在のネームスペースにインポートされているので、すぐに使用できます。 :
<?phpnamespace App\Listeners;use App\Events\PodcastWasPurchased;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Contracts\Queue\ShouldQueue;class EmailPurchaseConfirmation implements ShouldQueue{ //}
それはとても簡単です。リスナーがイベントによって呼び出されるとき、Laravel のキュー システムを使用して、キュー ディスパッチャを通じて自動的にキューに入れられます。キューを介してリスナーを実行するときに例外がスローされなかった場合、キュー タスクは実行完了後に自動的に削除されます。
キューへの手動アクセス
基になるキュー タスクの削除メソッドと解放メソッドに手動でアクセスする必要がある場合、生成されたリスナーにデフォルトでインポートされる IlluminateQueueInteractsWithQueuetrait により、次の 2 つのメソッドへのアクセスが提供されます。
<?phpnamespace App\Listeners;use App\Events\PodcastWasPurchased;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Contracts\Queue\ShouldQueue;class EmailPurchaseConfirmation implements ShouldQueue{ use InteractsWithQueue; public function handle(PodcastWasPurchased $event) { if (true) { $this->release(30); } }}
5. イベントのトリガー
イベントをトリガーするには、Event ファサードを使用して、fire メソッドにイベント インスタンスを渡します。コントローラー:
<?phpnamespace App\Http\Controllers;use Event;use App\Podcast;use App\Events\PodcastWasPurchased;use App\Http\Controllers\Controller;class UserController extends Controller{ /** * 显示指定用户属性 * * @param int $userId * @param int $podcastId * @return Response */ public function purchasePodcast($userId, $podcastId) { $podcast = Podcast::findOrFail($podcastId); // Purchase podcast logic... Event::fire(new PodcastWasPurchased($podcast)); }}
さらに、グローバル補助関数イベントを使用してイベントをトリガーすることもできます:
event(new PodcastWasPurchased($podcast));
6. events
多くの最新の Web アプリケーションでは、リアルタイム更新のユーザー インターフェイスを実装するために Web ソケットが使用されています。サーバー上で一部のデータが更新されると、通常、WebSocket 接続を介してメッセージがクライアントに送信され、処理されます。
このようなアプリケーションの構築を支援するために、Laravel では WebSocket 接続を介してイベントを簡単にブロードキャストできるようにしています。 Laravel イベントをブロードキャストすると、サーバー側とクライアント側の JavaScript フレームワーク間で同じイベント名を共有できます。
6.1 設定
すべてのイベント ブロードキャスト設定オプションは、config/broadcasting.php 設定ファイルに保存されます。 Laravel は、複数のブロードキャスト ドライバー (Pusher、Redis、ローカル開発およびデバッグ用のロギング ドライバー) をサポートしています。各ドライバーには構成例があります。
ブロードキャストの予備知識
イベント ブロードキャストには次の 2 つの依存関係が必要です:
- プッシャー: Pusher/pusher-php-server ~2.0
- Redis : predis/predis ~1.0
キューの準備知識
在开始介绍广播事件之前,还需要配置并运行一个队列监听器。所有事件广播都通过队列任务来完成以便应用的响应时间不受影响。
6.2 将事件标记为广播
要告诉 Laravel 给定事件应该被广播,需要在事件类上实现 Illuminate\Contracts\Broadcasting\ShouldBroadcast接口。 ShouldBroadcast接口要求你实现一个方法: broadcastOn。该方法应该返回事件广播“频道”名称数组:
<?phpnamespace App\Events;use App\User;use App\Events\Event;use Illuminate\Queue\SerializesModels;use Illuminate\Contracts\Broadcasting\ShouldBroadcast;class ServerCreated extends Event implements ShouldBroadcast{ use SerializesModels; public $user; /** * 创建新的事件实例 * * @return void */ public function __construct(User $user) { $this->user = $user; } /** * 获取事件广播频道 * * @return array */ public function broadcastOn() { return ['user.'.$this->user->id]; }}
然后,你只需要和正常一样触发该事件,事件被触发后,一个队列任务将通过指定广播驱动自动广播该事件。
6.3 广播数据
如果某个事件被广播,其所有的 public属性都会按照事件负载自动序列化和广播,从而允许你从 JavaScript 中访问所有 public数据,因此,举个例子,如果你的事件有一个单独的包含 Eloquent 模型的 $user属性,广播负载定义如下:
{ "user": { "id": 1, "name": "Jonathan Banks" ... }}
然而,如果你希望对广播负载有更加细粒度的控制,可以添加 broadcastWith方法到事件,该方法应该返回你想要通过事件广播的数组数据:
/** * 获取广播数据 * * @return array */public function broadcastWith(){ return ['user' => $this->user->id];}
6.4 自定义事件广播
自定义事件名
默认情况下,广播事件名就是事件类名,因此,如果事件的类名是 App\Events\ServerCreated,对应的广播事件名就是 App\Events\ServerCreated,你可以通过事件类上的 broadcastAs方法自定义广播事件名:
/** * 获取广播事件名称 * * @return string */public function broadcastAs(){ return 'app.server-created';}
自定义队列
默认情况下,每个被广播的事件都位于配置文件 queue.php中定义的默认队列连接中的默认队列中,你可以通过事件类的 onQueue方法自定义广播事件的队列名称。该方法会返回你期望使用的队列名:
/** * 设置事件所在队列的名称 * * @return string */public function onQueue(){ return 'your-queue-name';}
6.5 消费事件广播
Pusher
你可以通过 Pusher 的 JavaScript SDK 方便地使用 Pusher驱动消费事件广播。例如,让我们从之前的例子中消费 App\Events\ServerCreated事件:
this.pusher = new Pusher('pusher-key');this.pusherChannel = this.pusher.subscribe('user.' + USER_ID);this.pusherChannel.bind('App\\Events\\ServerCreated', function(message) { console.log(message.user);});
Redis
如果你在使用 Redis 广播,你将需要编写自己的 Redis pub/sub 消费者来接收消息并使用自己选择的 websocket 技术将其进行广播。例如,你可以选择使用 Node 编写的流行的 Socket.io库。
使用 Node 库 socket.io和 ioredis,你可以快速编写事件广播发布所有广播事件:
var app = require('http').createServer(handler);var io = require('socket.io')(app);var Redis = require('ioredis');var redis = new Redis();app.listen(6001, function() { console.log('Server is running!');});function handler(req, res) { res.writeHead(200); res.end('');}io.on('connection', function(socket) { //});redis.psubscribe('*', function(err, count) { //});redis.on('pmessage', function(subscribed, channel, message) { message = JSON.parse(message); io.emit(channel + ':' + message.event, message.data);});
7、事件订阅者
事件订阅者是指那些在类本身中订阅到多个事件的类,从而允许你在单个类中定义一些事件处理器。订阅者应该定义一个 subscribe方法,该方法中传入一个事件分发器实例:
<?phpnamespace App\Listeners;class UserEventListener{ /** * 处理用户登录事件 */ public function onUserLogin($event) {} /** * 处理用户退出事件 */ public function onUserLogout($event) {} /** * 为订阅者注册监听器 * * @param Illuminate\Events\Dispatcher $events * @return array */ public function subscribe($events) { $events->listen( 'App\Events\UserLoggedIn', 'App\Listeners\UserEventListener@onUserLogin' ); $events->listen( 'App\Events\UserLoggedOut', 'App\Listeners\UserEventListener@onUserLogout' ); }}
注册一个事件订阅者
订阅者被定义后,可以通过事件分发器进行注册,你可以使用 EventServiceProvider上的 $subcribe属性来注册订阅者。例如,让我们添加 UserEventListener:
<?phpnamespace App\Providers;use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;class EventServiceProvider extends ServiceProvider{ /** * 事件监听器映射数组 * * @var array */ protected $listen = [ // ]; /** * 要注册的订阅者 * * @var array */ protected $subscribe = [ 'App\Listeners\UserEventListener', ];}

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。
