Php UsersController`User::all()`正在工作,但`show`返回`null`
我想根据Php UsersController`User::all()`正在工作,但`show`返回`null`,php,laravel,Php,Laravel,我想根据id获取用户,但它返回null但user::all()工作正常 索引和显示用户控件中的方法:- namespace App\Http\Controllers; use App\User; use Illuminate\Http\Request; use DB; class UsersController extends Controller { public function __construct() { $this->middleware('auth',['exce
id
获取用户,但它返回null
但user::all()
工作正常
索引
和显示用户控件中的方法
:-
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use DB;
class UsersController extends Controller
{
public function __construct()
{
$this->middleware('auth',['except'=>['index','show']]);
}
public function index()
{
$users=User::all();
return view('dev.index')->with('users',$users);
}
public function show(User $user)
{
return view('dev.show')->with('user',$user);
}
}
路线:-
Route::resource('devs','UsersController');
在视图中,我有{{dd($user->name)}
,它在urlpublic/devs/{dev}
上返回null
但是在urlpublic/devs
上的索引
工作正常,您不会为整个控制器初始化用户。
每个函数都使用自己的变量
首先,我将重新配置您的路线,如下所示:
Route::get('devs', 'UsersController@show')->name('showUsers')
在你的函数显示中,我将执行以下操作
public static function show(){
$id = 1;
$users = User::where('id', $id')
return view('dev.show', compact('users'));
}
您不会为整个控制器初始化用户。
每个函数都使用自己的变量
首先,我将重新配置您的路线,如下所示:
Route::get('devs', 'UsersController@show')->name('showUsers')
在你的函数显示中,我将执行以下操作
public static function show(){
$id = 1;
$users = User::where('id', $id')
return view('dev.show', compact('users'));
}
这是因为您是这样定义基本路线的:
Route::resource('devs','UserController');
这意味着laravel将按如下方式格式化show
方法:
Route::get('devs/{dev}','UserController@show');
Laravel将尝试解决此依赖项doind,如果{dev}
与任何定义的模型类都不匹配,它将返回null
因此,要解决这个问题,请明确定义此匹配。要完成此操作,请转到您的:
App/Providers/RouteServiceProvider.php
公共函数启动()
{
父::boot();
路由::模型('dev',App\User::类);
}
因此,现在无论Laravel在哪里读取{dev}
路由参数,都会将其与用户
模型匹配。这是因为您是这样定义基本路由的:
Route::resource('devs','UserController');
这意味着laravel将按如下方式格式化show
方法:
Route::get('devs/{dev}','UserController@show');
Laravel将尝试解决此依赖项doind,如果{dev}
与任何定义的模型类都不匹配,它将返回null
因此,要解决这个问题,请明确定义此匹配。要完成此操作,请转到您的:
App/Providers/RouteServiceProvider.php
公共函数启动()
{
父::boot();
路由::模型('dev',App\User::类);
}
因此,现在无论Laravel在哪里读取{dev}
路由参数,都会将其与用户
模型匹配。如果您将路由路径更改为用户
工作?我认为这就是问题的根源(模型绑定)。如果您将路由路径更改为“用户”
工作?我认为这就是问题的根源(模型绑定)。另一个简单的选择是重命名参数:show(User$dev){}
@TravisBritz我没有尝试过这种方法,但是如果它有效,当然可以很好地解决。祝您愉快。@HCK它现在给出了一个错误,但我会尝试修复它们,如果它有效,我将使用该方法,因为它看起来是一个更好的方法。Thanks@HCK我对你的解释投了赞成票,但有一个小小的修正:路由模型绑定只查找匹配的路由变量和参数名。只要变量名匹配(并且类型提示是一个模型),它就可以绑定correctly@HCK它现在正在工作,但我必须删除parent::boot()代码>和导入使用应用程序
使用路由
,现在它开始工作了。感谢另一个简单的选项是重命名参数:show(User$dev){}
@TravisBritz我还没有尝试过这种方法,但是如果它是有效的,当然可以很好地解决这个问题。祝您愉快。@HCK它现在给出了一个错误,但我会尝试修复它们,如果它有效,我将使用该方法,因为它看起来是一个更好的方法。Thanks@HCK我对你的解释投了赞成票,但有一个小小的修正:路由模型绑定只查找匹配的路由变量和参数名。只要变量名匹配(并且类型提示是一个模型),它就可以绑定correctly@HCK它现在正在工作,但我必须删除parent::boot()代码>和导入使用应用程序
使用路由
,现在它开始工作了。ThanksAn edit被拒绝回答此问题:建议在$users=User::where(…)的末尾添加->->first()
或->get()
代码>;将查询生成器转换为用户模型或用户模型集合。而且,你有一个打字错误$id'
,extra'
。此答案的编辑被拒绝:建议将->-first()
或-get()
添加到$users=User::where(…)代码>;将查询生成器转换为用户模型或用户模型集合。而且,你有一个打字错误<代码>$id'
,额外的'
。