一、.env
文件中修改 QUEUE_DRIVER=sync
爲QUEUE_DRIVER=database
php
二、建立通知模型和通知數據表遷移文件:php artisan make:model Models/Notice -m
前端
數據表遷移文件 create_notices_table 中的up方法中修改內容以下:
web
Schema::create('notices', function (Blueprint $table) {
$table->increments('id');
$table->string('title', 50);
$table->text('content');
$table->timestamps();
});
Schema::create('user_notice', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->default(0);
$table->integer('notice_id')->default(0);
$table->timestamps();
});
複製代碼
在down
方法中redis
public function down()
{
Schema::dropIfExists('notices');
Schema::dropIfExists('user_notice');
}
複製代碼
解析:notices
表是用戶通知表,user_notice
是中間表,由於用戶和通知之間的關係是多對多。數據庫
接着執行數據庫遷移:php artisan migrate
瀏覽器
一、在 web.php
中設置通知路由:bash
Route::middleware('auth.admin:admin')->name('admin.')->group(function () {
$this->get('/', 'AdminController@index');
$this->resource('notices', 'NoticeController')->except(['show', 'edit', 'update']);
});
複製代碼
二、建立對應控制器:php artisan make:controller Admin/NoticeController -r
composer
三、在User.php
模型中,定義關聯關係以下:測試
//用戶和通知之間是多對多
public function notices()
{
return $this->belongsToMany('App\Models\Notice', 'user_notice', 'user_id', 'notice_id')->withPivot(['user_id', 'notice_id']);
}
//給用戶增長通知
public function addNotice($notice)
{
return $this->notices()->save($notice);
}
複製代碼
四、後臺實現新增通知和通知列表便可。樣式參考以下,代碼省略...
ui
五、注意:功能實現後,新增一個用戶,此時notices
表是有數據的,可是中間表是沒有數據的。
一、在web.php
中設置前端路由,用於顯示全部通知。
Route::namespace('home')->group(function(){
$this->get('/','HomeController@index');
//前端通知顯示
$this->get('/notice', 'HomeController@notice')->name('notice');
})
複製代碼
二、在前端Home控制器中建立 notice
方法,代碼以下:
/***
* 前端通知頁面
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function notice()
{
//獲取當前用戶的notice
$user = \Auth::user();
$notices = $user->notices;
return view('notice.index', compact('notices'));
}
複製代碼
三、加載頁面,在resources/views/home/notice
建立index模板,並循環加載通知內容。此時,訪問前端通知的路由地址,你會發現數據庫裏的通知並無渲染出來,如圖:
接下來咱們要按需求實現消息的分發。
一、打開終端執行命令:php artisan queue:table
,打開遷移文件,代碼以下:
Schema::create('jobs', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('queue')->index()->comment('隊列名稱');
$table->longText('payload')->comment('隊列數據');
$table->unsignedTinyInteger('attempts')->comment('嘗試次數');
$table->unsignedInteger('reserved_at')->nullable()->comment('保留時間');
$table->unsignedInteger('available_at')->comment('可運行時間');
$table->unsignedInteger('created_at')->comment('隊列建立時間');
});
複製代碼
二、執行遷移命令:php artisan migrate
,會在數據庫中生成jobs
表
三、生成任務類,執行命令:php artisan make:job SendMessage
,這個命令會在你的項目目錄結構App\Jobs
中生成一個任務類文件SendMessage.php
。打開文件,寫上以下代碼:
<?php
namespace App\Jobs;
use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class SendMessage implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
private $notice;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($notice)
{
$this->notice = $notice;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//通知每一個用戶的 系統消息
$users = User::all();
foreach ($users as $user) {
$user->addNotice($this->notice);
}
}
}
複製代碼
四、打開後臺NoticeController 通知控制器,在執行新增通知方法中加上以下代碼:
// use App\Jobs\SendMessage;
public function store(Request $request)
{
$request->validate([
'title' => 'bail|required|unique:notices|max:255',
'content' => 'required',
]);
$notice = Notice::create($request->all());
//執行消息分發
dispatch(new \App\Jobs\SendMessage($notice));
//SendMessage::dispatch($notice)
return redirect(route('admin.notices.index'))->with('success', '新增通知成功');
}
複製代碼
五、啓動隊列:php artisan queue:work
,注意:不要關閉了。
六、測試:瀏覽器訪問前端地址:http://queue.test/notice
,你會看到以下頁面,即爲消息分發成功:
Well Done !!!
一、修改.env文件中的 QUEUE_DRIVER=sync
爲 QUEUE_DRIVER=redis
二、啓動隊列,終端執行命令:redis-server
,你會發現predis
的擴展沒裝
執行命令:composer require predis/predis
安裝便可。安裝完成後,從新啓動redis。