Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么我要在laravel中使用事件和侦听器_Php_Laravel_Events_Listener - Fatal编程技术网

Php 为什么我要在laravel中使用事件和侦听器

Php 为什么我要在laravel中使用事件和侦听器,php,laravel,events,listener,Php,Laravel,Events,Listener,我理解laravel中的事件和侦听器,但我不知道事件和普通函数之间有什么区别,这意味着如果我想发送邮件,为什么我应该使用事件,而我可以使用普通函数来发送邮件 换句话说,何时必须使用事件以及何时必须使用函数事件是一种为存储在应用程序其他位置的可重用逻辑组织触发器的方法 例如,假设您有一个注册用户的应用程序。注册用户时,您可能希望采取某些操作,例如: 给他们发一封欢迎邮件 更新统计数据库中的计数器 让他们注册一个邮件列表 功能性方法 您可以在控制器中使用这样的函数来实现这一点(参见示例中的优缺点)

我理解laravel中的事件和侦听器,但我不知道事件和普通函数之间有什么区别,这意味着如果我想发送邮件,为什么我应该使用事件,而我可以使用普通函数来发送邮件
换句话说,何时必须使用事件以及何时必须使用函数事件是一种为存储在应用程序其他位置的可重用逻辑组织触发器的方法

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

  • 给他们发一封欢迎邮件
  • 更新统计数据库中的计数器
  • 让他们注册一个邮件列表
  • 功能性方法

    您可以在控制器中使用这样的函数来实现这一点(参见示例中的优缺点)

    注册表控制器

    <?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)
        {
            ...
        }
    
        ...
    }
    
    <?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));
    
        }
    
        ...
    }
    
    用户已注册

    <?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;
        }
    }
    
    专业人士

    • 现在您有了一个
      userwasregated
      事件,您可以从应用程序中的任何位置调用它
    • 事件保证无论触发它的是什么,都会发生相同的操作
    • 如果需要添加新功能,只需创建一个新的侦听器并将其注册到事件中即可。工作完成了
    • 您的逻辑是分离的,现在注册控制器的责任大大减少了
    缺点

    • 如果您只使用了一次
      事件
      ,那么现在可以将逻辑扩展到多个文件中
    TLDR


    在简单的应用程序中,您可能只需要在单个控制器中进行函数编程。在更大更复杂的应用程序中,
    事件
    s和
    侦听器
    s往往是一个更好的选择

    以使测试应用程序更加困难。这是一个分离逻辑的好方法。邮件函数在一个类中,逻辑在另一个类中。您还可以在多个位置使用事件和侦听器,而无需复制整个函数。这句话的意思是:“谢谢,你帮了我很多。”
    <?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 ...
        }
    }