【发布时间】:2023-01-24 02:33:32
【问题描述】:
我正在调查观察者,我发现在 App\Providers\EventServiceProvider 的 boot() 方法期间调用观察者不是 laravel 可以使用属性 protected $observers 调用它。
在 boot 方法中调用它时它工作得很好,但是当我把它放在属性中时它不起作用。
我究竟做错了什么?我在文档中找不到任何其他解释。
我的事件服务提供商:
class EventServiceProvider extends ServiceProvider
{
/**
* Summary of Observers
* @var mixed
*/
protected $observers = [
User::class => [UserObserver::class],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
//User::observe(UserObserver::class);
//Above line is commented because property $observers is used, but uncommented when property observers is commented.
}
我的观察者:
class UserObserver
{
/**
* Handle the User "updated" event.
*
* @param \App\Models\User $user
* @return void
*/
public function updated(User $user)
{
$dirty = $user->getChanges();
dump($user);
dd($dirty);
}
}
【问题讨论】:
-
你确定吗?事件和观察者通常在幕后工作,因此
dd和dump不会出现在您认为会出现的地方。Log::info()会更好,然后您检查 Laravel 日志文件以获取信息。 -
我一定会检查一下,问题是当我在启动函数中使用它时,DD 确实有效,但是当我使用该属性调用它时,它什么也没做,所以我只是假设它不起作用。
-
我无法从您提供的代码中判断出了什么问题,看起来一切都已正确设置。而 Laravel 在幕后使用
$model::observe(...)方法,所以这两种方法之间应该没有任何区别。您可以使用php artisan event:list --event "eloquent.updated: App\Models\User"命令查看是否已注册观察者侦听器。这可能有助于缩小问题范围。