这些是我遇到问题的路线
获取特定城市的注册地点列表的路线
例如: http://localhost:8000/London
Route::group(['namespace' => 'Page'], function() {
Route::group(['prefix' => '{city}', 'where' => ['city' => '[\w\d]+']], function() {
Route::get('/', 'CityPageController@showCityPage')->name('cityPage');
});
});
获取特定用户个人资料及其详细信息(例如评论,照片等)的路线。
例如: http://localhost:8000/John,http://localhost:8000/John/reviews,http://localhost:8000/John/photos
Route::group(['namespace' => 'User'], function() {
Route::group(['middleware' => 'verified'], function() {
Route::group(['prefix' => '{username}', 'where' => ['username' => '[\w\d]+']], function() {
Route::get('/', 'ProfileController@showProfilePage')->name('profilePage');
Route::get('/reviews', 'ReviewController@showReviewPage')->name('reviewPage');
Route::get('/photos', 'ImageController@showPhotoPage')->name('photoPage');
});
});
});
问题在于这两个路由无法同时工作。
另一条路线上的居民优先于另一条路线。
如何解决路由问题。
答案 0 :(得分:6)
您的路线文件
Route::get('{slug1}', 'PageController@singleSlug'); # slug 1 has to be unique i.e. username and cityname
Route::get('{slug1}/{slug2}', 'PageController@doubleSlug'); # combination of slug1 and slug2 has to be unique
控制器功能
public function singleSlug($slug1)
{
$user = User::where('name', $slug1)->first();
if ($user) {
return view('user')->compact('user');
}
$city = City::where('name', $slug1)->first();
if ($city) {
return view('city')->compact('city');
}
abort(404); # neither user nor city
}
public function doubleSlug($slug1, $slug2)
{
// check the slug2 as this value is always defined by the system
switch ($slug2) {
case 'Restaurants':
$city = City::with('restaurants')->where('name', $slug1)->first();
if ($city) {
$viewName = 'city_restos_listing';
$viewData = $city;
}
break;
case 'reviews':
$user = User::with('reviews')->where('name', $slug1)->first();
if ($user) {
$viewName = 'user_reviews_listing';
$viewData = $user;
}
break;
case 'photos':
$user = User::with('photos')->where('name', $slug1)->first();
if ($user) {
$viewName = 'user_photos_listing';
$viewData = $user;
}
break;
default:
abort(404); # the slug 2 is incorrect
break;
}
if(isset($viewName)) {
return view($viewName)->compact('viewData');
} else {
abort(404); # user or city not found
}
}
答案 1 :(得分:2)
从Laravels的角度来看,两个网址相同:
{property}/
拥有不同的属性名称city
和username
不会有所区别,因为laravel无法理解伦敦是一个城市,并说Prateek是用户名。
我建议的一种更好的方法是在前缀EX之前添加型号名称的标识符。 Route::group(['prefix' => 'users/{username}' ...
,而不是城市路线之前的进场和城市。
看看这个:https://laravel.com/docs/6.x/controllers#resource-controllers
答案 2 :(得分:2)
添加前缀以区分这两种路由
Route::group(['prefix' => 'users/{username}'
和Route::group(['prefix' => 'cities/{city}'
答案 3 :(得分:0)
解决此问题的简便方法:
Route::group(['namespace' => 'Page'], function() {
Route::group(['prefix' => 'city/{city}', 'where' => ['city' => '[\w\d]+']], function() {
Route::get('/', 'CityPageController@showCityPage')->name('cityPage');
});
});
Route::group(['namespace' => 'User'], function() {
Route::group(['middleware' => 'verified'], function() {
Route::group(['prefix' => 'profile/{username}', 'where' => ['username' => '[\w\d]+']], function() {
Route::get('/', 'ProfileController@showProfilePage')->name('profilePage');
Route::get('/reviews', 'ReviewController@showReviewPage')->name('reviewPage');
Route::get('/photos', 'ImageController@showPhotoPage')->name('photoPage');
});
});
});