Reputation: 8195
Does anyone know why can't one use controller method injection in Laravel 5 to make the $router singleton available inside a controllers method, like in the code below?
use Illuminate\Routing\Router;
class WelcomeController extends Controller {
// ...
public function test($name = 'default var value', Router $router)
{
// stuff like taking the {name} part of /say-hello-to/{name?}
// ...using $router->input('name') for example
// ...assuming a route like: Route::get('say-hello-to/{name?}', 'WelcomeController@test')
}
}
An alternative way to get the same thing (idiomatic access to an url part inside a controller method) is useful, but I've already thought of a way to do this and I'm mainly interested in why this doesn't just work, as what I'm trying to get is a deeper understanding of how Laravel works and what advanced patterns can one emply when working with it.
Upvotes: 1
Views: 541
Reputation: 8195
OK, I first thought about deleting this after I figured out the answer myself in ~5min, but then again, maybe it's better to write this for others to be able to google:
When combining optional URL arguments (like 'test/{name?}'
) with controller method injection, always put the injected parameters before the ones with default values in the method declaration, otherwise you will end up staring at some pretty confusing errors when accessing the URL variant without the optional parameter.
So, in the example above, it should have been:
public function test(Router $router, $name = 'default var value')
...instead of:
public function test($name = 'default var value', Router $router)
And, btw, if someone more experienced with Laravel than me comes across this, please comment if you think this is a Laravel 5 bug that should be reported to the developers, or if you think this is the intended behavior for such situations.
Upvotes: 2