dongzhe6287 2017-06-19 06:47
浏览 67

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

I have seen other topics regarding this issue, didn't work out.

So in Laravel 5.4 Route Model Binding, we can bind a route to a model like:

define the route in web.php:


Route::get('/users/{user}', UsersController@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(, compact('user'));

The above code will work just fine, so in our controller we can return the $user without finding the user, we already have it.

but imagine this:


Route::patch('/users/archive', UsersController@archive);

EDITED: now the above line makes a patch route and we don't have {user} in the route url, the user id is being posted via the form.


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

What I have tried: in RouteServiceProvider::boot() I have:

Route::model('user', 'App\User');

The above is what i have found in Google, but not working.

I would appreciate any kind of help.

EDIT: It seems it's not called Route Model Binding anymore since we don't have the {user} in the route and that's because my code is not working, the user variable is being posted to the controller and it's only accessible via $request->user.

this is route model binding:

Route::patch('users/{user}/archive', UsersController@archive);

this is not:

Route::patch('users/archive', UsersController@archive);

since we don't have {user} and it's being posted via the form and could be accessed only via $request->user. (please correct me if I am wrong about the definition of route model binding)


what I want to achieve in a nutshell: in every request being sent to my UsersController, if I am sending user variable as a post variable, it must be bounded to User::findOrFail($request->user) and then $user must be available in my controller actions.

I want to achieve this because in every action I am repeating myself doing User::findOrFail($request->user) and I don't want to do that, so I want to check in every request if I have a variable name like a model name, they should be bounded.

  • 写回答

3条回答 默认 最新

  • drdyf42880 2017-06-21 14:19

    There's no need to bind explicitly to the User class, so Route::model('user', 'App\User'); should be removed; type-hinting should be enough instead.

    public function archive(Request $request, User $user) { ... }

    should be working, just make sure you are importing the right User class at the top of the file (use App\User;).

    Then the model is in your $user variable (method argument), try dd($user).

    It's clear now that since the {user} variable is not in the URI, this is not a route model binding issue. You just want the User instance injected as a parameter based on the contents of the request.

    $this->app->bind(User::class, function () {
        $user_id = request('user') ?: request()->route('user');
        return User::findOrFail($user_id);

    You could add that to the register method in the AppServiceProvider (or any other registered provider) to have the model injected. I leave it to you to generalize this to other model classes.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?



  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的