Пользовательский слаг (URL) в Laravel (можно использовать htaccess)

У меня есть такие маршруты из базы данных

$cat_routes = App\User::list_routes();

foreach ($cat_routes as $route){
    Route::get('/category/{'.$route->route.'}', CategoriesController@getCategoryByRoute');
}

Для доступа к этой категории URL-адрес будет следующим:

domain.com/category/cars (or any category rather than cars)

Есть ли способ создать собственный URL-адрес или слаг, чтобы изменить URL-адрес следующим образом:

domain.com/cars (clothes, women, watches .... etc)

Поэтому, когда пользователь щелкает ссылку типа «domain.com/category/cars», он перенаправляется на «domain.com/cars», и контроллер продолжает обрабатывать его как категорию «category/cars».

Функция выглядит следующим образом:

public function getCategoryByRoute($category_route)

Можно ли это сделать из Laravel или htaccess?

Обратите внимание, что у меня есть другие короткие URL-адреса, такие как

domain.com/gallery
domain.com/login
......

Поэтому я не хочу перенаправлять или сокращать все URL-адреса. Только URL-адреса категорий.


person PHP User    schedule 11.10.2018    source источник


Ответы (2)


Часть вашего ответа была о перенаправлении. Вместо .htaccess вы можете сделать это в самом Laravel. Лучше, потому что если вы перейдете на Nginx (или что-то другое), вам не придется беспокоиться о "логике приложения в htaccess"...

Route::get('/category/{categorySlug}', function($categorySlug) {
    $redirectPath = sprintf('/%s', $categorySlug);
    return redirect($redirectPath);
})->where('categorySlug', '[a-z0-9-]+');

Объяснение:

  • Он принимает все данные, начинающиеся с «/category/x», где x может быть любым из диапазонов [az], [0-9] и тире
  • Он использует этот ввод для получения redirectPath
  • Он возвращает перенаправление

Очевидно, вам нужны дополнительные маршруты, чтобы поймать эти редиректы...

Route::get('/{categorySlug}', 'CategoriesController@getCategoryByRoute');

Кстати, статус перенаправления по умолчанию в этом решении — 302 (временно перемещено). Если вы хотите получить 301 (перемещено навсегда):

redirect($redirectPath, 301);
person redcenter    schedule 11.10.2018

Разместите маршруты последними:

Route::get('/gallery', '...');
Route::get('/login', '...');

Route::get('/category/{category}', 'CategoriesController@getCategoryByRoute');
Route::get('/{category}', 'CategoriesController@getCategoryByRoute');

И когда вы не найдете категорию в контроллере, создайте исключение.

person Ron van der Heijden    schedule 11.10.2018
comment
поместите код в конце маршрутов, и теперь он работает нормально, большое спасибо. - person PHP User; 12.10.2018