reedware/laravel-events

在简单的配置文件中定义您所有的事件。

v1.0.2 2021-06-22 17:57 UTC

This package is auto-updated.

Last update: 2024-09-23 01:39:34 UTC


README

Latest Stable Version Laravel Version Build Status

此包允许您在简单的配置文件中定义所有事件。

介绍

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”数组。