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 post
ed 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 post
ed 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.
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.
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
}
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'));
}