如何在同一位置传递不同的动态参数以访问laravel中的不同视图页面

时间:2019-12-25 16:30:09

标签: laravel routing laravel-routing laravel-route

这些是我遇到问题的路线

获取特定城市的注册地点列表的路线

例如: 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/Johnhttp://localhost:8000/John/reviewshttp://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');
        });
    });
});

问题在于这两个路由无法同时工作。

另一条路线上的居民优先于另一条路线。

如何解决路由问题。

4 个答案:

答案 0 :(得分:6)

注意:如果还没有,我建议首先在数据库上创建一个唯一的Slug字段,该字段将显示在url上

您的路线文件

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}/ 拥有不同的属性名称cityusername不会有所区别,因为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');
        });
    });
});