http = $http; } /** * Send the given notification. * * @param mixed $notifiable * @param \Illuminate\Notifications\Notification $notification * @return \Psr\Http\Message\ResponseInterface */ public function send($notifiable, Notification $notification) { if (! $url = $notifiable->routeNotificationFor('slack')) { return; } $this->http->post($url, $this->buildJsonPayload( $notification->toSlack($notifiable) )); } /** * Build up a JSON payload for the Slack webhook. * * @param \Illuminate\Notifications\Messages\SlackMessage $message * @return array */ protected function buildJsonPayload(SlackMessage $message) { $optionalFields = array_filter([ 'channel' => data_get($message, 'channel'), 'icon_emoji' => data_get($message, 'icon'), 'icon_url' => data_get($message, 'image'), 'link_names' => data_get($message, 'linkNames'), 'unfurl_links' => data_get($message, 'unfurlLinks'), 'unfurl_media' => data_get($message, 'unfurlMedia'), 'username' => data_get($message, 'username'), ]); return array_merge([ 'json' => array_merge([ 'text' => $message->content, 'attachments' => $this->attachments($message), ], $optionalFields), ], $message->http); } /** * Format the message's attachments. * * @param \Illuminate\Notifications\Messages\SlackMessage $message * @return array */ protected function attachments(SlackMessage $message) { return collect($message->attachments)->map(function ($attachment) use ($message) { return array_filter([ 'author_icon' => $attachment->authorIcon, 'author_link' => $attachment->authorLink, 'author_name' => $attachment->authorName, 'color' => $attachment->color ?: $message->color(), 'fallback' => $attachment->fallback, 'fields' => $this->fields($attachment), 'footer' => $attachment->footer, 'footer_icon' => $attachment->footerIcon, 'image_url' => $attachment->imageUrl, 'mrkdwn_in' => $attachment->markdown, 'text' => $attachment->content, 'thumb_url' => $attachment->thumbUrl, 'title' => $attachment->title, 'title_link' => $attachment->url, 'ts' => $attachment->timestamp, ]); })->all(); } /** * Format the attachment's fields. * * @param \Illuminate\Notifications\Messages\SlackAttachment $attachment * @return array */ protected function fields(SlackAttachment $attachment) { return collect($attachment->fields)->map(function ($value, $key) { if ($value instanceof SlackAttachmentField) { return $value->toArray(); } return ['title' => $key, 'value' => $value, 'short' => true]; })->values()->all(); } }