Иногда, занимаясь каким-либо бизнесом, вы можете столкнуться с таким спросом. То есть, если кто-то прокомментировал что-то ваше, или подписался на вас, или собрал вашу статью, то автор должен быть уведомлен, чтобы показать достижения автора и удовлетворить автора.Немного тщеславия.
Laravel
На самом деле, внутри есть уведомление о сообщении. Далее, давайте посмотрим, как его использовать.
Создать сообщениеnotifications
таблицу и добавить поля пользователюnotification_count
Таблица сообщений, несомненно, используется для записи содержания сообщения — кто прокомментировал, какой автор, какую статью и в какое время, правильно. Такnotifiation_count
Это для того, чтобы записать, сколько сообщений пользователь не прочитал, верно?
Сделайте следующее.
- Запустите команду для автоматической генерации
notification
Команда таблицы миграции
php artisan notification:table
будет генерироватьdatabase/migrations/{$timestamp}_create_notifications_table.php
Перенесите файл, а затем выполните следующую команду, чтобы добавить таблицу в базу данных.
php artisan migrate
- давать
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
Создать класс уведомлений
- Сначала выполните следующую команду автоматически в
app\Notifications
Создайте класс уведомлений.
php artisan make:notification TopicReplied
- Измените файл ниже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));
}
Получить и отобразить данные уведомления
- Напишите маршруты для уведомлений о сообщениях
Route::resource('notifications', 'NotificationsController', ['only' => ['index']]);
- новый
NotificationsController
Для того, чтобы облегчить управление уведомлениями, здесь создается новый контроллер, и автоматически генерируется команда запуска.
php artisan make:controller NotificatioonsController
- Написать логический код в контроллере
<?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'));
}
}
- Здесь стоит отметить, что,
$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)", друзья, которые хотят учиться, могут посмотреть~