Как насчет использования промежуточного программного обеспечения? Я написал несколько промежуточных программ для регистрации всех запросов и ответов в прошлом для 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');
}
У вас что-то на github или на ваш блог? Потому что это очень приятное решение! Где я могу найти что-то еще? –