Статьи

Уведомления в Laravel

В этой статье мы собираемся исследовать систему уведомлений в веб-фреймворке Laravel. Система уведомлений в Laravel позволяет отправлять уведомления пользователям по разным каналам. Сегодня мы обсудим, как вы можете отправлять уведомления по почтовому каналу.

Во время разработки приложения вам часто нужно уведомлять пользователей о различных изменениях состояния. Это может быть либо отправка уведомлений по электронной почте при изменении статуса заказа, либо отправка SMS-сообщения об активности входа в систему в целях безопасности. В частности, речь идет о коротких сообщениях, которые просто дают представление об изменениях состояния.

Laravel уже предоставляет встроенную функцию, которая помогает нам достичь чего-то похожего — уведомлений. Фактически, это делает отправку уведомлений пользователям легким и увлекательным занятием!

Прелесть такого подхода в том, что он позволяет выбирать из разных каналов, на которые будут отправляться уведомления. Давайте быстро пройдемся по различным каналам уведомлений, поддерживаемым Laravel.

  • Почта: уведомления будут отправлены пользователям в виде электронных писем.
  • SMS: как следует из названия, пользователи будут получать SMS-уведомления на свой телефон.
  • Slack: в этом случае уведомления будут отправляться по каналам Slack.
  • База данных: эта опция позволяет вам хранить уведомления в базе данных, если вы хотите создать пользовательский интерфейс для их отображения.

Среди различных каналов уведомлений мы будем использовать почтовый канал в нашем примере сценария использования, который мы собираемся разработать в ходе этого урока.

Фактически, это будет довольно простой сценарий использования, который позволит пользователям нашего приложения отправлять сообщения каждому пользователю. Когда пользователи получат новое сообщение в своем почтовом ящике, мы уведомим их об этом событии, отправив им электронное письмо. Конечно, мы сделаем это с помощью функции уведомлений Laravel!

Как мы уже говорили ранее, мы собираемся настроить приложение, которое позволяет пользователям нашего приложения отправлять сообщения друг другу. С другой стороны, мы будем уведомлять пользователей, когда они получат новое сообщение от других пользователей по электронной почте.

В этом разделе мы создадим необходимые файлы, необходимые для реализации искомого варианта использования.

Для начала давайте создадим модель Message которой хранятся сообщения, отправляемые пользователями друг другу.

1
$php artisan make:model Message —migration

Нам также нужно добавить несколько полей, таких как, from и message в таблицу messages . Итак, давайте изменим файл миграции перед запуском команды migrate .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?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, которая создает таблицу сообщений в базе данных.

1
$php artisan migrate

Это должно создать таблицу messages в базе данных.

Кроме того, убедитесь, что вы в первую очередь включили систему аутентификации Laravel по умолчанию, чтобы такие функции, как регистрация и вход в систему, работали из коробки. Если вы не уверены, как это сделать, документация по Laravel поможет вам быстро это понять.

Поскольку каждое уведомление в Laravel представлено отдельным классом, нам нужно создать собственный класс уведомлений, который будет использоваться для уведомления пользователей. Давайте используем следующую команду для создания пользовательского класса уведомлений — NewMessage.

1
$php artisan make:notification NewMessage

Это должно создать класс app/Notifications/NewMessage.php , поэтому давайте заменим содержимое этого файла следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?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 уведомлений NewMessage .

Давайте создадим файл контроллера в app/Http/Controllers/NotificationController.php со следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?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 .

1
Route::get(‘notify/index’, ‘NotificationController@index’);

Есть два способа, которыми Laravel позволяет отправлять уведомления: используя либо уведомляемую сущность, либо фасад уведомлений.

Если класс модели сущности использует черту Illuminate\Notifications\Notifiable , то вы можете вызвать метод Illuminate\Notifications\Notifiable этой модели. Класс App\User реализует признак Notifiable и, таким образом, он становится уведомляемым объектом. С другой стороны, вы также можете использовать Illuminate\Support\Facades\Notification Facade для отправки уведомлений пользователям.

Давайте рассмотрим метод index контроллера.

В нашем случае мы будем уведомлять пользователей, когда они получают новое сообщение. Итак, мы попытались имитировать это поведение в методе index .

Затем мы уведомили пользователя-получателя о новом сообщении, используя метод $toUser объекта $toUser , так как это уведомляемый объект.

1
$toUser->notify(new NewMessage($fromUser));

Возможно, вы заметили, что мы также $fromUser объект $fromUser в первом аргументе метода __construct , поскольку мы хотим включить имя пользователя from в сообщение.

С другой стороны, если вы хотите имитировать его, используя фасад Notification , это довольно легко сделать с помощью следующего фрагмента.

1
Notification::send($toUser, new NewMessage($fromUser));

Как видите, мы использовали метод send фасада Notification для отправки уведомления пользователю.

Перейдите и откройте URL-адрес http: // your-laravel-site-domain / notify / index в вашем браузере. Если вы еще не вошли в систему, вы будете перенаправлены на экран входа в систему. После того, как вы вошли в систему, вы должны получить уведомление по электронной почте на адрес электронной почты, который прикреплен к пользователю 1 .

Вам может быть интересно, как система уведомлений обнаруживает адрес, если мы еще нигде не настроили его. В этом случае система уведомлений пытается найти свойство email в уведомляемом объекте. И класс объектов App\User уже имеет это свойство, поскольку мы используем систему аутентификации Laravel по умолчанию.

Однако, если вы хотите переопределить это поведение и хотите использовать другое свойство, отличное от электронной почты, вам просто нужно определить следующий метод в своем классе уведомлений.

1
2
3
4
public function routeNotificationForMail()
{
    return $this->email_address;
}

Теперь система уведомлений должна искать свойство email_address вместо свойства email для получения адреса.

И вот как использовать систему уведомлений в Laravel. Это подводит нас к концу этой статьи!

Сегодня мы рассмотрели одну из полезных, но наименее обсуждаемых функций Laravel — уведомления. Позволяет отправлять уведомления пользователям по разным каналам.

После быстрого ознакомления мы реализовали пример из реальной жизни, демонстрирующий, как отправлять уведомления по почтовому каналу. На самом деле, это очень удобно в случае отправки коротких сообщений об изменениях состояния в вашем приложении.

Для тех из вас, кто только начинает работать с Laravel или хочет расширить свои знания, сайт или приложение с помощью расширений, у нас есть множество вещей, которые вы можете изучить на Envato Market .

Если у вас есть какие-либо вопросы или предложения, не стесняйтесь размещать их, используя канал ниже!