Laravel의 Exception을 Slack으로 알림

15744 단어 슬랙PHP라라벨

개요



Laravel의 통지와 예외 처리의 공부를 위해서 구현해 보았습니다.

Notification에 관한 기사는 다수 있어, 공식 문서에서도 해설되고 있습니다만, 비망록으로서 간단한 흐름을 남겨 둡니다.

환경


  • Laravel 6.0
  • PHP 7.2

  • 사전 준비



    Guzzle 및 slack-notification-channel 설치
    $ composer install guzzlehttp/guzzle
    $ composer install laravel/slack-notification-channel
    

    Slack의 WebhookURL 얻기



    이번에는 env의 값을 config를 통해 사용합니다.
    webhookURL 취득 절차에 대해서는 생략합니다 ...

    config\slack.php
    return [
        'name' => env('SLACK_NAME'),
        'channel' => env('SLACK_CHANNEL'),
        'webhook_url' => env('SLACK_WEBHOOK_URL'),
    ];
    

    알림용 클래스 만들기



    일단 slack에 메시지를 보낼 수 있도록 구현합니다.
    초기 상태에서는 메일 송신이 디폴트가 되어 있으므로, slack용으로 변경해 줍니다.

    App\Notifications\Slack.php;
    <?php
    
    namespace App\Notifications;
    
    use Exception;
    use Illuminate\Bus\Queueable;
    use Illuminate\Notifications\Notification;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Notifications\Messages\MailMessage;
    use Illuminate\Notifications\Messages\SlackMessage;
    
    class Slack extends Notification
    {
        use Queueable;
    
        protected $name;
        protected $channnel;
        protected $content;
    
    
        /**
         * Create a new notification instance.
         *
         * @return void
         */
        public function __construct($message)
        {
            $this->name = config(slack.name);
            $this->channel = config(slack.channnel);
            $this->content = $message;
        }
    
        /**
         * Get the notification's delivery channels.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function via($notifiable)
        {
            return ['slack'];
        }
    
        /**
         * Get the array representation of the notification.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function toArray($notifiable)
        {
            return [
                //
            ];
        }
    
        /**
         * @param $notifiable
         * @return $this
         */
        public function toSlack($notifiable)
        {
            return (new SlackMessage)
                ->from($this->name)
                ->to($this->channel)
                ->content($this->content);
        }
    }
    

    생성자로 message를 받아 toSlack()로 그대로 송신하는 심플한 처리입니다.
    알림을 전달하는 채널을 slack로 만들기 위해 via() 안을 'slack'로 변경합니다.

    슬랙 알림을 위한 경로 만들기



    App\Service\Slack\SlackNotifiable.php
    <?php
    
    namespace App\Service\Slack;
    
    use Illuminate\Notifications\Notifiable;
    use App\Notifications\SlackNotification;
    use Exception;
    use Illuminate\Notifications\RoutesNotifications;
    
    class SlackNotifiable
    {
      use Notifiable;
    
      protected function routeNotificationForSlack()
      {
        return config('slack.webhook_url');
      }
    }
    

    실제로 Slack 알림을 루트하기 위해 routeNotificationForSlack()을 정의하고 WebhookURL을 반환합니다.
    Notifiable 트레이트를 읽고 notify()로 알림을 보낼 수 있습니다.

    이제 Slack에게 메시지를 보낼 준비가 괜찮습니다!

    예외 처리에 알림 포함



    Laravel의 에러 핸들링은 기본적으로 app\Exceptions\Handler.php가 담당하고 있습니다.
    거친 흐름으로는
  • report ()에서 예외를 잡습니다.
  • 부모 클래스인 Illuminate\Foundation\Exceptions\Handler.php에서 render 응답을 위한 조건 분기
    로그인 오류, 유효성 검사 오류 등 ...
  • render()로 응답을 반환합니다.

  • 이번에는 예외 감지시 알림을 보내고 싶으므로 report()를 편집합니다.

    App\ExceptionsHandler.php
    public function report(Exception $exception)
        {
            $slackHook = new SlackNotifiable();
            $slackHook->notify(new Slack($exception));
            parent::report($exception);
        }
    

    SlackNotifiable의 인스턴스를 작성해, notify() 메소드를 실행하는 것으로 통지를 보내고 있습니다.
    인수에 캐치 한 예외 $exception 를 건네주고 있습니다.

    Slack 알림용 클래스 수정



    마지막으로 App\Notifications\Slack.php에서 예외 내용을 알리도록 수정합니다.

    App\Notifications\Slack.php;
    <?php
    
    namespace App\Notifications;
    
    use Exception;
    use Illuminate\Bus\Queueable;
    use Illuminate\Notifications\Notification;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Notifications\Messages\MailMessage;
    use Illuminate\Notifications\Messages\SlackMessage;
    
    class Slack extends Notification
    {
        use Queueable;
    
        protected $name;
        protected $channnel;
        protected $exception;
    
    
        /**
         * Create a new notification instance.
         *
         * @return void
         */
        public function __construct(Exception $e)
        {
            $this->name = config(slack.name);
            $this->channel = config(slack.channnel);
            $this->exception = $e;
        }
    
        /**
         * Get the notification's delivery channels.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function via($notifiable)
        {
            return ['slack'];
        }
    
        /**
         * Get the array representation of the notification.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function toArray($notifiable)
        {
            return [
                //
            ];
        }
        /**
         * @param $notifiable
         * @return $this
         */
        public function toSlack($notifiable)
        {
            $exception = $this->exception;
    
            return (new SlackMessage)
                ->from($this->name)
                ->to($this->channel)
                ->error()
                ->content('エラーを検知しました')
                ->attachment(function ($attachment) use ($exception) {
                    $attachment
                        ->title(get_class($exception))
                        ->content($exception->getMessage());
                });
        }
    }
    

    생성자에서 Exception을 받도록 수정하고 있습니다.

    이제 오류 내용을 Slack에서 확인할 수 있습니다!


    결론



    끝까지 읽어 주셔서 감사합니다.
    이르지 못하는 점 등 있으면, 코멘트에서 지적해 주시면 고맙습니다 ...

    라라벨의 통지 처리를 이해하는데 좋은 공부가 되었습니다.
    다음은 큐라든가 사용한 비동기 처리도 해보고 싶다.

    참고 기사


  • h tps // t 샤마. 하테나 bぉg. 코 m / 엔 트리 / ぁらゔ ぇ l-s ぁ
  • h tps:// 퀵했다. 작은 m/kd9951/있어 MS/b1bc C4666976 그림 c90dc
  • 좋은 웹페이지 즐겨찾기