有的時候,在作一些業務的時候,可能會遇到這麼個需求。那就是,別人評論了你的某個東西,或者是關注你,再或者是收藏了你的文章,那麼做者,應該是須要被通知一下,以展示一下做者該有的成果,也能夠知足一下做者小小的虛榮心嘛。php
Laravel
其實內部就自帶消息通知的。接下來就看看是怎麼使用的。laravel
notifications
表,而且給用戶增添字段notification_count
消息表,毋庸置疑是給用來記錄消息內容的——是誰在哪篇文章哪一個時間評論了哪一個做者的,對吧。那麼notifiation_count
是記錄用戶有幾條消息是未讀的對吧。 下面操做。數據庫
notification
遷移表命令php artisan notification:table
複製代碼
會生成 database/migrations/{$timestamp}_create_notifications_table.php
遷移文件,再執行下面命令將表添加到數據庫裏。json
php artisan migrate
複製代碼
users
表添加字段,用來跟蹤用戶未讀的消息,到時候就能夠判斷是否大於0,來是否顯示出來。跑命令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
字段bash
php artisan migrate
複製代碼
app\Notifications
裏建立通知類。php artisan make:notification TopicReplied
複製代碼
<?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
表裏的data字段中。app
User
模型的notify
方法。默認的User
模型裏用了trait——Notifiable的,它包含着一個能夠用來發通知的一個方法notify()
,該方法接收一個通知的實例做爲參數。雖然notify()
方法已經封裝的很方便了,可是咱們想要每次調用的時候,讓字段notification_count
自動加一,這樣就能跟蹤用戶未讀通知了。this
打開 app/Models/User.phpspa
<?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。code
那麼觸發的話,確定就是在好比別的用戶評論了做者的某篇文章,也就是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 教程 - Web 開發實戰進階 ( Laravel 5.5 )》,想學的小夥伴能夠看看~