恕我直言,当前Laravel中用于保存通知的数据库通道设计非常糟糕:
- 例如,您不能在项目上使用外键级联来清除已删除项目的通知
- 在
data
列(强制转换为Array)中搜索自定义属性不是最佳选择
您将如何扩展供应商包中的DatabaseNotification
模型?
我想将列event_id
、question_id
、user_id
(创建通知的用户)等添加到默认的laravel notifications
表中
如何覆盖send
函数以包含更多列?
在:
vendor/laravel/framework/src/Illuminate/Notifications/Channels/DatabaseChannel.php
代码:
class DatabaseChannel
{
/**
* Send the given notification.
*
* @param mixed $notifiable
* @param \Illuminate\Notifications\Notification $notification
* @return \Illuminate\Database\Eloquent\Model
*/
public function send($notifiable, Notification $notification)
{
return $notifiable->routeNotificationFor('database')->create([
'id' => $notification->id,
'type' => get_class($notification),
\\I want to add these
'user_id' => \Auth::user()->id,
'event_id' => $notification->type =='event' ? $notification->id : null,
'question_id' => $notification->type =='question' ? $notification->id : null,
\\End adding new columns
'data' => $this->getData($notifiable, $notification),
'read_at' => null,
]);
}
}
6条答案
按热度按时间hkmswyz61#
要创建自定义通知通道:
首先,在App\Notifications中创建一个类,例如:
其次,在Notification类的
via
方法中使用此通道:h22fl7wq2#
创建并使用您自己的
Notification
模型和Notifiable
trait,然后在您的(用户)模型中使用您自己的Notefiable trait。可应用\可通知.php:
应用程序\通知.php:
应用程序\用户.php:
x7yiwoj43#
@cweiske响应的示例。
如果您确实需要扩展
Illuminate\Notifications\Channels\DatabaseChannel
而不创建新通道,您可以:扩展通道:
并在应用程序容器上重新注册
Illuminate\Notifications\Channels\DatabaseChannel
:app\Providers\AppServiceProvider.php
现在,当
Illuminate\Notifications\ChannelManager
尝试createDatabaseDriver
将返回您注册的数据库驱动程序。多一个解决这个问题的方案!
pieyvz9o4#
与“Bassem El Hachem”不同,我希望在
via()
方法中保留database
关键字。因此,除了自定义
DatabaseChannel
之外,我还编写了自己的ChannelManager
,它在createDatabaseDriver()
方法中返回自己的DatabaseChannel
。在我的应用程序的
ServiceProvider::register()
方法中,我覆盖了原始ChannelManager类的singleton,以返回我的自定义管理器。6bc51xsx5#
通过侦听
creating
事件,可以在模型级别支持新列。dnph8jn46#
我通过定制通知类解决了类似的问题:
创建此操作的类:
内部:
然后你可以访问视图或控制器中的正确数据,如下所示: