Конфликт привязки модели маршрута Laravel при использовании одной и той же структуры с разными моделями

Конфликт привязки модели маршрута Laravel при использовании одной и той же структуры с разными моделями

23.12.2019 11:10:31 Просмотров 27 Источник

Я пытаюсь создать привязку модели маршрута для двух моделей: "Пользователь" и " статья"

Route::get('/{user}', 'UsersController@show');

Route::get('/{article}', 'ArticlesController@show');

Проблема в том, что один из них всегда будет иметь приоритет над другим, в зависимости от порядка их объявления.

Я хочу, чтобы пользовательский маршрут имел приоритет над маршрутом статей, если пользователь и статья имеют один и тот же маршрут, но проблема в том, что laravel возвращает страницу 404, когда она не соответствует пользователю, даже если маршрут должен соответствовать статье.

Я знаю, что вы можете использовать функцию where() с регулярным выражением для этого, однако обе эти модели используют одну и ту же структуру для имени ключа маршрута (они оба являются строками). Можно ли сделать регулярное выражение поиска столбец базы данных или что-то еще?

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59460836/laravel-route-model-binding-conflict-when-using-the-same-structure-with-differen#comment105103169_59460836
Я согласен, что это самое лучшее. К сожалению мой клиент хочет именно этого :)
https://stackoverflow.com/questions/59460836/laravel-route-model-binding-conflict-when-using-the-same-structure-with-differen#comment105103932_59460836
Объясните ему технические вопросы, связанные с применением этого метода . Я полностью согласен с тем, что сказал @ThomasVanderVeen. Но если вы хотите продолжить с этим. вы можете решить эту проблему в контроллере.

Ответы - Конфликт привязки модели маршрута Laravel при использовании одной и той же структуры с разными моделями / Laravel Route Model Binding conflict when using the same structure with different models

Hafez Divandari

23.12.2019 11:18:41

У вас есть 2 варианта:

  1. Используйте разные маршруты для каждого из них:
Route::get('/users/{user}', 'UsersController@show');

Route::get('/articles/{article}', 'ArticlesController@show');
  1. Настройка логики разрешения на вашем RouteServiceProvider.php:
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    parent::boot();

    Route::bind('userOrArticle', function ($value) {
        return is_numeric($value)
                    ? App\User::where('id', $value)->firstOrFail()
                    : App\Article::where('title', $value)->firstOrFail();
    });
}
Route::get('/{userOrArticle}', function ($userOrArticle) {
    return $userOrArticle instanceof \App\User
                ? redirect()->action('UsersController@show', ['user' => $userOrArticle]);
                : redirect()->action('ArticlesController@show', ['article' => $userOrArticle]);
});

Дополнительную информацию смотрите в разделе "Настройка логики разрешения" документации: https://laravel.com/docs/master/routing#explicit-binding

https://stackoverflow.com/questions/59460836/laravel-route-model-binding-conflict-when-using-the-same-structure-with-differen/59460906#comment105103116_59460906
они используют строки для обоих
https://stackoverflow.com/questions/59460836/laravel-route-model-binding-conflict-when-using-the-same-structure-with-differen/59460906#comment105103155_59460906
Я считаю, что это то, что я хочу, но как я могу использовать различные контроллеры в зависимости от модели? Если это пользователь должен перейти в UsersController@Show и статьи должны пойти в ArticlesController@шоу.
https://stackoverflow.com/questions/59460836/laravel-route-model-binding-conflict-when-using-the-same-structure-with-differen/59460906#comment105103372_59460906
@gjerm94 я обновил свой ответ, основываясь на ваших потребностях.
Закрыть X