Laravel观察器不工作

pkmbmrz7  于 2023-08-08  发布在  其他
关注(0)|答案(7)|浏览(131)

我正在尝试使用laravel观察器监听模型事件。问题是当我提交表单(更新或创建新记录)时,什么都没有发生。我错过了什么吗?

app.php

'providers' => [
        ...
         App\Providers\CasesManagerServiceProvider::class,
]

字符串

CasesManagerServiceProvider.php

class CasesManagerServiceProvider extends ServiceProvider
{

    public function boot( )
    {

        Cases::observe(CasesObserver::class);
    }

    public function register()
    {

    }

}

CasesObserver.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');
    }
}

Cases.php

class Cases extends Model
{
    const UPDATED_AT = 'modified_at';

    protected $dispatchesEvents = [
    'updating' => CasesObserver::class,
    'updated'  => CasesObserver::class,
    'creating' => CasesObserver::class,
    'saved'    => CasesObserver::class,
];
}

cnjp1d6j

cnjp1d6j1#

对我来说,问题是在register() method!中注册观察者
所以当我把它放进boot() method的时候,一切都运行得很好!原因是服务提供程序中运行方法的顺序,这些方法被称为hear
希望有用

brjng4g3

brjng4g32#

好吧,我找到了答案。所有的问题是当我在CasesManagerServiceProvider.php中添加use app\Observers\CasesObserver;而不是use App\Observers\CasesObserver;时。是的,App的 Camel 案例是问题所在,所以我换成了应用程序,现在一切都很好。

7xllpg7q

7xllpg7q3#

这似乎是对Composer和Laravel本身的滥用。
您应该通知他们您已经添加了一些文件和配置:
要自动加载文件,请执行以下操作:

composer dump

字符串
要重新配置该高速缓存,请执行以下操作:

php artisan config:cache


希望这对你也有帮助!

omhiaaxx

omhiaaxx4#

根据文档,这是不可能的。通过Eloquent发出批量更新或删除查询时。


的数据

1dkrff03

1dkrff035#

在您的案例中不需要使用$dispatchesEvents。您应该尝试从模型中删除$dispatchesEvents,并从CasesObserver中删除__constructor()

7jmck4yq

7jmck4yq6#

原因是您必须向模型添加HasEvents trait

<?php

use Illuminate\Database\Eloquent\Concerns\HasEvents;

class MyModel extends Model
{
    use HasEvents;

    //your code goes here
}

字符串

eoigrqb6

eoigrqb67#

  • 在Laravel 9.x* 中,一旦你在eventServiceProvider中准备好并创建了所有的观察者,你必须验证你更新模型的方式。

请记住,Laravel官方文档中描述的大规模更新不会触发Eloquent模型事件,如'saving','saved','updating'和'updated'。例如:

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


注:这可能是一个原因。在尝试了几次之后,我不得不阅读文档来了解为什么它不能执行。

相关问题