reedware / laravel-events
在简单的配置文件中定义您所有的事件。
Requires
- php: ^7.1.3|^8.0
- laravel/framework: ^6.19|^7.0|^8.0
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^7.5|^8.0
This package is auto-updated.
Last update: 2024-09-23 01:39:34 UTC
README
此包允许您在简单的配置文件中定义所有事件。
介绍
Laravel的事件是一个非常棒的工具。然而,一旦您开始大量使用事件,通过服务提供者来管理所有内容可能会有些繁琐。虽然从Laravel 5.8开始就有事件发现(event discovery),但这并不总是解决整个问题。此包允许您在配置文件中定义监听器、订阅者和观察者。此外,实现允许您在注册方面更加宽松,缓存事件后没有性能成本。
安装
Composer
首先,开始安装此包。
composer require reedware/laravel-events
配置
接下来,您需要获取events.php
配置文件。您可以直接复制,或者发布它。
php artisan vendor:publish
服务提供者
最后,您需要修改您的服务提供者。您可以选择扩展包中的示例提供者,或者使用特质。
扩展服务提供者
<?php namespace App\Providers; use Reedware\LaravelEvents\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { }
使用特质代替
<?php namespace App\Providers; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Reedware\LaravelEvents\ConfiguredEvents; class EventServiceProvider extends ServiceProvider { use ConfiguredEvents; }
如果您已覆盖了默认的listens()
方法,请确保产生配置的事件
/** * Returns the events and handlers. * * @return array */ public function listens() { $myEventOverrides = [/* ... */]; return array_merge_recursive( $myEventOverrides, $this->configuredEvents() ); }
之后,您就可以开始配置您的事件了!
用法
此包提供四种类型的事件注册
- 事件/监听器映射
- 订阅者/事件映射
- 观察者/模型映射
- 模型/观察者映射
随着您深入了解,您会发现注册事件绑定不止一种方式。此包提供多种选择,以便您可以为您和您的应用程序做最有意义的事情。
事件/监听器映射
这是传统的“监听”数组,通常位于您的EventServerProvider
属性中。您可以列出每个事件及其监听器。
示例
'listen' => [ // When a user has registered... Illuminate\Auth\Events\Registered::class => [ // Send an email verification notification Illuminate\Auth\Listeners\SendEmailVerificationNotification::class ], ],
显式绑定
如果您的监听器不使用传统的handle
方法,您可以直接调用该方法,如下所示
'listen' => [ // When a user has registered... Illuminate\Auth\Events\Registered::class => [ [App\Listeners\MyCustomListener::class, 'handleRegistration'], // or 'App\Listeners\MyCustomListener@handleRegistration' ], ],
隐式绑定
如果您的替代方法以单词handle
开头(例如handleRegistration
),并接受类型提示的事件,则无需显式指定自定义方法
监听器
<?php namespace App\Listeners; use Illuminate\Auth\Events\Registered; class MyCustomListener { /** * Handles the specified registration event. * * @param \Illuminate\Auth\Events\Registered $event * * @return void */ public function handleRegistration(Registered $event) { // } }
配置
'listen' => [ // When a user has registered... Illuminate\Auth\Events\Registered::class => [ // Handle the event App\Listeners\MyCustomListener::class, ], ],
替代订阅者绑定
由于您可以通过隐式或显式绑定使用非handle
方法,因此您实际上可以在事件/监听器映射中注册您的订阅者。如果想要将订阅者列在每个相应的事件下,而不是列出所有已订阅的事件,这可能会很有意义。
示例
'listen' => [ // When a user has registered... Illuminate\Auth\Events\Registered::class => [ // Send a slack notification App\Listeners\SendSlackNotification::class, ], // When a user has logged out... Illuminate\Auth\Events\Logout::class => [ // Send a slack notification App\Listeners\SendSlackNotification::class, ], ],
订阅者/事件映射
当与订阅者一起工作时,通常将订阅的事件列在一起更有意义。在配置文件中列出订阅者时,它们不需要subscribe
方法。
配置
'subscribe' => [ // Log a security event... App\Listeners\LogSecurityEvent::class => [ // When a user provided incorrect credentials Illuminate\Auth\Events\Failed::class, // When a user has been locked out Illuminate\Auth\Events\Lockout::class, // When a user has reset their password Illuminate\Auth\Events\PasswordReset::class, ], ],
订阅者
<?php namespace App\Listeners; use Illuminate\Auth\Events\Failed; use Illuminate\Auth\Events\Lockout; use Illuminate\Auth\Events\PasswordReset; class LogSecurityEvent { /** * Handles failed login attempts. */ public function handleFailed(Failed $event) { // } /** * Handles too many login attempts. */ public function handleLockout(Lockout $event) { // } /** * Handles successful password resets. */ public function handlePasswordReset(PasswordReset $event) { // } }
请记住,即使在使用类型提示时,隐式绑定也需要方法以单词handle
开头。
提示:如果您计划始终为订阅者使用隐式绑定,请考虑使用事件发现!
显式绑定
与事件/监听器映射类似,您也可以使用显式绑定
'subscribe' => [ // Log a security event... App\Listeners\LogSecurityEvent::class => [ // When a user provided incorrect credentials [Illuminate\Auth\Events\Failed::class, 'failed'], // When a user has been locked out [Illuminate\Auth\Events\Lockout::class, 'lockout'], // When a user has reset their password 'Illuminate\Auth\Events\PasswordReset@reset', ], ],
观察者/模型映射
当完全使用时,观察者通常观察多个模型。在这种情况下,在观察者下列出模型更有意义。以下是如何配置观察者的示例
'observe' => [ // Track the creator for each of the following models... App\Observers\UserObserver::class => [ App\Models\Country::class, App\Models\Post::class, App\Models\State::class, App\Models\User::class, ] ],
该包完全支持自定义可观察对象,前提是它们作为属性或模型构建过程中注册。
模型/观察者映射
您可能更喜欢先列出模型,然后在它们下面描述观察者。这两种选项都提供,以便您根据自己的应用情况做出最合理的选择。以下是先列出模型的工作方式:
'models' => [ // Observe the user App\Models\User::class => [ App\Observers\UserObserver::class, ] ],
事件缓存
该包完全支持事件缓存。实际上,由于观察者是在底层注册的,如果您在应用程序中使用了大量观察者,您可能会看到显著的性能提升。
要缓存事件,运行event:cache
artisan命令。如果您需要清除事件缓存,可以运行event:clear
artisan命令。
事件发现
该包完全支持事件发现,并且不会与配置文件冲突。在注册过程中,配置的事件和发现的事件都会合并。
此外,事件配置的任何部分都可以完全省略。如果您决定为所有事件使用事件发现,并只想配置观察者,您可以无需问题地移除“listen”和“subscribe”数组。