laravel 观察者不工作

问题描述 投票:0回答:7

我正在尝试使用 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,
];
}
php laravel laravel-5.3
7个回答
12
投票

对我来说,问题是在

register() method!

中注册观察者 所以当我把它放入
boot() method
时,一切都很顺利!原因是提到的服务提供者中运行方法的顺序hear

希望有用


4
投票

好的,我找到了答案。所有的问题都是当我添加时

use app\Observers\CasesObserver;
中的
CasesManagerServiceProvider.php
而不是
use App\Observers\CasesObserver;
。 是的,
App
的 Camel 案例是问题所在,所以我更改为应用程序,现在一切正常。


3
投票

这似乎是对 Composer 和 Laravel 本身的误用。

您应该通知他们您已经添加了一些文件和配置:

自动加载文件:

composer dump

重新配置缓存:

php artisan config:cache

希望这也能帮助你!


2
投票

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


2
投票

您不需要在您的情况下使用 $dispatchesEvents 。您应该尝试从模型中删除

$dispatchesEvents
,并从 CasesObserver 中删除
__constructor()


1
投票

原因是你必须为你的模型添加一个

HasEvents
特征

<?php

use Illuminate\Database\Eloquent\Concerns\HasEvents;

class MyModel extends Model
{
    use HasEvents;

    //your code goes here
}

0
投票

在 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

注意:这可能是一个原因。尝试了几次后,我必须阅读文档才能理解为什么它没有执行。

© www.soinside.com 2019 - 2024. All rights reserved.