Laravel show()参数为null

时间:2018-07-06 03:08:33

标签: laravel laravel-routing

我正在使用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 :(得分:2)

如果变量名(show)与路由声明相似,则定义show(User $user)方法的方式即$user称为路由模型绑定。但是您的路由声明为/peoples/{id?},因此不会在控制器中创建User实例。因此,只需将路由声明重命名为/peoples/{user?}

路由模型绑定的用例是您不想查询/加载与路由参数相关的模型。因此,如果按照我提到的方式定义路线,则不需要$user = User::where('id', $user->id)->first();查询。因为Laravel会使用在路由中传递的$user的{​​{1}}模型自动实例化User

如果您想手动查询/加载id模型,请保持现有的路由声明不变。并将您的控制器方法声明更改为User

答案 1 :(得分:0)

您要在控制器中注入User模型,但不能访问路由路径。如果要访问路由中设置的{id},则也必须在控制器中访问它。

所以您的UserController类似于

public function show(User $user, $id) 
{
     $user = User::where('id', $id)->first();
     dd($user);
}

答案 2 :(得分:0)

当您使用show()在控制器的方法User中键入提示时,Laravel将使用Service Container自动注入。

您的 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'));
}
相关问题