Кастомный обработчик url в Laravel

На проекте, который я для себя разрабатываю встала необходимость реализовать роутинг на сайте на базе Laravel Framework таким образом, чтобы для каждой страницы сайта иметь возможность выбирать необходимый шаблон, а также контроллер, формирующий данный для этой страницы.

То есть в базе должна быть таблица типа такой:

		CREATE TABLE `urls` (
		  `id` int(11) NOT NULL,
		  `url` varchar(255) NOT NULL,
		  `template` varchar(255) NOT NULL,
		  `controller` varchar(255) NOT NULL,
		  `action` varchar(255) NOT NULL,
		  PRIMARY KEY (`id`)
		) ENGINE=InnoDB DEFAULT CHARSET=UTF8;

Где template - это соответственно шаблон, а controller и action это соответственно контроллер и action, которые должны обрабатывать соответствующий url

Обработку можно сделать сделать следующими способами например:

  1. https://laravel.com/docs/8.x/routing#parameters-encoded-forward-slashes

    Кодированные прямые слэши(Encoded Forward Slashes)

    Компонент маршрутизации Laravel допускает использование всех символов, кроме /. Вы должны явно разрешить / быть частью вашего плейсхолдера, используя регулярное выражение условия с оператором where:

    				Route::get('{url}', function ($url) {
    				    return $url;
    				})->where('url', '.*');
    			

    Кодированные прямые слэши поддерживаются только в пределах последнего сегмента маршрута.

  2. https://laravel.com/docs/8.x/routing#fallback-routes

    Резервные маршруты(Fallback Routes)

    Используя метод Route::fallback, вы можете определить маршрут, который будет выполняться, когда ни один другой маршрут не соответствует входящему запросу. Как правило, необработанные запросы автоматически отображают страницу «404» через обработчик исключений вашего приложения. Однако, поскольку вы можете определить резервный маршрут в файле routes/web.php, все middleware в группе middleware будут применяться к этому маршруту. При необходимости вы можете добавить дополнительные middlewareк этому маршруту:

    					Route::fallback(function (Request $request) {
    					    return $request->decodedPath();
    					});
    				

Тэги:

Тэг в списке: