2015-09-02 3 views
0

У меня есть следующий код в моем методе AppServiceprovider::boot, который гарантирует, что я получаю электронное письмо всякий раз, когда что-либо регистрируется с предупреждением или уровнем серьезности.Лучшая практика: Где добавить электронную почту Ошибка Регистрация в приложении Laravel 5

$message = \Swift_Message::newInstance('An Error has Occurred in XXX') 
    ->setTo(env('ERROR_EMAIL_TO')) 
    ->setFrom(env('ERROR_EMAIL_FROM')) 
    ->setReplyTo(env('ERROR_EMAIL_REPLY_TO')) 
    ->setContentType('text/html'); 
$swiftMailer = \Mail::getSwiftMailer(); 
$handler = new SwiftMailerHandler($swiftMailer, $message, Logger::WARNING); 
$handler->setFormatter(new HtmlFormatter()); 
\Log::getMonolog()->pushHandler($handler); 

Но пока это работает, я не могу не чувствовать, что это не в том месте.

Где бы вы хотели добавить этот код к веб-сайту Laravel?

ответ

2

Как насчет использования промежуточного программного обеспечения? Я написал несколько промежуточных программ для регистрации всех запросов и ответов в прошлом для API-интерфейсов, которые могли бы так же легко отправлять электронные письма, чтобы информировать пользователя об ошибках (это было в значительной степени прецедентом, почему я его настроил).

Использование метода terminate() в вашем классе промежуточного программного обеспечения позволит вам выполнять логику после отправки ответа пользователю - поэтому ваши электронные письма не должны замедлять работу для конечного пользователя.

namespace App\Http\Middleware; 
use Closure; 

class LogRequestAndResponseMiddleware 
{ 
/** 
* Handle an incoming request. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Closure $next 
* @return mixed 
*/ 
public function handle($request, Closure $next) 
{ 
    return $next($request); 
} 

public function terminate($request, $response) 
{ 
    // Send out an e-mail to you here 
} 

Я думаю, что это может быть также позволит Вам хорошее время, чтобы реорганизовать код, который поможет перемещать логику за пределами промежуточного программного обеспечения и в свою область ответственности.

В данном случае я думаю, что в настоящее время я хочу получать информацию по электронной почте, но я могу в какой-то момент в будущем захотеть отправить событие через Websocket.

Поэтому, я бы обернуть логику, используя договор и реализовать его соответствующим образом:

interface ErrorNotificationContract 
{ 
    public function inform($user, $message) 
} 

class EmailErrorNotification implements ErrorNotificationContract 
{ 
    protected $mail; 

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

    public function inform($user, $message) 
    { 
     // Your send e-mail logic. 
    } 
} 

Вы можете зарегистрировать его с помощью поставщика услуг. Побочным эффектом является то, что вы получаете дополнительные преимущества:

  • Dependency Injection в EmailErrorNotification (лучше контролируемости)
  • Лучше развязаны код
  • Реализации, которые могут быть изменены очень легко - просто создать новый класс, реализует ErrorNotificationContract

В вашем промежуточном слое вы могли бы сделать:

public function terminate($request, $response) 
{ 
    // ... 

    $errorNotifier->inform('[email protected]', 'something bad happened'); 
} 
+0

У вас что-то на github или на ваш блог? Потому что это очень приятное решение! Где я могу найти что-то еще? –

 Смежные вопросы

  • Нет связанных вопросов^_^