1

所以基本上我的应用程序有两种类型的动态 url..

  1. app.com/{page}
  2. app.com/{用户}

两者都有自己的控制器

  1. PageController@index
  2. 用户\配置文件控制器@index

但我正在努力让这个工作。

我尝试了几种不同的方法。这是我尝试过的两个..

Route::get('{slug}', function($slug) {
    if (App\Page::where('slug', $slug)->count()) {
        // return redirect()->action('PageController@index', [$slug]);
        // return App::make('App\Http\Controllers\PageController', [$slug])->index();
        return 'Page found';
    } else if (App\User::where('username', $slug)->count()) {
        // return redirect()->action('User\ProfileController@index', [$slug]);
        // return App::make('App\Http\Controllers\User\ProfileController', [$slug])->index();
        return 'User found';
    } else {
        return abort(404);
    }
});

我觉得我应该用中间件/过滤器来做这件事。任何帮助都会很棒。谢谢。

4

2 回答 2

4

我认为您可以通过Route::group使用中间件来过滤它是页面还是用户来实现您所追求的目标。

Route::group(['middleware' => 'isPage'], function () {
    Route::get('{slug}', ['as'=> 'pages.show', 'uses' => 'PageController@show']);
});

Route::group(['middleware' => 'isUser'], function () {
    Route::get('{slug}', ['as'=> 'users.show', 'uses' => 'User\ProfileController@show']);
});
于 2017-02-14T01:53:43.857 回答
0

如果您使用 slugs 为页面和 ids 为用户,您处理问题的想法可能更有意义,但由于您对页面和用户都使用 slugs,我强烈建议您尝试不同的方法。为什么不声明两条路线?为什么不使用相应控制器的“显示”方法,并遵守资源约定?

Route::get('pages/{slug}', ['as'=> 'pages.show', 'uses' => 'PageController@show']);
Route::get('users/{slug}', ['as'=> 'users.show', 'uses' => 'User\ProfileController@show']);

如果你真的想保留你的“root-slug-redirect-redirect”功能,你可以在之后编写:

Route::get('{slug}', function($slug) {
    if (App\Page::where('slug', $slug)->count()) {
        return redirect(route('pages.show', $slug));
    } else if (App\User::where('username', $slug)->count()) {
        return redirect(route('users.show', $slug));
    }
    return abort(404);
});

不过,我确实建议不要这样做,因为这似乎是在浪费查询。

这是有关 Laravel RESTful 资源控制器的文档,可以很好地衡量。

于 2015-10-09T09:08:06.327 回答