raid/core-event

dev-main 2023-10-25 19:52 UTC

This package is auto-updated.

Last update: 2024-09-25 21:42:57 UTC


README

此包负责处理系统中所有事件。

安装

composer require raid/core-event

配置

php artisan core:publish-event

使用方法

class UserController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Request $request)
    {
        $user = User::create($request->only(['name', 'email', 'password']));
        
        // let's trigger the create event.
        User::events('create', $user);
        
        // or using the trigger method
        User::events()->trigger('create', $user);

        // using the facade
        Events::trigger('user.create', $user);
        
        // using the helper
        events()->trigger('user.create', $user);
    }
}

如何使用

让我们从我们的可事件化类 User 开始。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Raid\Core\Event\Traits\Event\Eventable;

class User extends Model
{
    use Eventable;
}

要定义可事件化类(例如:User 模型事件),我们有两种方法

  1. 定义 getEvents 方法。
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Raid\Core\Event\Traits\Event\Eventable;
use App\Events\CreateUserEvent;

class User extends Model
{
    use Eventable;
    
    /**
     * Get eventable events.
     */
    public static function getEvents(): array
    {
        return [
            // here we define our event classes.
            CreateUserEvent::class,
        ];
    }
}
  1. 定义 config/event.php 事件。
'events' => [
    // here we define our eventable class.
    User::class => [
        // here we define our event classes.
        CreateUserEvent::class,
    ],
], 

现在,让我们创建我们的事件类 CreateUserEvent

可以使用此命令创建事件类。

php artisan core:make-event CreateUserEvent

以下是事件类。

<?php

namespace App\Events;

use Raid\Core\Event\Events\Contracts\EventInterface;
use Raid\Core\Event\Events\Event;

class CreateUserEvent extends Event implements EventInterface
{
    /**
     * {@inheritdoc}
     */
    public const ACTION = '';

    /**
     * {@inheritdoc}
     */
    public const LISTENERS = [];
}

事件类必须实现 EventInterface 接口。

事件类必须扩展 Event 类。

事件类必须定义 ACTION 常量,即事件动作名称。

LISTENERS 常量是一个数组,包含将在事件触发时调用的监听器类。

现在,让我们创建我们的事件监听器 CreateUserListener

可以使用此命令创建事件监听器类。

php artisan core:make-listener CreateUserListener
<?php

namespace App\Listeners;

use Raid\Core\Event\Events\Contracts\EventListenerInterface;

class CreateUserListener implements EventListenerInterface
{
    /**
     * Initialize the listener.
     */
    public function init(): void
    {
    }

    /**
     * Handle the listener.
     */
    public function handle(): void
    {
    }
}

事件监听器类必须实现 EventListenerInterface 接口。

init 方法是事件监听器初始化时将被调用的方法。

handle 方法是事件触发时将被调用的方法。

让我们完成事件类和监听器类。

<?php

namespace App\Events;

use Raid\Core\Event\Events\Contracts\EventInterface;
use Raid\Core\Event\Events\Event;

class CreateUserEvent extends Event implements EventInterface
{
    /**
     * {@inheritdoc}
     */
    public const ACTION = 'create';

    /**
     * {@inheritdoc}
     */
    public const LISTENERS = [
        CreateUserListener::class,
    ];
}
<?php

namespace App\Listeners;

use App\Models\User;
use Raid\Core\Event\Events\Contracts\EventListenerInterface;

class CreateUserListener implements EventListenerInterface
{
    /**
     * Handle the listener.
     */
    public function handle(User $user): void
    {
        // here we can do many things with the event given arguments.
    }
}

现在,让我们使用其监听器触发事件。

<?php

namespace App\Http\Controllers;

use App\Models\User;

class UserController extends Controller
{
    /**
     * Invoke the controller method.
     */
    public function __invoke(Request $request)
    {
        $user = User::create($request->only(['name', 'email', 'password']));
    
        User::events()->trigger('create', $user);
    }
}

events 方法是一个静态方法,将从 Eventable 特性中调用。

trigger 方法是一个方法,将从触发动作相关的 EventsListeners 中调用。

这将调用与触发事件动作相关的每个监听器中的 handle 方法,而不调用 init 方法。

就是这样。

许可

MIT 许可证 (MIT)。请参阅 许可文件 以获取更多信息。

致谢

安全性

如果您发现任何与安全相关的问题,请通过电子邮件报告,而不是使用问题跟踪器。

关于 Raid

Raid 是由 Mohamed Khedr 创建的 PHP 框架,由 Mohamed Khedr 维护。

支持 Raid

Raid 是一个 MIT 许可的开源项目。这是一个独立项目,其持续发展得以实现。