@aston_ua

Как правильно сделать рендер в Laravel при использовании Redis?

Я отправляю данные из функции в Redis и в базу данных для уведомлений пользователям о статусе того действия, что они совершили. В базу данных я отправляю на хранение, а мой redis используется как проводник для отправки обновлений в сокеты. В принципе все работает почти так, как задумано.

Мне нужно сделать так:
действие 1 -> уведомление 1 -> действие 2 -> уведомление 2.


Но проблема в том, что когда я отправляю данные, я получаю следующее:
действие 1 -> ничего не происходит -> действие 2 -> уведомление действия #1 -> действие 3 -> уведомление действия #2.


То есть при первой отправке данных уведомление теряется. Как я могу это исправить?

Функция в Laravel:

$returnValue = [
    'user_id' => $this->user->id,
    'title' => 'Новое уведомление',
    'message' => 'Уведомление '.Request::get('operation').'',
    'status' => '1',
    'html' => view('includes.notifications', compact('user_notifications'))->render(),
]; 
$this->redis->publish(self::NEW_NOTIFICATION, json_encode($returnValue));
Notify::create(
    [
    'id' => $last_id + 1,
    'user_id' => $this->user->id,
    'title' => 'Новое уведомление,
    'message' => 'Уведомление '.Request::get('operation').'',
    'status' => '1'
    ]  
);


В бекенде nodejs я использую:

redisClient.subscribe('notify');
redisClient.subscribe('new.notify');
redisClient.on("message", function (channel, message) {
    if (channel == 'new.notify')
    {
        io.sockets.emit(channel, message);
    }
	if (channel == 'del.notify') 
	{
        io.sockets.emit(channel, message);
    }
});


new.notify - это тот канал, куда поступают новые уведомления.

В blade у меня уведомления выводятся так:

@foreach($user_notifications as $notify)
@if ($notify->status == 2)
<div class="notification"><svg class="notification__type-icon" rv-svg-use="'notification-' | add model:type"><use xlink:href="#notification-error"></use></svg>
@elseif ($notify->status == 1)
<div class="notification"><svg class="notification__type-icon" rv-svg-use="'notification-' | add model:type"><use xlink:href="#notification-success"></use></svg>
@endif
<div class="notification__content">
    <div class="notification__title">{{ $notify->title }}</div>
    <div class="notification__text">{!! $notify->message !!}</div>
    <div class="notification__date">{{ $notify->date }}</div>
</div>
@if ($notify->status == 2)
<svg width="100%" height="100%"><use xlink:href="#notification-remove"></use><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25" id="notification-error">
    <g fill="#E61414" fill-rule="nonzero">
        <path d="M12.46 0C5.59 0 0 5.59 0 12.46c0 6.87 5.59 12.458 12.46 12.458 6.87 0 12.458-5.589 12.458-12.459C24.918 5.59 19.33 0 12.46 0zm0 22.876c-5.745 0-10.418-4.673-10.418-10.417S6.715 2.043 12.46 2.043s10.417 4.672 10.417 10.416c0 5.744-4.673 10.417-10.417 10.417z"></path>
        <path d="M13.904 12.46l3.523-3.524a1.021 1.021 0 1 0-1.444-1.445l-3.524 3.524-3.523-3.524A1.021 1.021 0 0 0 7.49 8.935l3.524 3.524-3.524 3.524a1.021 1.021 0 0 0 1.444 1.444l3.524-3.524 3.524 3.524a1.019 1.019 0 0 0 1.444 0 1.021 1.021 0 0 0 0-1.444l-3.523-3.524z"></path>
    </g>
</svg></svg>
@elseif ($notify->status == 1)
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25" id="notification-success">
    <g fill="#82E614" fill-rule="nonzero">
        <path d="M12.46 0C5.59 0 0 5.59 0 12.46c0 6.87 5.59 12.458 12.46 12.458 6.87 0 12.458-5.589 12.458-12.459C24.918 5.59 19.33 0 12.46 0zm0 22.876c-5.745 0-10.418-4.673-10.418-10.417S6.715 2.043 12.46 2.043s10.417 4.672 10.417 10.416c0 5.744-4.673 10.417-10.417 10.417z"></path>
        <path d="M17.85 7.677l-7.398 7.398-3.383-3.382a1.021 1.021 0 0 0-1.444 1.444l4.104 4.104a1.018 1.018 0 0 0 1.445 0l8.12-8.12a1.021 1.021 0 0 0-1.445-1.444z"></path>
    </g>
</svg>
@endif
</div>
@endforeach


В JS сайта я использую:

.on('new.notify', function (data) {
    data = JSON.parse(data);
   $('#notifications').html(data.html);
    console.log(data);
})


Console.log(data) при первом действии в секции html выводит мне пустое значение:

5e836a8652036114737237.png
уже при следующем действии мне начинает рендерить шаблон и console.log показывает предыдущее значение в секции html.

И есть сам POST запрос в JS, который обрабатывает действие на кнопке:

$('.calc').click(function () {
        var operation = $(this).attr('data-type');
        $.post('/api/new', {operation: operation}, function (data) {
        });
    });


В чём может быть проблема? Неправильный вывод в JS, либо что? Как это можно исправить?
  • Вопрос задан
  • 101 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы