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:

web.php:

Route::get('/users/{user}', UsersController@show);

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(users.show, 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:

web.php:

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.

UsersController@archive:

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)

SO:

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.

    点赞 打赏 评论
  • doulong6761 2017-06-21 10:44

    Can you try this;

    public function archive(Request $request, $u = User::find($user){

    //now variable $u should point to the user with id from url

    }

    点赞 打赏 评论
  • duan00529 2017-06-21 15:00

    You don't even need (Request $request) in your controller.
    If you correctly imported User class, as alepeino said, you can access all user values from Model with this syntax $user-><value> for example:

    public function archive(User $user) { 
      $userId = $user->id;
    }
    


    According to update.
    If you use POST request, you can access it's data with such code request()->get('<variable you send as parameter>')
    For example:

    public function archive() { 
      $userId = request()->get('user');
      $userInfo = User::find($userId); 
      //Or as you said
     $user = User::findOrFail(request()->get('user'));
    }
    
    点赞 打赏 评论

相关推荐 更多相似问题