phpzend-frameworkzend-framework3zend-servicemanager

How to get a service manager instance in a controller in zend framework 3?


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?


Solution

  • Thanks to SO's great related topics I finally found the answer. ServiceManager in ZF3

    It seems to be done by using Controller Factories, almost like I did.