Как реализовать в Laravel, если один пользователь регистрирует договор чтобы видел другой без перезагрузки страницы?

Для реализации данного функционала в Laravel вам потребуется использовать асинхронные запросы и технологию WebSocket.

Ниже я приведу пошаговую инструкцию по реализации данной функциональности:

Шаг 1: Установите необходимые пакеты
Для работы с асинхронными запросами и WebSocket в Laravel, вам потребуется установить несколько пакетов. Во-первых, нам понадобится пакет Laravel Echo Server, который позволит настроить сервер WebSocket. Во-вторых, пакет Laravel Echo, который предоставляет API для работы с WebSocket в фронтенде. Для установки пакетов выполните следующую команду:

npm install laravel-echo-server laravel-echo pusher-js

Шаг 2: Настройте Laravel Echo Server
После установки пакетов, вам необходимо настроить Laravel Echo Server. Создайте файл laravel-echo-server.json в корне вашего проекта и добавьте следующий код:

{
  "authHost": "http://localhost",
  "authEndpoint": "/broadcasting/auth",
  "clients": [],
  "database": "redis",
  "databaseConfig": {
    "redis": {},
    "sqlite": {
      "databasePath": "/database/laravel-echo-server.sqlite"
    }
  },
  "devMode": true,
  "host": null,
  "port": "6001",
  "protocol": "http",
  "socketio": {},
  "sslCertPath": "",
  "sslKeyPath": "",
  "sslOptions": {},
  "verifyAuthPath": "/broadcasting/auth",
  "verifyAuthServer": true,
  "websocket": {
    "port": 6001,
    "clients": []
  }
}

Настройте параметры authHost и verifyAuthPath в соответствии с вашей конфигурацией.

Шаг 3: Создайте события
В Laravel создайте события, которые будут использоваться для отправки обновлений другому пользователю. Например, вы можете создать событие ContractUpdated путем выполнения следующей команды:

php artisan make:event ContractUpdated

Отредактируйте файл события ContractUpdated.php для добавления необходимой информации.

Шаг 4: Создайте каналы
В Laravel создайте каналы, которые будут служить мостом между сервером WebSocket и фронтендом. Например, вы можете создать канал ContractChannel путем выполнения следующей команды:

php artisan make:channel ContractChannel

В файле канала ContractChannel.php определите метод broadcastOn, возвращающий имя канала в формате private-[user_id].

Шаг 5: Настройте авторизацию
Настройте авторизацию для каналов, чтобы обеспечить доступ только тем пользователям, у которых есть право видеть обновления. В файле routes/channels.php определите правила авторизации для каждого канала. Например:

Broadcast::channel('private-{user_id}', function ($user, $user_id) {
    return $user->id == $user_id;
});

Шаг 6: Отправьте событие
В вашем контроллере или сервисе вызовите метод event для отправки события другому пользователю. Например:

event(new ContractUpdated($contract));

Шаг 7: Обработайте событие в фронтенде
В фронтенде установите Laravel Echo и настройте его для обработки событий. Например, в файле resources/js/bootstrap.js добавьте следующий код:

import Echo from 'laravel-echo';

window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your-pusher-key',
    cluster: 'your-pusher-cluster',
    encrypted: true,
    auth: {
        headers: {
            Authorization: 'Bearer ' + 'your-api-token',
        },
    },
});

Затем, в нужном компоненте Vue.js, вы можете прослушивать события с помощью метода listen, например:

Echo.private('private-' + userId)
    .listen('ContractUpdated', (e) => {
        console.log(e);
        // Обновите интерфейс, чтобы показать обновленный договор
    });

Шаг 8: Запустите сервер Laravel Echo
Запустите сервер Laravel Echo, выполнив следующую команду:

laravel-echo-server start

После выполнения всех этих шагов, ваше приложение Laravel будет отправлять обновления договора другим пользователям без перезагрузки страницы.