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

时间:2017-06-19 06:47:20

标签: php laravel laravel-5 eloquent

我已经看到有关此问题的其他主题,但没有成功。

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

3 个答案:

答案 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的用户

}