繁体   English   中英

为什么我应该在Laravel中使用事件和侦听器

[英]Why should i use events and listener in laravel

我了解laravel中的事件和侦听器,但是我不知道事件和正常函数之间有什么区别,这意味着如果我想发送邮件,为什么我应该使用事件,而我可以使用正常函数来换句话说,什么时候必须使用事件以及何时必须使用函数

事件是为存储在应用程序其他位置的可重用逻辑组织触发器的一种方式。

例如,假设您有一个注册用户的应用程序。 注册用户后,您可能希望采取某些措施,例如:

  1. 给他们发送欢迎电子邮件
  2. 更新统计数据库中的计数器
  3. 注册他们以获取邮件列表

功能方法

您可以使用类似的功能在控制器中执行此操作(请参见示例中的优点和缺点)

RegisterController

<?php

namespace App\Http\Controllers\Auth;

class RegisterController extends Controller
{
    ...

    protected function create(array $data)
    {
        // Create user
        $user = User::create();

        // Send Welcome Email
        $this->sendWelcomeEmail($user);

        // Update statistics database
        $this->updateStatisticsDatabase($user);

        // Add them to the mailing list
        $this->addToMailingList($user);

    }

    protected function sendWelcomeEmail(User $user)
    {
        ...
    }

    protected function updateStatisticsDatabase(User $user)
    {
        ...
    }

    protected function addToMailingList(User $user)
    {
        ...
    }

    ...
}

优点

  • 这是自给自足的
  • 遵循简单

缺点

  • 单个控制器承担很多责任
  • 如果您在应用程序中的其他任何地方注册用户,则无论您在何处注册用户,都将需要重复每个操作。

事件/侦听器方法

或者,我们可以将此功能拆分为EventListener

RegisterController

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Events\UserWasRegistered;

class RegisterController extends Controller
{
    ...

    protected function create(array $data)
    {
        // Create user
        $user = User::create();

        // Emit Event
        event(new UserWasRegistered($user));

    }

    ...
}

UserWasRegistered

<?php

namespace App\Events;

use App\User;
use Illuminate\Queue\SerializesModels;

class UserWasRegistered
{
    use SerializesModels;

    public $user;

    /**
     * Create a new event instance.
     *
     * @param  \App\User  $user
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

SendWelcomeEmail

<?php

namespace App\Listeners;

use App\Events\UserWasRegistered;

class SendWelcomeEmail
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  \App\Events\UserWasRegistered$event
     * @return void
     */
    public function handle(UserWasRegistered $event)
    {
        // Send the welcome email ...
    }
}

优点

  • 现在,您有一个UserWasRegistered事件,可以从应用程序中的任何位置调用该事件。
  • 该事件保证无论触发什么,都将发生相同的动作
  • 如果您需要添加新功能,则只需创建一个新的侦听器并将其注册到事件中即可。 任务完成!
  • 您的逻辑是分开的,现在RegisterController职责大大减少了

缺点

  • 如果您仅使用一次Event ,那么现在您的逻辑分布在多个文件中

TLDR

在简单的应用程序上,您只需要在单个控制器中进行功能编程。 在更大,更复杂的应用程序中, EventListener往往是更好的选择

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM