Реализация системы уведомлений Yii2

Я пытаюсь реализовать простую систему уведомлений в Yii2. У меня есть список записей, заполненных в ListView. Я хотел бы разрешить пользователям голосовать за эту запись. Только один раз за запись. Также Автор каждой записи должен быть уведомлен (что-то вроде новых входящих электронных писем) о том, кто проголосовал за его запись. Как проще всего реализовать это в Yii2? Спасибо за совет!


person Dmytro    schedule 05.03.2016    source источник
comment
Самый простой способ — использовать события. yiiframework.com/doc-2.0/guide-concept-events.html< /а>   -  person SiZE    schedule 05.03.2016
comment
Спасибо за ссылку. Как я понял, с помощью событий я могу получить и обработать данные от пользователя (это я также могу сделать с помощью контроллера/действия), но как уведомить пользователя о том, что он получил новое сообщение (новую запись в БД)? Есть ли событие, которое может вызвать толчок сервера? Или где я могу найти простое объяснение или пример того, как это работает?   -  person Dmytro    schedule 05.03.2016
comment
Знаете ли вы, как использовать события JS, такие как onclick и т. д.? Это тоже самое. Вы регистрируете событие, регистрируете обработчик события, запускаете это событие и обрабатываете свою собственную логику в обработчике. Это может быть отправка электронной почты, обновление базы данных, все, что вы хотите.   -  person SiZE    schedule 06.03.2016
comment
Редактирование..) Нажал Enter   -  person Dmytro    schedule 06.03.2016
comment
Представьте себе следующий случай. «Пользователь А» нажал кнопку, а «Пользователь Б» получил сообщение «нажал». Итак, логика должна быть следующей: - Инициировать событие после нажатия кнопки «Пользователь А». Обработчик событий вставит одну строку в БД. (Это понятно) - Создайте событие для уведомления «Пользователя Б». (Это я до сих пор не могу понять. Как отправить данные «Пользователю Б» без каких-либо действий с его стороны. Или «Пользователь Б» также должен периодически проверять БД с помощью Pjax в качестве примера?) P.S. В чем разница между событием, прикрепленным, например, к кнопке, и контроллером/действием для этой кнопки?   -  person Dmytro    schedule 06.03.2016


Ответы (1)


Только с php вы не можете этого сделать, вам нужно иметь js в какой-то момент.

Решение Во-первых, со стороны пользователя B вы продолжаете спрашивать сервер через определенное время (используя ajax), произошло ли что-нибудь (событие). Если он возвращает результат с этим ajax и обновляет страницу. Но опять же, это не очень хорошая практика.

Если вам действительно нужно обновление в реальном времени, вы можете использовать socket.io. Опять же, использование сокета php - плохая идея.

Итак, решение второе: yii2 + redis + nodejs + socket

redis будет осуществлять связь между yii2 и nodejs. Идея состоит в том, что если что-то (событие или обновление) произойдет, yii2 опубликует event с ассоциацией data с redis channel, а nodejs, который прослушивает этот канал, поймает это событие и отправит данные (или обновит) к клиенту с помощью сокета.

Вот учебник по чату в реальном времени с использованием yii2+redis+nodejs+socket.

person leninhasda    schedule 06.03.2016
comment
Спасибо за ссылку. Это очень полезно. Но каким образом я могу получить идентификатор нового подключенного клиента? Как лучше всего фильтровать сообщения (например, если мне нужно отправить сообщение одному конкретному пользователю)? Должен ли я создать новый канал для этого? Или я должен создать фильтр внутри сокета (notification.js согласно упомянутому примеру)? Я могу ПУБЛИКОВАТЬ на канал идентификаторы отправителя и целевого пользователя, но как получить пользователя ($thismodel->ID) внутри кода js сокета, чтобы проверить, является ли текущий пользователь реальной целью? - person Dmytro; 12.03.2016
comment
вы можете получить идентификатор сокета внутри этого io.on('connection', function (socket) { socket.id даст вам идентификатор, который вы должны каким-то образом сохранить, а затем при отправке сообщения пользователю вместо socket.emit используйте io.sockets.to(socketId).emit, где socketId< /b> — идентификатор сокета конкретного пользователя. - person leninhasda; 15.03.2016