sistem acara
- acara dengar
- Jana acara & pendengar Tentukan pendengar
- Hentikan penyebaran Pendengar acara Beratur
- Sejak Tentukan sambungan baris gilir & nama baris gilir
- Kendalikan tugas yang gagal
- Edarkan acara
- Pelanggan acara
- Tulis pelanggan acara
- Pengenalan
- Daftar acara & pendengar
- Jana acara & pendengar
- Daftar acara secara manual
- Takrifkan pendengar
- Acara baris gilir pendengar
- Mengedarkan acara
Sistem acara
Daftar langganan acara Pengarang
app/Events
目录下,而这些事件类的监听器则存放在 app/Listeners
目录下。如果在你的应用中你没有看到这些目录,不用担心,它们会在你使用 Artisan 控制台命令生成事件与监听器的时候自动创建。
事件系统为应用各个方面的解耦提供了非常棒的方法,因为单个事件可以拥有多个互不依赖的监听器。举个例子,你可能希望每次订单发货时向用户推送一个 Slack 通知。你可以简单地发起一个可以被监听器接收并转化为 Slack 通知的 OrderShipped
事件,而不是将订单处理代码和 Slack 通知代码耦合在一起。
注册事件和监听器
Laravel 应用中的 EventServiceProvider
为注册所有的事件监听器提供了一个便利的场所。其中, listen
属性包含了所有事件 (键) 以及事件对应的监听器 (值) 的数组。当然,你可以根据应用的需要,添加多个事件到 listen
属性包含的数组中。举个例子,我们来添加一个 OrderShipped
Pengenalan kepada sistem acara
Acara Laravel menyediakan pelaksanaan pemerhati mudah yang boleh melanggan dan memantau pelbagai acara yang berlaku dalam aplikasi. Kelas acara biasanya disimpan dalam direktoriapp/Events
dan pendengar untuk kelas acara ini disimpan dalam direktori app/Listeners
. Jika anda tidak melihat direktori ini dalam aplikasi anda, jangan risau, ia akan dibuat secara automatik apabila anda menggunakan arahan konsol Artisan untuk menjana acara dan pendengar. Sistem acara menyediakan cara terbaik untuk memisahkan pelbagai aspek aplikasi, kerana satu acara boleh mempunyai berbilang pendengar yang bebas antara satu sama lain. Sebagai contoh, anda mungkin mahu menolak pemberitahuan Slack kepada pengguna anda setiap kali pesanan dihantar. Daripada menggabungkan kod pemprosesan pesanan anda dan kod pemberitahuan Slack bersama-sama, anda hanya boleh menaikkan acara OrderShipped
yang boleh diterima oleh pendengar dan ditukar menjadi pemberitahuan Slack. 🎜🎜🎜🎜listen
mengandungi tatasusunan semua peristiwa (kunci) dan pendengar (nilai) yang sepadan dengan peristiwa. Sudah tentu, anda boleh menambah berbilang acara pada tatasusunan yang terkandung dalam atribut listen
mengikut keperluan aplikasi anda. Sebagai contoh, mari tambah acara OrderShipped
: 🎜/** * 应用程序的事件监听器映射 * * @var array */ protected $listen = [ 'App\Events\OrderShipped' => [ 'App\Listeners\SendShipmentNotification', ], ];🎜🎜🎜🎜🎜🎜
Menjana Acara & Pendengar
Sudah tentu, membuat fail acara dan pendengar secara manual adalah menyusahkan. Di sini, anda hanya perlu menambah pendengar dan acara pada EventServiceProvider
dan kemudian gunakan perintah event:generate
. Perintah ini akan menjana semua acara dan pendengar yang disenaraikan dalam EventServiceProvider
. Sudah tentu, acara dan pendengar sedia ada akan kekal tidak berubah: EventServiceProvider
中,而后使用 event:generate
命令。这个命令会生成在 EventServiceProvider
中列出的所有事件和监听器。当然,已经存在的事件和监听器将保持不变:
php artisan event:generate
手动注册事件
通常,事件是在 EventServiceProvider
的 $listen
数组中注册;然而,你也可以在 EventServiceProvider
的 boot
方法中手动注册基于闭包的这些事件:
/** * 注册应用中的其它事件 * * @return void */ public function boot(){ parent::boot(); Event::listen('event.name', function ($foo, $bar) { // }); }
通配符事件监听器
你可以在注册监听器时使用 *
作为通配符参数,这样可以在同一个监听器上捕获多个事件。通配符监听器接收事件名作为其第一个参数,并将整个事件数据数组作为其第二个参数:
Event::listen('event.*', function ($eventName, array $data) { // });
定义事件
事件类是一个保存与事件相关信息的容器。例如,假设我们生成的 OrderShipped
事件接收一个 Eloquent ORM 对象:
<?php namespace App\Events; use App\Order; use Illuminate\Queue\SerializesModels; class OrderShipped{ use SerializesModels; public $order; /** * 创建一个事件实例。 * * @param \App\Order $order * @return void */ public function __construct(Order $order) { $this->order = $order; } }
如你所见,这个事件类中没有包含其它逻辑。它只是一个购买的 Order
的实例的容器。如果使用 PHP 的 serialize
函数序列化事件对象,事件使用的 SerializesModels
trait 将会优雅地序列化任何 Eloquent 模型。
定义监听器
接下来,让我们看一下例子中事件的监听器。事件监听器在 handle
方法中接收实例。 event:generate
命令会自动加载正确的事件类,并且在 handle
方法中加入事件的类型提示。在 handle
方法中,你可以执行任何必要的响应事件的操作:
<?php namespace App\Listeners; use App\Events\OrderShipped; class SendShipmentNotification{ /** * 创建事件监听器。 * * @return void */ public function __construct() { // } /** * 处理事件。 * * @param \App\Events\OrderShipped $event * @return void */ public function handle(OrderShipped $event) { // 使用 $event->order 来访问 order ... } }
{tip} 你的事件监听器也可以在构造函数中加入任何依赖关系的类型提示。所有的事件监听器都是通过 Laravel 的 服务容器 来解析的,因此所有的依赖都将会被自动注入。
停止事件传播
有时,你可以通过在监听器的 handle
方法中返回 false
<?php namespace App\Listeners; use App\Events\OrderShipped; use Illuminate\Contracts\Queue\ShouldQueue; class SendShipmentNotification implements ShouldQueue{ // }
Jika pendengar anda perlu melakukan tugas perlahan seperti menghantar e-mel atau membuat permintaan HTTP, anda boleh memilih untuk membuangnya ke baris gilir untuk diproses. Sebelum anda mula menggunakan pendengar baris gilir, pastikan anda boleh mengkonfigurasi baris gilir dan mulakan pendengar baris gilir pada pelayan atau persekitaran pembangunan setempat anda. Untuk menentukan pendengar untuk memulakan baris gilir, anda boleh menambah antara muka 就是这个!当这个监听器被事件调用时,事件调度器会自动使用 Laravel 的 队列系统。如果在队列中执行监听器时没有抛出异常,任务会在执行完成后自动从队列中删除。 如果你想要自定义事件监听器所使用的队列的连接和名称,你可以在监听器类中定义 如果你需要手动访问监听器下面队列任务的 有时事件监听器的队列任务可能会失败。如果监听器的队列任务超过了队列中定义的最大尝试次数,则会在监听器上调用 如果要分发事件,你可以将事件实例传递给辅助函数 Pelanggan acara ialah kelas yang boleh melanggan berbilang acara dalam diri mereka sendiri, iaitu, mereka boleh menentukan berbilang pengendali acara dalam satu kelas. Pelanggan harus menentukan kaedah 在编写完订阅者之后,就可以通过事件分发器对订阅者进行注册。你可以在 $listen
EventServiceProvider
namun, anda juga boleh mendaftarkannya dalam
EventServiceProvider
; but< Daftarkan acara berasaskan penutupan ini secara manual dalam kaedah /code>: 🎜<?php
namespace App\Listeners;
use App\Events\OrderShipped;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendShipmentNotification implements ShouldQueue{
/**
* The name of the connection the job should be sent to.
*
* @var string|null
*/
public $connection = 'sqs';
/**
* The name of the queue the job should be sent to.
*
* @var string|null
*/
public $queue = 'listeners';
/**
* The time (seconds) before the job should be processed.
*
* @var int
*/
public $delay = 60;
}
Pendengar acara wildcard
🎜Anda boleh mendaftarkan pendengar dalam Gunakan *
sebagai parameter kad bebas untuk menangkap berbilang acara pada pendengar yang sama. Pendengar kad bebas menerima nama acara sebagai argumen pertamanya dan keseluruhan tatasusunan data acara sebagai argumen kedua: 🎜<?php
namespace App\Listeners;
use App\Events\OrderShipped;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendShipmentNotification implements ShouldQueue{
use InteractsWithQueue;
/**
* 处理事件。
*
* @param \App\Events\OrderShipped $event
* @return void
*/
public function handle(OrderShipped $event)
{
if (true) {
$this->release(30);
}
}
}
🎜🎜🎜Tentukan acara
🎜Kelas acara ialah bekas yang menyimpan maklumat yang berkaitan dengan acara. Sebagai contoh, anggap bahawa acara OrderShipped
yang kami hasilkan menerima objek ORM Fasih: 🎜<?php
namespace App\Listeners;use App\Events\OrderShipped;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendShipmentNotification implements ShouldQueue{
use InteractsWithQueue;
/**
* 处理事件。
*
* @param \App\Events\OrderShipped $event
* @return void
*/
public function handle(OrderShipped $event)
{
//
}
/**
* 处理失败任务。
*
* @param \App\Events\OrderShipped $event
* @param \Exception $exception
* @return void
*/
public function failed(OrderShipped $event, $exception)
{
//
}
}
🎜Seperti yang anda lihat, tiada logik lain yang disertakan dalam kelas acara ini. Ia hanyalah bekas untuk contoh Pesanan
yang dibeli. Jika anda menggunakan fungsi serialize
PHP untuk mensirikan objek acara, sifat SerializesModels
yang digunakan oleh acara akan menyerikan mana-mana model Eloquent dengan anggun. 🎜🎜🎜🎜Mendefinisikan pendengar
🎜Seterusnya, mari kita lihat contoh Acara pendengar. Pendengar acara menerima kejadian dalam kaedah handle
. Perintah event:generate
akan memuatkan kelas acara yang betul secara automatik dan menambah pembayang jenis acara dalam kaedah handle
. Dalam kaedah handle
, anda boleh melakukan sebarang operasi yang diperlukan sebagai tindak balas kepada acara: 🎜<?php
namespace App\Http\Controllers;
use App\Order;use App\Events\OrderShipped;
use App\Http\Controllers\Controller;
class OrderController extends Controller{
/**
* 将传递过来的订单发货
*
* @param int $orderId
* @return Response
*/
public function ship($orderId)
{
$order = Order::findOrFail($orderId);
// 订单发货逻辑 ...
event(new OrderShipped($order));
}
}
🎜{tip} Pendengar acara anda juga boleh menambah petunjuk jenis untuk sebarang kebergantungan dalam pembina . Semua pendengar acara diselesaikan melalui bekas perkhidmatan Laravel, jadi semua kebergantungan akan disuntik secara automatik. 🎜
Hentikan penyebaran acara
🎜Kadangkala, anda boleh lulus kaedah handle
dalam pendengar Kembalikan false
untuk menghalang acara daripada diperoleh oleh pendengar lain. 🎜🎜🎜🎜🎜🎜🎜Barisan Pendengar Acara
ShouldQueue
pada kelas pendengar. Pendengar yang dijana oleh perintah Artisan event:generate
mempunyai antara muka ini diimport ke dalam ruang nama semasa, jadi anda boleh menggunakannya secara terus: ShouldQueue
接口。由 Artisan 命令 event:generate
生成的监听器已经将此接口导入到当前命名空间中,因此你可以直接使用:<?php
namespace App\Listeners;
class UserEventSubscriber{
/**
* 处理用户登录事件。
*/
public function onUserLogin($event) {}
/**
* 处理用户注销事件。
*/
public function onUserLogout($event) {}
/**
* 为订阅者注册监听器
*
* @param \Illuminate\Events\Dispatcher $events
*/
public function subscribe($events)
{
$events->listen(
'Illuminate\Auth\Events\Login',
'App\Listeners\UserEventSubscriber@onUserLogin'
);
$events->listen(
'Illuminate\Auth\Events\Logout',
'App\Listeners\UserEventSubscriber@onUserLogout'
);
}
}
自定义队列连接 & 队列名称
$connection
, $queue
或 $delay
属性:<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider{
/**
* 应用中事件监听器的映射。
*
* @var array
*/
protected $listen = [
//
];
/**
* 需要注册的订阅者类。
*
* @var array
*/
protected $subscribe = [
'App\Listeners\UserEventSubscriber',
];
}
手动访问队列
delete
和 release
方法,你可以通过使用 IlluminateQueueInteractsWithQueue
trait 来实现。这个 trait 会默认加载到生成的监听器中,并提供对这些方法的访问:处理失败任务
failed
方法。 failed
方法接收事件实例和导致失败的异常作为参数:分发事件
event
。该辅助函数将会把事件分发到所有该事件相应的已经注册了的监听器上。 event
rrreeeSambungan baris gilir tersuai & nama baris gilir
Jika anda ingin menyesuaikan sambungan dan nama baris gilir yang digunakan oleh pendengar acara, Anda boleh mentakrifkan atribut $connection
, $queue
atau $delay
dalam kelas pendengar: rrreeeAkses manual kepada baris gilir
padam tugasan baris gilir secara manual di bawah kaedah pendengar
dan release
, anda boleh mencapai ini dengan menggunakan ciri IlluminateQueueInteractsWithQueue
. Sifat ini dimuatkan ke dalam pendengar yang dijana secara lalai dan menyediakan akses kepada kaedah ini: Mengendalikan tugas yang gagal
Kadangkala tugas baris gilir pendengar acara mungkin gagal. Jika tugas beratur pendengar melebihi bilangan maksimum percubaan yang ditakrifkan dalam baris gilir, kaedah gagal
dipanggil pada pendengar. Kaedah gagal
menerima kejadian peristiwa dan pengecualian yang menyebabkan kegagalan sebagai parameter: rrreee🎜event
boleh digunakan secara global dan anda boleh memanggilnya di mana-mana sahaja dalam aplikasi: 🎜rrreee🎜🎜{tip} Semasa menguji, anda hanya perlu menegaskan bahawa acara tertentu dihantar tanpa benar-benar mencetuskannya pendengar. Pembantu ujian terbina dalam Laravel menjadikannya mudah. 🎜🎜🎜🎜🎜🎜🎜🎜🎜Pelanggan Acara🎜🎜🎜🎜🎜🎜🎜Menulis pelanggan acara
langgan
yang menerima contoh penghantar acara. Anda boleh mendaftarkan pendengar acara dengan memanggil kaedah dengar
pada penghantar acara tertentu: subscribe
方法,这个方法接收一个事件分发器实例。你可以调用给定事件分发器上的 listen
方法来注册事件监听器:注册事件订阅者
EventServiceProvider
中的 $subscribe
属性中注册订阅者。例如,让我们将 UserEventSubscriber
rrreee$subscribe
dalam EventServiceProvider
. Sebagai contoh, mari tambah UserEventSubscriber
pada senarai tatasusunan: 🎜rrreee🎜Artikel ini mula-mula muncul di tapak web 🎜LearnKu.com🎜. 🎜🎜Laman web PHP Cina