Параметр Laravel show () равен нулю - PullRequest
0 голосов
/ 06 июля 2018

Я использую Laravel версии 5.6.26. Мой параметр show () получает нулевое значение. Зачем? и как это решить? Спасибо

web.php

Route::get('/peoples', 'UsersController@index')->name('peoples');
Route::get('/peoples/{id?}', 'UsersController@show');

UserController.php

public function show(User $user)
    {
        $user = User::where('id', $user->id)->first();
        //$user = User::find($user->id)->first();
        return dd($user);
        //return view('profile',['user' => $user]);
    }

user.blade.php когда я нажимаю <a href="/peoples/{{$user->id}}" >, отображается ноль

<h4><a href="/peoples/{{$user->id}}" > {{$user->name}}</a></h4>

результат

https://imgur.com/QlaiFse

Но если мне так нравится, я могу получить значение

public function show(User $user)
    {

        $user = User::where('id',1)->first();
        //$user = User::find($user->id)->first();
        return dd($user);
        //return view('profile',['user' => $user]);
    }

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Вы вводите модель User в свой контроллер, но не получаете доступ к пути маршрута. Если вы хотите получить доступ к {id}, установленному в маршруте, вы должны получить доступ к нему и в вашем контроллере.

Так что ваш UserController будет выглядеть примерно так

public function show(User $user, $id) 
{
     $user = User::where('id', $id)->first();
     dd($user);
}
0 голосов
/ 06 июля 2018

Когда вы набираете подсказку в методе вашего контроллера show() с User, Laravel автоматически вводит это, используя Сервисный контейнер .

Ваш UserController.php код должен быть:

public function show(User $user) {
    // no need to fetch user again. Laravel had already done that for you.
    dd($user);
    return view('profile', compact('user'));
}
0 голосов
/ 06 июля 2018

То, как вы определили свой метод show, т.е. show(User $user), называется привязкой модели маршрута, если имя вашей переменной ($user) аналогично объявлению вашего маршрута. Но ваше объявление маршрута /peoples/{id?}, поэтому экземпляр User не создан в вашем контроллере. Поэтому просто переименуйте объявление маршрута в /peoples/{user?}.

Вариант использования привязки модели маршрута - вы не хотите запрашивать / загружать модель, связанную с параметром маршрута. Поэтому, если вы определите маршрут так, как я упомянул, вам не понадобится запрос $user = User::where('id', $user->id)->first();. Потому что Laravel автоматически создаст экземпляр этого $user с моделью User id, переданной по маршруту.

Если вы хотите запросить / загрузить модель User вручную, сохраните существующую декларацию маршрута как есть. И измените объявление метода контроллера как show($id = null)

...