От автора: в этой статье мы рассмотрим систему уведомлений в веб-среде Laravel. Система позволяет отправлять уведомления Laravel пользователям по различным каналам. Мы рассмотрим, как вы можете отправлять уведомления по электронной почте.
Основные принципы использования уведомлений
Во время разработки приложений вам часто приходится реализовывать уведомления пользователей о различных изменениях состояния. Это может быть либо отправка уведомлений по электронной почте, когда изменен статус заказа, либо отправка СМС об их активности входа в целях безопасности. В данном случае мы говорим о коротких сообщениях, которые просто дают представление об изменениях состояния.
Laravel предоставляет встроенную функцию, которая помогает нам достичь чего-то подобного. Фактически, она делает опыт отправки уведомлений пользователям довольно крутым и приятным!
Преимущество этого подхода заключается в том, что он позволяет выбирать из разных каналов, через которые можно отправлять уведомления. Давайте вкратце рассмотрим различные каналы уведомлений, поддерживаемые Laravel.
Mail: уведомления будут отправляться пользователям в виде электронных писем.
SMS: Как следует из названия, пользователи получат SMS-уведомления на свой телефон.
Slack: в этом случае уведомления будут отправляться по каналам Slack.
Database: эта опция позволяет хранить уведомления в базе данных, если вы хотите создать пользовательский интерфейс для их отображения.
В нашем примере мы будем использовать канал электронной почты, который и собираемся построить в этом руководстве.
Фактически, это будет довольно простой случай использования, который позволяет пользователям приложения отправлять сообщения друг другу. Когда пользователи получаю новое сообщение в папке «Входящие», мы сообщим им об этом событии, отправив электронное письмо. Конечно, мы сделаем это, используя функцию уведомлений Laravel!
Создание пользовательского класса уведомлений
Как было сказано, мы собираемся настроить приложение, которое позволяет пользователям отправлять сообщения друг другу. С другой стороны, мы будем уведомлять пользователей по электронной почте, когда они получат новое сообщение от других пользователей.
В этом разделе мы создадим файлы, необходимые для реализации данного кейса. Для начала давайте создадим модель сообщения, в которой хранятся сообщения, отправленные пользователями друг другу.
$php artisan make:model Message --migration
Нам также нужно добавить в таблицу messages несколько полей, например, to , from и message. Итак, давайте изменим файл миграции перед тем, как использовать команду migrate.
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateMessagesTable extends Migration { /** * Запускаем миграции. * * @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(); }); } /** * Обратные миграции. * * @return void */ public function down() { Schema::dropIfExists('messages'); } }
Теперь давайте запустим команду migrate, которая создает в базе данных таблицу сообщений.
$php artisan migrate
В результате в базе данных должна быть создана таблица messages. Кроме того, в первую очередь убедитесь, что вы включили стандартную систему аутентификации Laravel, чтобы такие функции, как регистрация и аутентификация, работали из коробки. Если вы не знаете, как это сделать, обратитесь к документации Laravel.
Поскольку каждое уведомление в Laravel представлено отдельным классом, нам необходимо создать собственный класс уведомлений, который будет использоваться для уведомления пользователей. Давайте используем следующую команду артисана, чтобы создать пользовательский класс уведомлений — 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; /** * Создаем новый экземпляр уведомления. * * @return void */ public function __construct(User $user) { $this->fromUser = $user; } /** * Получаем канал доставки уведомлений. * * @param mixed $notifiable * @return array */ public function via($notifiable) { return ['mail']; } /** * Получаем представление электронного письма для уведомления. * * @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!'); } /** * Получаем массив представления уведомления. * * @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() { // пользователь 2 отправляет уведомление пользователю 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); // отправляем уведомление с помощью модели "user", когда пользователь получил новое сообщение $toUser->notify(new NewMessage($fromUser)); // отправляем уведомление с помощью фасада "Notification" Notification::send($toUser, new NewMessage($fromUser)); } }
Естественно, вам нужно добавить связанный маршрут в файл routes/web.php.
Route::get('notify/index', 'NotificationController@index');
Существует два способа, с помощью которых Laravel позволяет отправлять уведомления: используя либо уведомляемый объект, либо фасад Notification.
Если класс модели объекта использует признак Illuminate\Notifications\Notifiable, вы можете вызвать в этой модели метод notify. Класс App\User реализует признак Notifiable и, таким образом, становится уведомляемым объектом. С другой стороны, вы также можете использовать для отправки уведомлений пользователям фасад Illuminate\Support\Facades\Notification.
Давайте рассмотрим метод контроллера index.
В нашем случае мы сообщаем пользователям, когда они получат новое сообщение. Поэтому в первую очередь мы попытались имитировать это поведение в методе index.
Затем мы уведомляем пользователя-получателя о новом сообщении, используя метод уведомления объекта $toUser, так как это уведомляемый объект.
$toUser->notify(new NewMessage($fromUser));
Возможно, вы заметили, что мы также передаем объект $fromUser в первом аргументе метода __construct, так как мы хотим включить в сообщение имя пользователя.
С другой стороны, если вы хотите имитировать это поведение, используя фасад Notification, это довольно легко сделать, используя следующий фрагмент кода.
Notification::send($toUser, new NewMessage($fromUser));
Как вы можете видеть, мы использовали для отправки уведомления пользователю метод фасада Notification send.
Перейдите в браузере по URL-адресу http://your-laravel-site-domain/notify/index. Если вы еще не вошли в систему, вы будете перенаправлены в панель входа в систему. После входа в систему вы должны получить электронное письмо с уведомлением на адрес электронной почты, прикрепленный к пользователю 1.
Вам может быть интересно, как система уведомлений обнаруживает адрес, если мы еще не настроили его. В этом случае система уведомлений пытается найти свойство email в уведомляемом объекте. И класс объекта App \ User уже содержит это свойство, поскольку мы используем систему аутентификации Laravel по умолчанию.
Однако, если вы хотите переопределить это поведение и использовать другое свойство, отличное от email, вам просто нужно определить следующий метод в классе уведомления.
public function routeNotificationForMail() { return $this->email_address; }
Теперь система уведомлений для извлечения адреса должна искать свойство email_address вместо свойства email.
Именно так вы можете использовать систему уведомлений Laravel. Это подводит нас к концу статьи!
Заключение
То, что мы изучили сегодня, является одной из полезных, но наименее обсуждаемых функций Laravel — уведомления. Она позволяет отправлять уведомления пользователям через разные каналы.
После краткого введения мы реализовали реальный пример, иллюстрирующий, как отправлять уведомления по электронной почте. На практике это действительно удобно в случае отправки коротких сообщений об изменениях состояния в вашем приложении.
Автор: Sajal Soni
Источник: https://code.tutsplus.com/
Редакция: Команда webformyself.