I am trying to get a ServiceManager instance in my controller to use a factory for Db\Adapter.
I added to module/Application/config/module.config.php:
'service_manager' => [ 'factories' => [ Adapter::class => AdapterServiceFactory::class, ], ], To config/autoload/local.php I added the following lines:
'db' => [ 'driver' => 'Mysqli', 'database' => 'mydb', 'username' => 'myuser', 'password' => 'mypassword', ] An now I want to access the ServiceManager in my module/Application/src/Controller/IndexController.php. How do I do that?
I tried $sm = $this->getPluginManager(); without success. If I run $serviceManager->get(Adapter::class) with the PluginManager it gives me an error:
Too few arguments to function Zend\Db\Adapter\Adapter::__construct(), 0 passed in (...)\vendor\zendframework\zend-servicemanager\src\Factory\InvokableFactory.php on line 30 and at least 1 expected What can I do, to get a ServiceManager that will get my that Adapter object?
I changed the controller factory from
'controllers' => [ 'factories' => [ Controller\IndexController::class => InvokableFactory::class, ], ], to
'controllers' => [ 'factories' => [ Controller\IndexController::class => function(ContainerInterface $serviceManager) { return new Controller\IndexController($serviceManager); }, ], ], I also added a getServiceConfig() method to the module.config.php and added a constructor to the IndexController, which receives the ServiceManager. Now I have access inside the controller.
But my question is now: is there a nicer, a more "zend like" way to achieve this?