В Laravel и почти во всех фреймворках и системах маршрутизации, о которых я знаю, отношение Route и Controller / Action составляет 1: 1. Каждый маршрут может иметь только один контроллер или действие для его обработки.
Если я правильно понимаю ваш вопрос, у вас есть один шаблон маршрута /news/{parameter}
, и вы хотите, чтобы произошло одно из трех:
{parameter}
содержит действительный слаг категории. Получить категорию и отобразить соответствующий вид.
{parameter}
содержит действительный фрагмент статьи (подробности). Получить статью и отобразить соответствующий вид.
{parameter}
не содержит допустимой категории или слагаемой статьи и, следовательно, не найден. Вернуть ошибку 404.
Вам по-прежнему потребуется только одно действие контроллера, но вы можете разделить логику, чтобы упростить понимание:
маршруты / web.php:
Route::get('/news/{param}', 'NewsController@index');
app / Http / Controllers / NewsController (с псевдокодом):
class NewsController extends Controller
{
public function index(string $param)
{
if ($category = Category::whereSlug($param)->first()) {
// Return your category view.
}
if ($article = Article::whereSlug($param)->first()) {
// Return your article view.
}
\abort(404);
}
}
Я бы лично рекомендовал не использовать общую структуру URL для двух разных типов сущностей, подобных этой. Это открывает возможность для конфликтов имен (категории и статьи имеют одинаковый слаг) и может ввести пользователя в заблуждение. (Это также может повредить поисковой оптимизации или результатам, но это всего лишь предположение - у меня нет ничего, чтобы это подтвердить или опровергнуть.)