master

laravel/framework

Last updated at: 29/12/2023 09:22

BroadcastableModelEventOccurred.php

TLDR

This file, BroadcastableModelEventOccurred.php, is a class that implements the ShouldBroadcast interface. It is used to handle broadcast events for model events in Laravel's Eloquent ORM. The class contains methods to define the model instance, event name, channels to broadcast on, and other related functionality.

Methods

__construct($model, $event)

This method is the constructor of the class. It accepts a Model instance and the name of the event as parameters.

broadcastOn()

This method returns the channels the event should be broadcast on. It checks if there are any custom channels defined and returns them. If not, it calls the broadcastOn method on the model instance to retrieve the channels.

broadcastAs()

This method returns the name the event should be broadcasted as. It checks if the model has a custom broadcastAs method and returns its value if it exists. Otherwise, it generates a default name based on the model's class name and the event name.

broadcastWith()

This method returns the data that should be sent with the broadcasted event. It checks if the model has a custom broadcastWith method and returns its value if it exists. Otherwise, it returns null.

onChannels(array $channels)

This method allows manually specifying the channels the event should be broadcast on.

shouldBroadcastNow()

This method determines if the event should be broadcast synchronously. It returns true if the event is a "deleted" event and the model does not have a bootSoftDeletes method.

event()

This method returns the name of the event.

Classes

<?php

namespace Illuminate\Database\Eloquent;

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;

class BroadcastableModelEventOccurred implements ShouldBroadcast
{
    use InteractsWithSockets, SerializesModels;

    /**
     * The model instance corresponding to the event.
     *
     * @var \Illuminate\Database\Eloquent\Model
     */
    public $model;

    /**
     * The event name (created, updated, etc.).
     *
     * @var string
     */
    protected $event;

    /**
     * The channels that the event should be broadcast on.
     *
     * @var array
     */
    protected $channels = [];

    /**
     * The queue connection that should be used to queue the broadcast job.
     *
     * @var string
     */
    public $connection;

    /**
     * The queue that should be used to queue the broadcast job.
     *
     * @var string
     */
    public $queue;

    /**
     * Indicates whether the job should be dispatched after all database transactions have committed.
     *
     * @var bool|null
     */
    public $afterCommit;

    /**
     * Create a new event instance.
     *
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @param  string  $event
     * @return void
     */
    public function __construct($model, $event)
    {
        $this->model = $model;
        $this->event = $event;
    }

    /**
     * The channels the event should broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        $channels = empty($this->channels)
                ? ($this->model->broadcastOn($this->event) ?: [])
                : $this->channels;

        return collect($channels)->map(function ($channel) {
            return $channel instanceof Model ? new PrivateChannel($channel) : $channel;
        })->all();
    }

    /**
     * The name the event should broadcast as.
     *
     * @return string
     */
    public function broadcastAs()
    {
        $default = class_basename($this->model).ucfirst($this->event);

        return method_exists($this->model, 'broadcastAs')
                ? ($this->model->broadcastAs($this->event) ?: $default)
                : $default;
    }

    /**
     * Get the data that should be sent with the broadcasted event.
     *
     * @return array|null
     */
    public function broadcastWith()
    {
        return method_exists($this->model, 'broadcastWith')
            ? $this->model->broadcastWith($this->event)
            : null;
    }

    /**
     * Manually specify the channels the event should broadcast on.
     *
     * @param  array  $channels
     * @return $this
     */
    public function onChannels(array $channels)
    {
        $this->channels = $channels;

        return $this;
    }

    /**
     * Determine if the event should be broadcast synchronously.
     *
     * @return bool
     */
    public function shouldBroadcastNow()
    {
        return $this->event === 'deleted' &&
               ! method_exists($this->model, 'bootSoftDeletes');
    }

    /**
     * Get the event name.
     *
     * @return string
     */
    public function event()
    {
        return $this->event;
    }
}