События Laravel не стреляют?

Я не могу получить ни одного из моих eloquent.saved обработчики событий для запуска.

Я попробовал это:

<?php

namespace App\Providers;

use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        'eloquent.saved: \App\Models\Company' => [
            '\App\Models\Company@hasSaved',
        ],
    ];

}

А потом добавил этот метод в \App\Models\Company:

public function hasSaved() {
    die("SAVED!!!");
}

Но это не работает, когда я спасаю компанию.

Я попытался создать наблюдателя:

<?php

namespace App\Providers;

use App\Models\Company;
use App\Observers\CompanyObserver;
use DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{

    public function register()
    {
        Company::observe(CompanyObserver::class);
    }
}

Но события никогда не начинаются

<?php namespace App\Observers;

class CompanyObserver {

    public function saved() {
        die('saved');
    }

    public function saving() {
        die('saving');
    }
}

Я пытался использовать класс слушателя в EventServiceProvider вместо:

protected $listen = [
    'eloquent.saved: \App\Models\Company' => [
        \App\Listeners\CompanySavedListener::class,
    ],
];

Но это также никогда не работает.

Наконец, я попытался добавить это к EventServiceProvider

public function boot(DispatcherContract $events)
{
    parent::boot($events);

    $events->listen('eloquent.*', function() {
        dump(func_get_args());
    });
}

И это вызывает кучу случайных событий, но это просто подпитывает меня модельными экземплярами - я понятия не имею, какие события на самом деле запускаются.

Так, что происходит? Я просто хочу знать, когда мой Company сохранил.

1 ответ

Решение

Пойдем по пути Обозревателя. Проблема в том, что вы использовали:

Company::observe(CompanyObserver::class);

в register метод AppServiceProvider и вы должны использовать его в boot метод. Когда вы перемещаете эту строку в boot метод (того же класса), он будет работать без проблем, и когда вы сохраняете компанию, код из saved метод CompanyObserver должен быть запущен.

Другие вопросы по тегам