diff --git a/src/Bag/BagServiceProvider.php b/src/Bag/BagServiceProvider.php index eb04760..e8dd3cc 100644 --- a/src/Bag/BagServiceProvider.php +++ b/src/Bag/BagServiceProvider.php @@ -45,7 +45,12 @@ function () use ($class): Bag { $action = new ReflectionClosure($closure); } else { /** @var object|string $controller */ - $action = new ReflectionMethod($controller, $route->getActionMethod()); + $method = $route->getActionMethod(); + $name = is_string($controller) ? $controller : get_class($controller); + if ($method === $name) { + $method = '__invoke'; + } + $action = new ReflectionMethod($controller, $method); } if (Reflection::getParameters($action)->filter(function ($parameter) use ($class) { diff --git a/tests/Feature/BagServiceProviderTest.php b/tests/Feature/BagServiceProviderTest.php index 8d0ab52..ee0644f 100644 --- a/tests/Feature/BagServiceProviderTest.php +++ b/tests/Feature/BagServiceProviderTest.php @@ -145,3 +145,26 @@ public function test( ->and(\Test2::$resolved->toArray()) ->toBe(['name' => 'Davey Shafik', 'age' => 40, 'email' => 'davey@php.net']); }); + +test('it uses the __invoke method for invokable classes', function () { + class TestInvokable + { + public static TestBag $resolved; + + public function __invoke(TestBag $bag) + { + static::$resolved = $bag; + + return $bag; + } + } + + Route::post('/testinvoke', \TestInvokable::class); + + $this->post('/testinvoke', ['name' => 'Davey Shafik', 'age' => 40, 'email' => 'davey@php.net']); + + expect(\TestInvokable::$resolved) + ->toBeInstanceOf(TestBag::class) + ->and(\TestInvokable::$resolved->toArray()) + ->toBe(['name' => 'Davey Shafik', 'age' => 40, 'email' => 'davey@php.net']); +});