2015-04-13 2 views
0

Я смотрел this lesson и пытался выяснить, в какую директорию положить файл класса EmailNotifier, так как это Event.В чем разница между App Events и App Handlers Events в Laravel?

Я не знаю, принадлежит ли оно App\Events или App\Handlers\Events.

Это то, что я в настоящее время:

<?php namespace App\Mailers; 

use Illuminate\Mail\Mailer as Mail; 

abstract class Mailer { 

    private $mail; 

    function __construct(Mail $mail) 
    { 
     $this->mail = $mail; 
    } 

    public function sendTo($user, $subject, $view, $data) 
    { 
     $this->mail->queue($view, $data, function ($message) use ($user, $subject) 
     { 
      $message->to($user->email)->subject($subject); 
     }); 
    } 
} 

<?php namespace App\Mailers; 

use App\User; 

class UserMailer extends Mailer { 

    /** 
    * @param User $user 
    */ 
    public function sendWelcomeMessageTo(User $user) 
    { 
     $subject = 'Welcome To Backstage!'; 
     $view = 'emails.registeration.confirm'; 
     $data = []; 

     return $this->sendTo($user, $subject, $view, $data); 
    } 
} 

<?php namespace App\Handlers\Events; 

class EmailNotifier extends Event { 

    private $mailer; 

    public function __construct(UserMailer $mailer) 
    { 
     $this->mailer = $mailer; 
    } 

    public function whenUserHasRegistered(UserHasRegistered $event) 
    { 
     $this->mailer->sendWelcomeMessageTo($event->user); 
    } 
} 

<?php namespace App\Events; 

use App\Events\Event; 

use Illuminate\Queue\SerializesModels; 

class UserHasRegistered extends Event { 

    use SerializesModels; 

    /** 
    * Create a new event instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     // 
    } 

} 

ответ

1

Это больше дискреционного беспокойство. Обычно вы хотите классифицировать аналогичные объекты цели в одно и то же пространство имен. Handlers\Events звучит как место для размещения обработчиков событий, или, возможно, это место для событий, происходящих из обработчиков.

Похоже, что вы на правильном пути размещаете событие в пространстве имен Events. Конвенция и согласованность являются ключевыми. Это не имеет значения, каково конечное пространство имен, до тех пор, пока оно последовательное. ИМО более логичным подходом было бы иметь App\Event для всех ваших событий и потенциально подпространство имён оттуда для категорий событий. Обработчики были бы более понятны, если бы они были где-то вроде App\EventHandler и снова под именами, помещаемыми в группы по мере необходимости.

Таким образом, это совершенно очевидно для аутсайдера, которому, возможно, потребуется работать с вашим кодом в будущем. Это мои два цента, как и общая организационная структура.

С более глубоким контекстом в Laravel, как предполагает ссылка laracasts.com. Пространство имен App\Event предназначено для событий, которые, как вам кажется, являются EmailNotifier, где App\Handlers\Events обычно относится к обработчикам, подписчикам, слушателям, независимо от того, что вы хотите назвать.