将发布的数据绑定到 Laravel 5.4 中的模型

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,它们应该是有界的。

ale*_*ino 5

不需要显式绑定到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)中的方法中以注入模型。我让您将其推广到其他模型类。