Russian (Pусский) translation by Masha Kolesnikova (you can also view the original English article)
В этой статье мы рассмотрим систему уведомлений в веб-фреймворке Laravel. Система уведомлений в Laravel позволяет отправлять уведомления пользователям по различным каналам. Сегодня мы обсудим, как вы можете отправлять уведомления по почтовому каналу.
Основы уведомлений
Во время разработки приложений вам часто приходится уведомлять пользователей о различных изменениях состояния. Это может быть либо отправка уведомлений по электронной почте, когда статус заказа изменен, либо отправка СМС об их активности входа в целях безопасности. В частности, мы говорим о коротких сообщениях и просто даем представление об изменениях состояния.
Laravel уже предоставляет встроенный функционал, который помогает нам достичь чего-то подобного - уведомления. Фактически, Laravel делает отправку уведомлений пользователям максимально простой!
Красота этого подхода заключается в том, что он позволяет вам выбирать из разных каналов, по которым будут отправлены уведомления. Давайте быстро рассмотрим различные каналы уведомлений, поддерживаемые Laravel.
- Mail: уведомления будут отправляться пользователям в виде электронной почты.
- SMS: Как следует из названия, пользователи получат SMS-уведомления на своем телефоне.
- Slack: в этом случае уведомления будут отправляться по каналам Slack.
- Database: эта опция позволяет хранить уведомления в базе данных, если вы хотите создать пользовательский интерфейс для его отображения.
Среди различных каналов уведомлений мы будем использовать почтовый канал в нашем примере использования, который мы собираемся разработать в ходе этого учебника.
Фактически, это будет довольно простой случай использования, который позволяет пользователям нашего приложения отправлять сообщения каждому пользователю. Когда пользователи получат новое сообщение, мы сообщим им об этом событии, отправив им электронное письмо. Конечно, мы сделаем это, используя функцию уведомлений Laravel!
Создаем пользовательский класс уведомлений
Как мы обсуждали ранее, мы собираемся настроить приложение, которое позволяет пользователям нашего приложения отправлять сообщения друг другу. С другой стороны, мы будем уведомлять пользователей, когда они получат новое сообщение от других пользователей по электронной почте.
В этом разделе мы создадим файлы, необходимые для реализации нашего use-case.
Для начала давайте создадим модель Message
, в которой хранятся сообщения, отправленные пользователями друг другу.
$php artisan make:model Message --migration
Нам также нужно добавить несколько полей, например, to
, from
и message
в таблицу messages
. Итак, давайте сменим файл миграции перед запуском команды migrate
.
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateMessagesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('messages', function (Blueprint $table) { $table->increments('id'); $table->integer('from', FALSE, TRUE); $table->integer('to', FALSE, TRUE); $table->text('message'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('messages'); } }
Теперь давайте запустим команду migrate, которая создает таблицу сообщений в базе данных.
$php artisan migrate
Это должно создать таблицу messages
в базе данных.
Кроме того, убедитесь, что вы включили стандартную систему аутентификации Laravel, чтобы такие функции, как регистрация и вход, работали из коробки. Если вы не знаете, как это сделать, документация Laravel дает быстрое представление об этом.
Поскольку каждое уведомление в Laravel представлено отдельным классом, нам необходимо создать собственный класс уведомлений, который будет использоваться для уведомления пользователей. Давайте используем следующую команду artisan для создания настраиваемого класса уведомлений NewMessage.
$php artisan make:notification NewMessage
Это должно создать класс app/Notifications/NewMessage.php
, поэтому давайте заменим содержимое этого файла следующим содержимым.
<?php // app/Notifications/NewMessage.php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use App\User; class NewMessage extends Notification { use Queueable; public $fromUser; /** * Create a new notification instance. * * @return void */ public function __construct(User $user) { $this->fromUser = $user; } /** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Get the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { $subject = sprintf('%s: You\'ve got a new message from %s!', config('app.name'), $this->fromUser->name); $greeting = sprintf('Hello %s!', $notifiable->name); return (new MailMessage) ->subject($subject) ->greeting($greeting) ->salutation('Yours Faithfully') ->line('The introduction to the notification.') ->action('Notification Action', url('/')) ->line('Thank you for using our application!'); } /** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */ public function toArray($notifiable) { return [ // ]; } }
Поскольку мы будем использовать почтовый канал для отправки уведомлений пользователям, соответствующий метод via
будет настроен соответствующим образом. Таким образом, это метод, который позволяет вам настроить тип канала для уведомления.
Затем существует метод toMail
, который позволяет настраивать различные параметры электронной почты. Фактически метод toMail
должен возвращать экземпляр \Illuminate\Notifications\Messages\MailMessage
, и этот класс предоставляет полезные методы, которые позволяют настраивать параметры электронной почты.
Среди различных методов метод line
позволяет вам добавить одну строку в сообщение. С другой стороны, есть метод action
, который позволяет вам добавить кнопку вызова в сообщении.
Таким образом, вы можете форматировать сообщение, которое будет отправлено пользователям. Таким образом, вы должны настроить класс уведомления, пока используете почтовый канал для отправки уведомлений.
В конце вам нужно убедиться, что вы реализуете необходимые методы в соответствии с типом канала, сконфигурированным в методе via
. Например, если вы используете канал базы данных, который хранит уведомления в базе данных, вам не нужно настраивать метод toMail
; вместо этого вы должны реализовать метод toArray
, который форматирует данные, которые необходимо сохранить в базе данных.
Как отправлять уведомления
В предыдущем разделе мы создали класс уведомления, готовый отправлять уведомления. В этом разделе мы создадим файлы, демонстрирующие, как вы можете отправлять уведомления с помощью класса уведомлений NewMessage
.
Давайте создадим файл контроллера в файле app/Http/Controllers/NotificationController.php
со следующим содержимым.
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use App\Message; use App\User; use App\Notifications\NewMessage; use Illuminate\Support\Facades\Notification; class NotificationController extends Controller { public function __construct() { $this->middleware('auth'); } public function index() { // user 2 sends a message to user 1 $message = new Message; $message->setAttribute('from', 2); $message->setAttribute('to', 1); $message->setAttribute('message', 'Demo message from user 2 to user 1.'); $message->save(); $fromUser = User::find(2); $toUser = User::find(1); // send notification using the "user" model, when the user receives new message $toUser->notify(new NewMessage($fromUser)); // send notification using the "Notification" facade Notification::send($toUser, new NewMessage($fromUser)); } }
Конечно, вам нужно добавить соответствующий маршрут в файле routes/web.php
.
Route::get('notify/index', 'NotificationController@index');
Существует два способа, с помощью которых Laravel позволяет отправлять уведомления: используя либо уведомляемый объект, либо фасад уведомления.
Если класс модели сущности использует трейт Illuminate\Notifications\Notifiable
, вы можете вызвать метод notify
на этой модели. Класс App\User
реализует трейт Notifiable
и, таким образом, становится уведомляемой сущностью. С другой стороны, вы также можете использовать фасад Illuminate\Support\Facades\Notification
для отправки уведомлений пользователям.
Давайте рассмотрим метод index
контроллера.
В нашем случае мы сообщим пользователям, когда они получат новое сообщение. Поэтому мы попытались имитировать это поведение в методе index
.
Затем мы уведомили пользователя-получателя о новом сообщении, используя метод notify
объекта $toUser
, так как это notifiable сущность.
$toUser->notify(new NewMessage($fromUser));
Возможно, вы заметили, что мы также передаем объект $fromUser
в первом аргументе метода __construct
, так как мы хотим включить имя пользователя from в сообщение.
С другой стороны, если вы хотите имитировать его, используя фасад Notification
, это довольно легко сделать, используя следующий фрагмент.
Notification::send($toUser, new NewMessage($fromUser));
Как вы можете видеть, мы использовали метод send
фасада Notification для отправки уведомления пользователю.
Перейдите и откройте URL-адрес http://your-laravel-site-domain/notify/index в вашем браузере. Если вы еще не вошли в систему, вы будете перенаправлены на экран входа в систему. После входа в систему вы должны получить электронное письмо с уведомлением по адресу электронной почты пользователя 1
.
Вам может быть интересно, как система уведомлений обнаруживает адрес to
, если мы еще не настроили его. В этом случае система уведомлений пытается найти свойство email
в уведомляемом объекте. А класс объекта App\User
уже имеет это свойство, поскольку мы используем систему аутентификации Laravel.
Однако, если вы хотите переопределить это поведение и хотите использовать другое свойство, отличное от электронной почты, вам просто нужно определить следующий метод в вашем классе уведомлений.
public function routeNotificationForMail() { return $this->email_address; }
Теперь система уведомлений должна искать свойство email_address
вместо свойства email
для извлечения адреса to
.
И вот как следует использовать систему уведомлений в Laravel. На этом мы подходим к концу этой статьи!
Заключение
То, что мы изучили сегодня, является одной из полезных, но наименее обсуждаемых функций в Laravel. Она позволяет отправлять уведомления пользователям по разным каналам.
После краткого введения мы внедрили реальный пример, демонстрирующий, как отправлять уведомления по почтовому каналу. Фактически, это действительно удобно в случае отправки коротких сообщений об изменениях состояния в вашем приложении.
Для тех из вас, кто только начинает работать с Laravel или хочет расширить свои знания, создать сайт или приложение, у нас есть множество вещей, которые вы можете изучать на Envato Market.
Если у вас есть какие-либо вопросы или предложения, не стесняйтесь публиковать их, используя приведенный ниже канал!