#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 , где можно найти различные соглашения об именах и другие соответствующие стандарты для фреймворка.