我已经看到有关此问题的其他主题,但没有成功。
因此,在Laravel 5.4路径模型绑定中,我们可以将路由绑定到类似的模型:
在web.php中定义路线:
web.php :
Route::get('/users/{user}', UsersController@show);
UsersController @展示:
public function show(User $user){
// now we already have access to $user because of route model binding
// so we don't need to use User::find($user), we just return it:
return view(users.show, compact('user'));
}
上面的代码可以正常工作,所以在我们的控制器中我们可以返回$ user而无需找到用户,我们已经拥有它。
但想象一下:
web.php :
Route::patch('/users/archive', UsersController@archive);
已编辑 现在上面的行生成修补程序路径,我们在路径网址中没有{user}
,用户ID正在通过表单发布。
UsersController @档案:
public function archive(Request $request, User $user){
// how can I access the $user here without using User::find($user);
// I get to this action via a form which is posting `user` as a value like `5`
dd($request->user); // this now echo `5`
// I can do:
// $user = User::find($request->user);
// and it works, but is there a way to not repeat it every time in every action
}
我尝试过: 在RouteServiceProvider :: boot()我有:
Route::model('user', 'App\User');
以上是我在谷歌找到的,但没有工作。
我会感激任何帮助。
修改
它似乎不再被称为Route Model Binding
,因为我们{user}
中没有route
而这是因为我的代码不起作用,user
变量正在post
1}}转到控制器,只能通过$request->user
访问。
此是路由模型绑定:
Route::patch('users/{user}/archive', UsersController@archive);
这是不:
Route::patch('users/archive', UsersController@archive);
因为我们没有{user}
并且通过表单进行post
编辑,只能通过$request->user
访问。
(如果我对路径模型绑定的定义错了,请纠正我)
SO:
我想简单地说明一下:在我发送给UsersController
的每个请求中,如果我将user
变量作为post
变量发送,则必须将其限制为{ {1}}然后User::findOrFail($request->user)
必须在我的控制器操作中可用。
我想实现这个目标,因为在每一个动作中我都在重复自己做$user
并且我不想这样做,所以如果我有User::findOrFail($request->user)
之类的话,我想查看每个请求一个variable name
,它们应该是有界限的。
答案 0 :(得分:3)
没有必要明确绑定到User
类,因此应删除Route::model('user', 'App\User');
;类型提示应该足够了。
public function archive(Request $request, User $user) { ... }
应该正常工作,只需确保您在文件顶部(User
)导入正确的use App\User;
类。
然后模型位于$user
变量(方法参数)中,请尝试dd($user)
。
现在很清楚,因为{user}
变量不在URI中,所以这不是路由模型绑定问题。您只需要根据请求的内容将User实例作为参数注入。
$this->app->bind(User::class, function () {
$user_id = request('user') ?: request()->route('user');
return User::findOrFail($user_id);
});
您可以将其添加到register
(或任何其他注册的提供商)中的AppServiceProvider
方法,以便注入模型。我留给你把它推广到其他模型类。
答案 1 :(得分:1)
您甚至不需要控制器中的(Request $request)
。
如果您正确导入User类,正如alepeino所说,您可以使用此语法$user-><value>
访问Model中的所有用户值,例如:
public function archive(User $user) {
$userId = $user->id;
}
根据更新。
如果您使用POST请求,则可以使用此类代码request()->get('<variable you send as parameter>')
来访问其数据
例如:
public function archive() {
$userId = request()->get('user');
$userInfo = User::find($userId);
//Or as you said
$user = User::findOrFail(request()->get('user'));
}
答案 2 :(得分:-3)
你能试试吗;
公共功能档案(Request $ request,$ u = User :: find($ user){
// now variable $ u应该指向id为url的用户
}