События 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
должен быть запущен.