Laravel 8 — Как задать другое имя связи для области видимости во вложенном маршруте ресурсов

#php #laravel #routes

Вопрос:

Маршруты:

У меня есть вложенный маршрут ресурсов. Я использую это, чтобы объявить об этом:

 Route::resource('orders.comments', AppHttpControllersBackendOrderCommentController::class)
    ->parameters([
        'comments' => 'orderComment:id'
    ])
    ->except(['show']);
 

Модели и отношения:

У меня есть две модели, Order и OrderComment .

Order Модель:

 public function comments()
{
    return $this->hasMany(OrderComment::class);
}
 

OrderComment Модель:

 public function order()
{
    return $this->belongsTo(Order::class);
}
 

Контроллер заказа подпись метода редактирования

 public function edit(Order $order, OrderComment $orderComment)
 

Реальная проблема

Всякий раз, когда я хочу отредактировать комментарий к заказу , посетив /orders/1/comments/1/edit его, я получаю сообщение об ошибке:

 Call to undefined method AppModelsOrder::orderComments()
 

Я предполагаю, что это основано на параметре, который я установил в ресурсе. Но мне нужно , чтобы параметр был orderComment и не comment был, из-за $orderComment аргумента в OrderCommentController@edit . В основном это связано с соглашением об именах.

Возможные, исключенные решения, которые я пробовал/рассматривал:

Переименование OrderComment модели в Comment . Это невозможно, потому что существуют другие модели комментариев с разными столбцами, поэтому они также не могут быть полиморфными.

Переименование comments отношения к orderComments . Это решение, но не самое предпочтительное. Это потому $order->comments , что выглядит более элегантно $order->orderComments , чем и т. Д

Заключение/вопрос

Итак, можно ли «сказать» Laravel, что он должен искать отношение, называемое comments вместо orderComments ?

Комментарии:

1. Что произойдет, если вы сдадите public function edit(Order $order, OrderComment $comment) экзамен ?

2. @Tpojka для этого мне также нужно отредактировать параметр маршрута из заказа в комментарий, поэтому я это проверю. И это работает. Мне придется смириться с тем, что я должен использовать $comment в качестве имени переменной вместо $orderComment .

3. Это также показалось мне, что Laravel угадывает имя отношения на основе имени аргументов OrderCommentController@edit ( OrderComment $comment ) вместо имени параметра маршрута.

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