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;
});
Другие вопросы по тегам