beh*_*z4d 2 php laravel eloquent laravel-5
我看过有关此问题的其他主题,但没有成功。
因此,在 Laravel 5.4 路由模型绑定中,我们可以将路由绑定到模型,如下所示:
在 web.php 中定义路由:
网页.php:
Route::get('/users/{user}', UsersController@show);
Run Code Online (Sandbox Code Playgroud)
用户控制器@show:
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'));
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以正常工作,因此在我们的控制器中我们可以返回 $user 而无需找到用户,我们已经拥有它了。
但想象一下:
网页.php:
Route::patch('/users/archive', UsersController@archive);
Run Code Online (Sandbox Code Playgroud)
编辑: 现在上面的行创建了一个补丁路由,但我们在路由 URL 中没有{user},用户 ID 是通过表单发布的。
用户控制器@存档:
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
}
Run Code Online (Sandbox Code Playgroud)
我尝试过的:在 RouteServiceProvider::boot() 中我有:
Route::model('user', 'App\User');
Run Code Online (Sandbox Code Playgroud)
以上是我在Google中找到的,但不起作用。
我将不胜感激任何形式的帮助。
编辑:
看来它不再被调用,Route Model Binding因为我们没有{user}in route,那是因为我的代码不起作用,user变量正在被post编辑到控制器,并且只能通过 访问$request->user。
这是路由模型绑定:
Route::patch('users/{user}/archive', UsersController@archive);
Run Code Online (Sandbox Code Playgroud)
这不是:
Route::patch('users/archive', UsersController@archive);
Run Code Online (Sandbox Code Playgroud)
因为我们没有{user},并且它是post通过表单进行编辑的,并且只能通过$request->user. (如果我对路由模型绑定的定义有错误,请纠正我)
所以:
简而言之,我想要实现的目标是:在发送到 my 的每个请求中UsersController,如果我将user变量作为post变量发送,则它必须绑定到我的控制器操作中User::findOrFail($request->user),然后$user必须在我的控制器操作中可用。
我想实现这一点,因为在每个动作中我都在重复自己做的事情User::findOrFail($request->user),而我不想这样做,所以我想检查每个请求,如果我有一个variable name类似的model name,它们应该是有界的。
不需要显式绑定到User类,因此Route::model('user', 'App\User');应该删除;相反,类型提示应该足够了。
public function archive(Request $request, User $user) { ... }
Run Code Online (Sandbox Code Playgroud)
应该可以工作,只需确保您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);
});
Run Code Online (Sandbox Code Playgroud)
您可以将其添加到(或任何其他注册提供register程序AppServiceProvider)中的方法中以注入模型。我让您将其推广到其他模型类。
| 归档时间: |
|
| 查看次数: |
4457 次 |
| 最近记录: |