簡體   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