Laravel 5 условной маршрутизации и несколько контроллеров

Так что в основном мое приложение имеет два типа динамического URL.

  1. app.com/{page}
  2. app.com/{user}

Оба имеют свои контроллеры

  1. PageController@ индекс
  2. Пользователь \ProfileController@ индекс

Но я изо всех сил пытаюсь заставить это работать.

Я пробовал несколько разных методов. Вот два, которые я попробовал..

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);
    }
});

Я чувствую, что должен делать это с промежуточным программным обеспечением / фильтрами. Любая помощь будет отличной. Благодарю.

2 ответа

Я думаю, что вы могли бы добиться того, что вы после с 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']);
});

Я предлагаю сделать неявные маршруты для ваших страниц и пользователей, таких как pages/{slug}, а также users/{slug}

и в вашей динамической маршрутизации, когда слаг будет найден в таблице пользователя, просто перенаправьте его на users/{slug} и то же самое касается вашей страницы

Если вы использовали слагов для страниц и идентификаторов для пользователей, ваша идея решения этой проблемы может иметь больше смысла, но, поскольку вы используете слагов как для страниц, так и для пользователей, я настоятельно рекомендую попробовать другой подход. Почему бы не объявить два маршрута? Почему бы не использовать методы "show" соответствующих контроллеров, пока вы на нем, и придерживаться соглашений о ресурсах?

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

И если вы действительно хотите сохранить свою функциональность "root-slug-Соответственно-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 для хорошей меры.

Другие вопросы по тегам