sonarrradarrplexorganizrnginxdashboardhtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelanding
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
5.1 KiB
181 lines
5.1 KiB
<?php
|
|
|
|
namespace Illuminate\Notifications;
|
|
|
|
use Ramsey\Uuid\Uuid;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
use Illuminate\Database\Eloquent\Collection as ModelCollection;
|
|
|
|
class NotificationSender
|
|
{
|
|
/**
|
|
* The notification manager instance.
|
|
*
|
|
* @var \Illuminate\Notifications\ChannelManager
|
|
*/
|
|
protected $manager;
|
|
|
|
/**
|
|
* The Bus dispatcher instance.
|
|
*
|
|
* @var \Illuminate\Contracts\Bus\Dispatcher
|
|
*/
|
|
protected $bus;
|
|
|
|
/**
|
|
* The event dispatcher.
|
|
*
|
|
* @var \Illuminate\Contracts\Events\Dispatcher
|
|
*/
|
|
protected $events;
|
|
|
|
/**
|
|
* Create a new notification sender instance.
|
|
*
|
|
* @param \Illuminate\Notifications\ChannelManager $manager
|
|
* @param \Illuminate\Contracts\Bus\Dispatcher $bus
|
|
* @param \Illuminate\Contracts\Events\Dispatcher $events
|
|
* @return void
|
|
*/
|
|
public function __construct($manager, $bus, $events)
|
|
{
|
|
$this->bus = $bus;
|
|
$this->events = $events;
|
|
$this->manager = $manager;
|
|
}
|
|
|
|
/**
|
|
* Send the given notification to the given notifiable entities.
|
|
*
|
|
* @param \Illuminate\Support\Collection|array|mixed $notifiables
|
|
* @param mixed $notification
|
|
* @return void
|
|
*/
|
|
public function send($notifiables, $notification)
|
|
{
|
|
$notifiables = $this->formatNotifiables($notifiables);
|
|
|
|
if ($notification instanceof ShouldQueue) {
|
|
return $this->queueNotification($notifiables, $notification);
|
|
}
|
|
|
|
return $this->sendNow($notifiables, $notification);
|
|
}
|
|
|
|
/**
|
|
* Send the given notification immediately.
|
|
*
|
|
* @param \Illuminate\Support\Collection|array|mixed $notifiables
|
|
* @param mixed $notification
|
|
* @param array $channels
|
|
* @return void
|
|
*/
|
|
public function sendNow($notifiables, $notification, array $channels = null)
|
|
{
|
|
$notifiables = $this->formatNotifiables($notifiables);
|
|
|
|
$original = clone $notification;
|
|
|
|
foreach ($notifiables as $notifiable) {
|
|
if (empty($viaChannels = $channels ?: $notification->via($notifiable))) {
|
|
continue;
|
|
}
|
|
|
|
$notificationId = Uuid::uuid4()->toString();
|
|
|
|
foreach ((array) $viaChannels as $channel) {
|
|
$this->sendToNotifiable($notifiable, $notificationId, clone $original, $channel);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Send the given notification to the given notifiable via a channel.
|
|
*
|
|
* @param mixed $notifiable
|
|
* @param string $id
|
|
* @param mixed $notification
|
|
* @param string $channel
|
|
* @return void
|
|
*/
|
|
protected function sendToNotifiable($notifiable, $id, $notification, $channel)
|
|
{
|
|
if (! $notification->id) {
|
|
$notification->id = $id;
|
|
}
|
|
|
|
if (! $this->shouldSendNotification($notifiable, $notification, $channel)) {
|
|
return;
|
|
}
|
|
|
|
$response = $this->manager->driver($channel)->send($notifiable, $notification);
|
|
|
|
$this->events->dispatch(
|
|
new Events\NotificationSent($notifiable, $notification, $channel, $response)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Determines if the notification can be sent.
|
|
*
|
|
* @param mixed $notifiable
|
|
* @param mixed $notification
|
|
* @param string $channel
|
|
* @return bool
|
|
*/
|
|
protected function shouldSendNotification($notifiable, $notification, $channel)
|
|
{
|
|
return $this->events->until(
|
|
new Events\NotificationSending($notifiable, $notification, $channel)
|
|
) !== false;
|
|
}
|
|
|
|
/**
|
|
* Queue the given notification instances.
|
|
*
|
|
* @param mixed $notifiables
|
|
* @param array[\Illuminate\Notifications\Channels\Notification] $notification
|
|
* @return void
|
|
*/
|
|
protected function queueNotification($notifiables, $notification)
|
|
{
|
|
$notifiables = $this->formatNotifiables($notifiables);
|
|
|
|
$original = clone $notification;
|
|
|
|
foreach ($notifiables as $notifiable) {
|
|
$notificationId = Uuid::uuid4()->toString();
|
|
|
|
foreach ($original->via($notifiable) as $channel) {
|
|
$notification = clone $original;
|
|
|
|
$notification->id = $notificationId;
|
|
|
|
$this->bus->dispatch(
|
|
(new SendQueuedNotifications($notifiable, $notification, [$channel]))
|
|
->onConnection($notification->connection)
|
|
->onQueue($notification->queue)
|
|
->delay($notification->delay)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Format the notifiables into a Collection / array if necessary.
|
|
*
|
|
* @param mixed $notifiables
|
|
* @return \Illuminate\Database\Eloquent\Collection|array
|
|
*/
|
|
protected function formatNotifiables($notifiables)
|
|
{
|
|
if (! $notifiables instanceof Collection && ! is_array($notifiables)) {
|
|
return $notifiables instanceof Model
|
|
? new ModelCollection([$notifiables]) : [$notifiables];
|
|
}
|
|
|
|
return $notifiables;
|
|
}
|
|
}
|
|
|