Laravel——消息通知

有的時候,在作一些業務的時候,可能會遇到這麼個需求。那就是,別人評論了你的某個東西,或者是關注你,再或者是收藏了你的文章,那麼做者,應該是須要被通知一下,以展示一下做者該有的成果,也能夠知足一下做者小小的虛榮心嘛。php

Laravel其實內部就自帶消息通知的。接下來就看看是怎麼使用的。laravel

建立消息notifications表,而且給用戶增添字段notification_count

消息表,毋庸置疑是給用來記錄消息內容的——是誰在哪篇文章哪一個時間評論了哪一個做者的,對吧。那麼notifiation_count是記錄用戶有幾條消息是未讀的對吧。 下面操做。數據庫

  1. 跑命令自動生成notification遷移表命令
php artisan notification:table
複製代碼

會生成 database/migrations/{$timestamp}_create_notifications_table.php 遷移文件,再執行下面命令將表添加到數據庫裏。json

php artisan migrate
複製代碼
  1. users表添加字段,用來跟蹤用戶未讀的消息,到時候就能夠判斷是否大於0,來是否顯示出來。跑命令
php artisan make:migration add_notification_count_to_users_table --table=users
複製代碼

這樣在databasemigration下就會生成這個遷移文件。進行添加想要的字段數組

<?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
複製代碼

生成通知類

  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表裏的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));
    }
複製代碼

將通知的數據進行獲取並渲染

  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 教程 - Web 開發實戰進階 ( Laravel 5.5 )》,想學的小夥伴能夠看看~

相關文章
相關標籤/搜索