Laravel путает путаницу с слизнями
Как я могу обработать 2 одинаковых URL в моем rout.php в Laravel Framework?
Например:
- mysite / shoes (страница категорий)
- mysite/adidas-model-1 (страницы продукта)
Код:
#Categories Pages
Route::get('{catSlug}', array('uses' => 'CategoriesController@show'));
#Product Page
Route::get('{productSlug}', array('uses' => 'ProductController@show'));
Если я перехожу к mysite/shoes show, то метод CategoriesController запускается, но если я перехожу к mysite/adidas-model-1, это не метод ShowController, а тот, который запускается CategoriesController.
Есть ли хороший способ добиться этого в файле rout.php? Или я могу направить все в CategoriesController@show, и если объект не найден, запустить метод show ProductController?
Благодарю.
3 ответа
На двух маршрутах, которые вы указали, маршрутизатор не может знать, когда вы вводите catSlug
и когда вы вводите productSlug
- они обе строки, и там нет кода, чтобы различать их.
Вы можете исправить это, добавив where
пункт:
Route::get('{catSlug}', array('uses' => 'CategoriesController@show'))
->where('catSlug', '[A-Za-z]+');
Route::get('{productSlug}', array('uses' => 'ProductController@show'))
->where('productSlug', '[-A-Za-z0-9]+');
В приведенных выше регулярных выражениях я предположил, что категории - это строки только из прописных и строчных букв - без цифр, без пробелов, без знаков препинания, а продукты включают дефисы и цифры.
Я должен также добавить, что порядок этих заявлений будет иметь важное значение. Маршрут продукта также совпадает с маршрутом категории, поэтому сначала следует объявить маршрут категории, чтобы у него была возможность сработать. В противном случае все выглядит как продукт.
Спасибо за ваши ответы.
Мне действительно нужно быть свободным от того, что я выбираю для своих слизней. Поэтому я нашел другое решение.
# Objects (cats or products)
Route::get('{slug}', array('uses' => 'BaseController@route'));
и в моем файле BaseController:
public function route($slug)
{
// Category ?
if($categories = Categories::where('slug', '=', $slug)->first()){
return View::make('site/categories/swho', compact('categories'));
// Product ?
}elseif($products = Products::where('slug', '=', $slug)->first()){
return View::make('site/products/show', compact('products'));
}
}
Сначала я проверяю объект Category (у меня меньше категорий, чем товаров), и если не обнаружен, я проверяю продукт.
Попробуй сделать так, вот как я это использую.
Route::get('{slug}', function($slug) {
// IF IS CATEGORY...
if($category = Category::where('slug', '=', $slug)->first()):
return View::make('category')
->with('category', $category);
// IF IS PRODUCT ...
elseif($product = Product::where('slug', '=', $slug)->first()):
return View::make('product')
->with('product', $product);
// NOTHING? THEN ERROR
else:
App::abort(404);
endif;
});