События и слушатели упрощенный вариант
Если слушателей событий не много и их код не сложный, можно не создавать отдельные классы для события и его слушателя, а использовать метод boot()
сервис-провайдера EventServiceProvider
:
В основном контроллере, возбуждаем событие создания страницы:
app/Http/Controllers/PageController.php<?php
namespace App\Http\Controllers\Admin;
use App\Events\CreatePageEvent;
use App\Http\Controllers\Controller;
use App\Models\Page;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PageController extends Controller {
// Показывает список всех страниц
public function index() {
$pages = Page::all();
return view('admin.page.index', compact('pages'));
}
// Показывает форму для создания страницы
public function create() {
return view('admin.page.create');
}
// Сохраняет новую страницу в базу данных
public function store(Request $request) {
$page = Page::create($request->all());
// Возбуждаем событие создания страницы
event(new CreatePageEvent($page));
return redirect()->route('admin.page.show', ['page' => $page->id]);
}
// Показывает информацию о странице сайта
public function show(Page $page) {
return view('admin.page.show', compact('page'));
}
// Показывает форму для редактирования страницы
public function edit(Page $page) {
return view('admin.page.edit', compact('page'));
}
// Обновляет страницу (запись в таблице БД)
public function update(Request $request, Page $page) {
$page->update($request->all());
return redirect()->route('admin.page.show', ['page' => $page->id]);
}
// Удаляет страницу (запись в таблице БД)
public function destroy(Page $page) {
$page->delete();
return redirect()->route('admin.page.index');
}
}
App/Providers/EventServiceProvider.php<?php
namespace App\Providers;
use App\Models\Page;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;
class EventServiceProvider extends ServiceProvider {
// Сопоставления события с прослушивателем для приложения @var array<class-string, array<int, class-string>>
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
// Регистрируйте любые события для вашего приложения @return void
public function boot() {
parent::boot();
Event::listen('CreatePageEvent', function (Page $page) {
// Обрабатываем событие создания новой страницы
$page->name .= ' (автор ' . auth()->user()->name . ')';
$page->save();
});
}
// Определите, должны ли события и прослушиватели обнаруживаться автоматически @return bool
public function shouldDiscoverEvents()
{
return true;
}
}