我正在尝试使用 laravel 观察者监听模型事件。问题是当我提交表单(更新或创建新记录)时,什么也没发生。我错过了什么吗?
app.php
'providers' => [
...
App\Providers\CasesManagerServiceProvider::class,
]
CasesManagerServiceProvider.php
class CasesManagerServiceProvider extends ServiceProvider
{
public function boot( )
{
Cases::observe(CasesObserver::class);
}
public function register()
{
}
}
案例观察者.php
class CasesObserver
{
private $cases;
public function __construct(Cases $cases){
$this->cases = $cases;
}
public function creating(Cases $case)
{
dd('creating');
}
public function saved(Cases $case)
{
dd('saved');
}
public function updating($case)
{
dd('updating');
}
public function updated($case)
{
dd('updated');
}
}
案例.php
class Cases extends Model
{
const UPDATED_AT = 'modified_at';
protected $dispatchesEvents = [
'updating' => CasesObserver::class,
'updated' => CasesObserver::class,
'creating' => CasesObserver::class,
'saved' => CasesObserver::class,
];
}
好的,我找到了答案。所有的问题都是当我添加时
use app\Observers\CasesObserver;
中的 CasesManagerServiceProvider.php
而不是 use App\Observers\CasesObserver;
。
是的,App
的 Camel 案例是问题所在,所以我更改为应用程序,现在一切正常。
这似乎是对 Composer 和 Laravel 本身的误用。
您应该通知他们您已经添加了一些文件和配置:
自动加载文件:
composer dump
重新配置缓存:
php artisan config:cache
希望这也能帮助你!
您不需要在您的情况下使用 $dispatchesEvents 。您应该尝试从模型中删除
$dispatchesEvents
,并从 CasesObserver 中删除 __constructor()
。
原因是你必须为你的模型添加一个
HasEvents
特征
<?php
use Illuminate\Database\Eloquent\Concerns\HasEvents;
class MyModel extends Model
{
use HasEvents;
//your code goes here
}
在 Laravel 9.x 中,一旦准备好所有观察者并在 eventServiceProvider 中创建,您必须验证更新模型的方式。
请记住,大规模更新,如官方 Laravel 文档中所述,不会触发 Eloquent 模型事件,如“保存”、“已保存”、“更新”和“已更新”。例如:
Cases::where('id', $id)->update(['field', 'new-value']);
// This type of mass update will not trigger model events
//Observer will be ignored.
作为解决方法,您可以先检索实例,然后手动更新字段。该方法将触发相关的 Eloquent 模型事件。以下是如何实现此目的的示例:
$case = Cases::find($id);
$case->field = 'new-value';
$case->save(); // This will trigger the observer events
注意:这可能是一个原因。尝试了几次后,我必须阅读文档才能理解为什么它没有执行。