Laravel - уведомление о сообщении

задняя часть база данных PHP Laravel

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

LaravelНа самом деле, внутри есть уведомление о сообщении. Далее, давайте посмотрим, как его использовать.

Создать сообщениеnotificationsтаблицу и добавить поля пользователюnotification_count

Таблица сообщений, несомненно, используется для записи содержания сообщения — кто прокомментировал, какой автор, какую статью и в какое время, правильно. Такnotifiation_countЭто для того, чтобы записать, сколько сообщений пользователь не прочитал, верно? Сделайте следующее.

  1. Запустите команду для автоматической генерацииnotificationКоманда таблицы миграции
php artisan notification:table

будет генерироватьdatabase/migrations/{$timestamp}_create_notifications_table.phpПеренесите файл, а затем выполните следующую команду, чтобы добавить таблицу в базу данных.

php artisan migrate
  1. даватьusersВ таблицу добавлено поле для отслеживания непрочитанных сообщений пользователя, в это время вы можете судить, больше ли оно 0 и нужно ли его отображать. Команда Run
php artisan make:migration add_notification_count_to_users_table --table=users

так вdatabaseизmigrationФайл миграции будет создан ниже. чтобы добавить нужные поля

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class AddNotificationCountToUsersTable extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->integer('notification_count')->unsigned()->default(0);
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('notification_count');
        });
    }
}

Примените модификацию в базу данных, запустите команду миграции, затемusersЗапись будет добавлена ​​в таблицуnotification_countполе

php artisan migrate

Создать класс уведомлений

  1. Сначала выполните следующую команду автоматически вapp\NotificationsСоздайте класс уведомлений.
php artisan make:notification TopicReplied
  1. Измените файл нижеapp/Notifications/TopicReplied.php
<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use App\Models\Reply;

class TopicReplied extends Notification
{
    use Queueable;

    public $reply;

    public function __construct(Reply $reply)
    {
        // 注入回复实体,方便 toDatabase 方法中的使用
        $this->reply = $reply;
    }

    public function via($notifiable)
    {
        // 开启通知的频道,因为是涉及数据库的通知,这里写database
        return ['database'];
    }

    public function toDatabase($notifiable)
    {
        $topic = $this->reply->topic;
        //让其跳到评论对应的地方
        $link =  $topic->link(['#reply' . $this->reply->id]);

        // 存入数据库里的数据
        return [
            'reply_id' => $this->reply->id,
            'reply_content' => $this->reply->content,
            'user_id' => $this->reply->user->id,
            'user_name' => $this->reply->user->name,
            'user_avatar' => $this->reply->user->avatar,
            'topic_link' => $link,
            'topic_id' => $topic->id,
            'topic_title' => $topic->title,
        ];
    }
}

ПоследнийtoDatabaseметод получения$notifiableпараметр экземпляра и возвращает массив. Возвращенный массив будет сохранен в формате json дляnotificationв поле данных таблицы.

переписатьUserмодельnotifyметод.

дефолтUserВ модели используется трейт Notable, который содержит метод, который можно использовать для отправки уведомлений.notify(), который получает экземпляр уведомления в качестве параметра. Несмотря на то чтоnotify()Метод инкапсулирован и это очень удобно, но мы хотим сделать поле каждый раз при вызовеnotification_countАвтоматически увеличивается на единицу, чтобы вы могли отслеживать непрочитанные уведомления пользователя.

Открытымapp/Models/User.php

<?php
.
.
.
use Auth
class User extends Authenticatable {
    use notifiable {
        notify as protected laravelNotify;
    }
    
    public function notify($instance) {
        // 如果不是当前用户,就不必通知了
        if($this->id == Auth::id()) {
            return;
        }
        $this->increment('notification_count');
        $this->laravelNotify($instance);
    }
}

Прямо здесьnotifyМетод ловко переписан так, что каждый раз, когда он вызывается,notification_countавтоматически +1.

активировать уведомление

Тогда, если он срабатывает, то должен быть тогда, когда, например, другой пользователь прокомментировал статью автора, то естьreplyControllerвыполненныйstoreЗапускается при сохранении метода.

    public function store(Reply $reply) 
    {
        .
        .
        $topic = $reply->topic;
        $topic->increment('reply_count', 1);
        
        // 通知作者话题被回复了
        $topic->user->notify(new TopicReplied($reply));
    }

Получить и отобразить данные уведомления

  1. Напишите маршруты для уведомлений о сообщениях
Route::resource('notifications', 'NotificationsController', ['only' => ['index']]);
  1. новыйNotificationsControllerДля того, чтобы облегчить управление уведомлениями, здесь создается новый контроллер, и автоматически генерируется команда запуска.
php artisan make:controller NotificatioonsController
  1. Написать логический код в контроллере
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;

class NotificationsController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index()
    {
        // 获取登录用户的所有通知
        $notifications = Auth::user()->notifications()->paginate(20);
        return view('notifications.index', compact('notifications'));
    }
}
  1. Здесь стоит отметить, что,$notificationsДанные, зацикленные, должны быть добавлены при рендеринге.$notification->dataЗатем продолжайте следить за нужными данными сзади.
<div class="infos">
        <div class="media-heading">
            <a href="{{ route('users.show', $notification->data['user_id']) }}">{{ $notification->data['user_name'] }}</a>
            评论了
            <a href="{{ $notification->data['topic_link'] }}">{{ $notification->data['topic_title'] }}</a>

            {{-- 回复删除按钮 --}}
            <span class="meta pull-right" title="{{ $notification->created_at }}">
                <span class="glyphicon glyphicon-clock" aria-hidden="true"></span>
                {{ $notification->created_at->diffForHumans() }}
            </span>
        </div>
        <div class="reply-content">
            {!! $notification->data['reply_content'] !!}
        </div>
    </div>

Выше приведен основной процесс сообщения уведомления~~ Справочник "Учебное пособие по Laravel — расширенная практика веб-разработки (Laravel 5.5)", друзья, которые хотят учиться, могут посмотреть~