Laravel 10. Разные контроллеры в зависимости от параметра запроса?
Есть древний проект на PHP 5
Суть проекта - некий сервис с событиями. Есть модерация событий (описание, редактирование участников и пр)
Есть публичная часть: страница события с вкладками: Участники, контакты и т.п.
Сейчас, под каждое новое событие создаётся запись в БД с определенной структурой. Дальше папка для модерации с названием как запись в БД и папка для публичной части с названием как в БД.
И дальше скрипты.
Почему так? потому что описание события, оформление - на каждое событие отличается. Набор вкладок такжы может быть разным.
Пришли к тому что нужно переписать на Laravel 10.
Единственным решением вижу - один роутер, но разные контроллеры в зависимости от параметра запроса. Соответственно, каждый контроллер со своим набором вьюшек на блейде.
Лучше чтоб это были разные пути к разным контроллерам. Может вложиться в рефакторинг? Его все равно придется проводить
один роут, разные контроллеры в зависимости от параметра запроса
Не знаю, как планируется это реализовать, но звучит страшно, лучше действительно 1 контроллер и дальше кучу условий - где вьюху отдать, где логику вызвать
Из наркоманских вариантов, если у каждого запроса разный набор входных параметров (то есть по входным параметрам можно однозначно понять что это за запрос), то можно сделать что-то типа $routeHash = md5(array_keys($request->all()))
и дальше делать редирект запроса по пути /$routeHash (которые надо предварительно реализовать)
Делать так лучше не надо, но было бы смешно)
Route::prefix('/event',function(){
Route::resource('event-type-1','Type1EventController');
Route::resource('event-type-2','Type2EventController');
});
Полнностью переписать используя js на фронте (https://laravel.com/docs/10.x/vite)
У меня пока нет проекта на ларавеле. Еть проект древний, без фреймворков... на PHP5x
Но нужно переписать на ларавель.
А там... приложение, которое генерирует табличи отчетов для разных пользователей (компаний). Данные плюс-минус одинаковые. Но формулы и структура отчетов может как сильно так и не сильно отличаться.
Прихожу к мысли... что бы не делать адский контроллер, лучше разбить на разные контроллеры, например по названию компании. Тогда один урл + path query параметр.
поставить свитчь-кейс с параметром. и по совпадению использовать нужный контроллер.
Да, на каздый контроллер, своя вьюха.
предположим:
есть Юзер-1, Юзер-2
есть типы отчётов Тип-1, Тип-2, Тип-3, СложныйТип-1
// где-то в провайдерах
$this->app->bind('InjectedReportTypeResolver ', function ($app) {
return match($app['auth']->getUser()?->role){
null => new NullReportProvider,
'admin' => new FullReportProvider,
default => new DefaultReportProvider
}
});
// web.php
Route::post('/report', 'ReportController@makeReport');
// Controllers
class ReportController{
public function makeReport(ReportFormRequest $request, InjectedReportTypeResolver $resolver){
$reportType = $resolver->resolve($request);
return view($reportType->getViewName(), $reportType->getData());
}
}
ReportFormRequest - обычно валидатор. (хотя может делать больше). InjectedReportTypeResolver - реализация сервиса, которые определит на основе входящих данных (resolve($request)) подходящий тип отчёта.
При этом, например, для разных Юзеров на одни и теже данные может вернуть разные типы. Кому-то Тип-1, а другому - СложныйТип-1.