Laravel L5.2中的字符串事件与类事件,哪个更好?

Laravel L5.2中的字符串事件与类事件,哪个更好?,laravel,events,Laravel,Events,根据,事件/侦听器对是通过类创建的。但是经过一些快速的实验之后,我发现您还可以使用字符串并完全跳过事件类,这样做更容易创建,更不容易出错(因为没有要创建的事件类),并且更具描述性 EventServiceProvider // Class protected $listen = [ 'App\Events\MyEvent' => [ 'App\Listeners\MyListener', ], ]; ... becomes ... // String /

根据,事件/侦听器对是通过类创建的。但是经过一些快速的实验之后,我发现您还可以使用字符串并完全跳过事件类,这样做更容易创建,更不容易出错(因为没有要创建的事件类),并且更具描述性

EventServiceProvider

// Class
protected $listen = [
    'App\Events\MyEvent' => [
        'App\Listeners\MyListener',
    ],
];

... becomes ...

// String
// Replace App\Events\MyEvent with a string which describes your event
protected $listen = [
    'eventaction' => [
        'App\Listeners\MyListener',
    ],
];
// Class
public function handle(MyEvent $event)
{
    // Do something
}

... becomes ...

// String
// Remove the data type in $event so it'll accept a string
public function handle($event)
{
    // Do something
}
使用上面的字符串版本意味着不需要创建文件
App\Events\MyEvent
。这样就少了一个需要担心的文件,而且事件的字符串而不是类更容易记住

App\Listeners\MyListener

// Class
protected $listen = [
    'App\Events\MyEvent' => [
        'App\Listeners\MyListener',
    ],
];

... becomes ...

// String
// Replace App\Events\MyEvent with a string which describes your event
protected $listen = [
    'eventaction' => [
        'App\Listeners\MyListener',
    ],
];
// Class
public function handle(MyEvent $event)
{
    // Do something
}

... becomes ...

// String
// Remove the data type in $event so it'll accept a string
public function handle($event)
{
    // Do something
}
触发事件的方式与仅在这次使用字符串标签的类相同

event('eventaction', [$event]);

我的问题是,是否有特定的实例应该使用类,而在其他实例上可以使用字符串?使用事件类(
MyEvent
)比使用字符串事件有什么额外的好处?

我不知道有任何特定的事件需要使用类。类只是使包含某些逻辑变得更容易一些。还可以使用构造函数将其他依赖项注入事件类。它们实际上只是用来包含任何监听器最终需要的任何方法/数据

请记住,一个事件可以有多个侦听器,每个侦听器可能需要来自事件类的不同数据。因此,如果您经常触发事件,那么在一个类中包含所有事件将比执行类似于

event('logout', [$param, $otherParam, $otherOtherParam]);

如果您添加了另一个侦听器,它需要事件中的另一个参数,那么您需要通过所有代码添加附加参数,如果您使用一个类,您只需要将其更改到该类中的一个位置。

我不知道有任何特定的事件需要使用一个类。类只是使包含某些逻辑变得更容易一些。还可以使用构造函数将其他依赖项注入事件类。它们实际上只是用来包含任何监听器最终需要的任何方法/数据

请记住,一个事件可以有多个侦听器,每个侦听器可能需要来自事件类的不同数据。因此,如果您经常触发事件,那么在一个类中包含所有事件将比执行类似于

event('logout', [$param, $otherParam, $otherOtherParam]);
如果您添加了另一个监听器,它需要事件中的另一个参数,那么您需要遍历所有代码来添加额外的参数,如果您使用一个类,您只需要将其更改到该类中的一个位置