laravel的通知系统

最近经常在看这一块的文档,我自己的小网站也做了一个类似练手的功能.

  1. 首先.laravel的通知系统需要一个数据表才可以驱动当你运行:

php artisan notifications:table

php artisan migrate

这样数据库里就有了一张notifications表 其中data字段中的json数据会用来记录你需要通知出去的数据.

2.每当你需要发送通知的时候,你必须创建一个通知类用来return data的数据.

执行:

php artisan make:notification ArticleCommented

这样就会创建一个新的通知类于app/Notifications/下.

<?php

namespace App\Notifications;

use App\Article;

use App\User;

use Illuminate\Bus\Queueable;

use Illuminate\Contracts\Queue\ShouldQueue;

use Illuminate\Notifications\Messages\MailMessage;

use Illuminate\Notifications\Notification;

class ArticleCommented extends Notification implements ShouldQueue

{

use Queueable;

protected $article;

protected $user;

protected $comment;

protected $lou;

/**

* Create a new notification instance.

*

* @return void

*/

public function __construct($article_id, $user_id, $comment, $lou)

{

$this->article = Article::find($article_id);

$this->user = User::find($user_id);

$this->comment = $comment;

$this->lou = $lou;

}

/**

* Get the notification's delivery channels.

*

* @param mixed $notifiable

* @return array

*/

public function via($notifiable)

{

return ['database'];

}

/**

* Get the mail representation of the notification.

*

* @param mixed $notifiable

* @return \Illuminate\Notifications\Messages\MailMessage

*/

public function toMail($notifiable)

{

$article = $this->$article;

$url = '/article/' . $article->id;

return (new MailMessage)

->line('您的文章收到了新的评论.')

->action('回复他', url($url))

->line('××用户,在您的文章××× 下写道: ' . str_limit($this->comment));

}

/**

* Get the array representation of the notification.

*

* @param mixed $notifiable

* @return array

*/

public function toArray($notifiable)

{

return [

'type' => 'comment',

'user_id' => $this->user->id,

'user_avatar' => $this->user->avatar,

'user_name' => $this->user->name,

'article_title' => $this->article->title,

'article_id' => $this->article->id,

'lou' => $this->lou,

'comment' => $this->comment,

];

}

}

以上为示例代码这其中, 构造函数中应当传入需要发通知的实例.如果没有可在构造函数中query一个.

via()方法中 可以选择mail或者database方式来发送通知,这里我们选择为database.

注意;toMail和toArray 或者toDatabase 都需要一个notifiable对象

如果使用mail发送 toMail() 方法return中的数据会被写入被通知对象的邮件中.

这里不对toMail做详细分析.

toArray() 方法中return 中的数据会被写入notifications表中的data字段. 并会被当成json格式存储.

数据库中如下:

json.png

如果需要进队列通知,我以前的做法一般是make一个异步执行的job然后在其中编写任务代码.

但是,laravel有更优雅的方式.

如以上实例代码所表示,在class 后使用

implements ShouldQueue 就可以让该通知进入队列执行.

该接口是由laravel提供. 当然 必须在顶部声明该接口的命名空间.这样php才能正确调用该接口.

2.业务逻辑中.

在业务逻辑中只要在users下调用notify方法就能分发你的通知请求.

例如:

$user->notify(new ArticleCommented($article->id, $user->id));

这样写出了分发通知的代码之后不要忘记在顶部声明该通知的命名空间.

但是请注意,你的User model中必须 引入了Notifiable这个接口才行.一般情况下laravel会自动帮你引入.

class User extends Authenticatable

{

use Notifiable

...........

}

这样就完成一个通知. 接下来只要视图show出通知数据就行了. 是不是很 make sence.

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容