Laravel Два контроллера и одна модель - PullRequest
0 голосов
/ 27 марта 2019

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

У меня есть два контроллера, OneController и TwoController с обоими ресурсами ита же модель в нем.Я использую php artisan make:controller OneController --model==MyModel и php artisan make:controller TwoController --model==MyModel.два разных контроллера с похожей моделью.

Оба имеют

public function show(MyModel $myModel)
{
    dd($myModel);
}

Но только OneController@show возвращает мои данные ...

Мои ссылки такие

{{route('one.show', $myModel->id) }}

и

{{route('two.show', $myModel->id) }}

Я также запускаю php artisan route:clear

Я изменяю TwoController@show на show($id), и он работает нормально, но я не могу игнорироватьчто один и тот же код дает мне разные результаты, и я хочу, чтобы мой код был максимально чистым.

Есть ли в Laravel 5.8 правило, согласно которому вы можете использовать только один контроллер на модель в ресурсе?

Я что-то упустил?

Спасибо!

1 Ответ

2 голосов
/ 27 марта 2019

Вы вводите нужную модель в действие контроллера, а не извлекаете запись самостоятельно, используя параметр ID.Поскольку вы используете это, вам нужно придерживаться определенных правил - для получения дополнительной информации прочитайте документацию по привязке модели маршрута .

Короче говоря: имя параметра в определении маршрута иимя аргумента в действии контроллера должно совпадать, чтобы произошла привязка модели маршрута - в противном случае в метод будет передан новый экземпляр модели.

Поскольку вы используете метод Route::resource()вместо того, чтобы определять маршруты самостоятельно, Laravel будет автоматически вызывать параметр по пути, который вы передаете. Вы можете проверить это, запустив php artisan route:list.

. Для этого с ресурсом вам нужно вручную назватьпараметры ресурса , которые фактически будут выглядеть примерно так: Route::resource('two', 'TwoController')->parameters(['two' => 'myModel']), где myModel будет именем вашей модели.

...