Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel Route model binding - empty user

I have a route

http://192.168.10.15/user/33/edit

I am trying to return the user based on the url id.

  public function edit($id, \App\User $user)
    {
        dd($user->id);
         return view('user.update');

    }

The id is returning null, how do I do this?

like image 229
LeBlaireau Avatar asked Aug 03 '17 10:08

LeBlaireau


2 Answers

For route binding to work you should have type-hinted variable names match a route segment name, as the doc required :

Laravel automatically resolves Eloquent models defined in routes or controller actions whose type-hinted variable names match a route segment name. For example:

Route::get('api/users/{user}', function (App\User $user) {
return $user->email; });

Since the $user variable is type-hinted as the App\User Eloquent model and the variable name matches the {user} URI segment, Laravel will automatically inject the model instance that has an ID matching the corresponding value from the request URI. If a matching model instance is not found in the database, a 404 HTTP response will automatically be generated.

For your case :

Route::get('/users/{user}/edit', 'YourController@edit');

And in your controller :

public function edit(\App\User $user)
{
     dd($user->id);
     return view('user.update')->withUser($user);

}
like image 58
Maraboc Avatar answered Oct 10 '22 00:10

Maraboc


If you recently upgraded to laravel 5.3 and above, you might want to check if you have updated laravel/app/Http/Kernel.php to register route middleware for binding substitution.

Route model binding is now accomplished using middleware. All applications should add the Illuminate\Routing\Middleware\SubstituteBindings to your web middleware group in your app/Http/Kernel.php file:

\Illuminate\Routing\Middleware\SubstituteBindings::class,

You should also register a route middleware for binding substitution in the $routeMiddleware property of your HTTP kernel:

'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,

Once this route middleware has been registered, you should add it to the api middleware group:

'api' => [
    'throttle:60,1',
    'bindings',
],
like image 27
wpsiew Avatar answered Oct 10 '22 00:10

wpsiew