В этой серии мы узнали о каналах от Pusher , платформы, которая позволяет вам предоставлять своим пользователям бесперебойную работу в режиме реального времени, которую они хотят.
Каналы присутствия основаны на безопасности, обеспечиваемой частными каналами, но они дают преимущество в знании того, какие пользователи подписаны и подключены к этому каналу. Самое приятное то, насколько легко внедрить и использовать каналы присутствия, и еще проще, если вы уже настроили свое приложение для использования частных каналов. В этом посте вы узнаете, как использовать каналы присутствия.
Еще лучшее приложение для чата
Наше приложение для чата в настоящее время использует частный канал для мгновенного обмена данными между клиентом и сервером. Поэтому настройка нашего приложения на использование канала присутствия будет чрезвычайно простой. Начнем с серверного приложения.
Модификация Сервера
Чтобы использовать частный канал, мы настроили конечную точку, чтобы обеспечить аутентификацию пользователя в нашем приложении. Эта конечная точка выполняет метод authorizeUser()
ChannelsController
и вызывает метод socket_auth()
библиотеки Pusher для проверки подлинности пользователя. Чтобы использовать канал присутствия, нам нужно изменить authorizeUser()
для вызова методаsence_auth presence_auth()
библиотеки Pusher, например:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public function authorizeUser(Request $request) {
if (!Auth::check()) {
return new Response(‘Forbidden’, 403);
}
$presenceData = [‘name’ => Auth::user()->name];
echo $this->pusher->presence_auth(
$request->input(‘channel_name’),
$request->input(‘socket_id’),
Auth::user()->id,
$presenceData
);
}
|
Но изменение имени метода — это только первая модификация; мы также должны предоставитьsence_auth presence_auth()
уникальный идентификатор пользователя и любую дополнительную информацию о пользователе, которую мы хотим предоставить. Приведенный выше код сохраняет эти дополнительные пользовательские данные в переменной $presenceData
senceData и передает их в качестве последнего аргументаsence_auth presence_auth()
.
Кроме того, мы должны изменить метод sendMessage()
. Первое изменение — название канала. Как и со всеми другими нашими именами, мы должны добавить префикс имени канала, чтобы обозначить тип канала, который мы хотим использовать: presence-
в данном случае, как показано в следующем коде.
1
|
$this->pusher->trigger(‘presence-chat’, ‘send-message’, $data);
|
Мы также можем изменить данные, которые мы отправляем вместе с событием — вместо указания имени пользователя, инициировавшего событие, мы можем включить идентификатор пользователя.
1
|
$data[‘user’] = Auth::user()->id;
|
Поскольку мы будем использовать канал присутствия, мы можем искать имена пользователей на клиенте, и это небольшое изменение уменьшит размер данных, передаваемых по сети.
Смена клиента
Канальный объект клиента содержит все, что нам нужно для работы с подписанным каналом, и запрос пользовательских данных не является исключением. У нашего объекта channel
есть свойство, называемое members
которое мы можем использовать для получения информации о конкретном пользователе. Мы будем использовать этот объект в обработчике события send-message
, например так:
1
2
3
4
5
6
7
|
this.channel.bind(‘send-message’, (data) => {
let user = this.channel.members.get(data.user);
this.messages.push({
message: data.message,
user: user.info.name
});
});
|
Здесь мы вызываем this.channels.members.get()
и передаем идентификатор пользователя (помните, что наше серверное приложение теперь предоставляет идентификатор вместо имени). Этот метод возвращает объект с info
свойством, и этот info
объект содержит всю дополнительную информацию, которую мы предоставили в переменной $presenceData
senceData в методе authorizeUser()
на сервере. Таким образом, в приведенном выше коде мы получаем имя пользователя с помощью user.info.name
.
Мы также можем изменить метод trigger()
включив в него информацию о пользователе, который инициировал событие тревоги клиента. Чтобы получить данные об участнике, вошедшем в систему в данный момент, вы используете свойство me
, как показано в следующем коде:
1
2
3
4
5
6
7
|
trigger(eventName, message) {
this.channel.trigger(eventName, {
message,
user: this.channel.members.me
});
}
|
В этом коде мы добавляем свойство user
к полезной нагрузке события и устанавливаем его для объекта пользователя вошедшего в систему пользователя. Это означает, что мы можем изменить обработчик события client-send-alarm
чтобы включить имя пользователя в сообщение о тревоге, например так:
1
2
3
|
this.channel.bind(‘client-send-alarm’, (data) =>
alert(`${data.user.info.name}: ${data.message}`)
);
|
Здесь мы используем data.user.info.name
для доступа к имени пользователя, чтобы мы могли видеть, какой пользователь отправил сигнал тревоги, как показано здесь:
Вывод
Использование каналов присутствия не только обеспечивает вашему приложению повышенную безопасность анонимного канала, но также дает вам возможность запрашивать пользовательские данные для пользователей, которые подписываются на канал. С каналами от Pusher невероятно легко добавить безопасное общение в режиме реального времени и многофункциональность в ваши приложения.