ZF3 - вызов функции с параметрами в классе модуля заводов

Я новичок в ZendFramework3, и я просто хочу знать, возможно ли вызвать функцию с большим количеством аргументов, чем просто serviceManager на фабриках (в моем классе Module): (Можно ли передать аргумент рядом с $sm аргумент?)

//class Module

//getConfig()
//getServiceConfig()

public function getControllerConfig()
{
    return [
        'factories' => [
            Controller\ModuleController::class => function ($sm) {
                return new ModuleController($sm);
            }
        ]
    ];
}

2 ответа

Если вы хотите создать одну "волшебную" фабрику для всех зависимостей, вам стоит взглянуть на SM AbstractFactory.

В этой одной фабрике вы можете проверить из $requiredName, какие будут зависимости. Например, Вы можете прочитать зависимости из конструктора класса и затем внедрить эти зависимости (или снова извлечь его из $ container). Вы также можете установить свои зависимости в config и таким образом создать только одну фабрику для всех ваших классов.

Вы можете (наверняка) передать другие Аргументы в Factory, если создаваемый класс может корректно обрабатывать Аргументы. В приведенном ниже примере класс фабрики был создан внутри каталога контроллера. Теперь это фабрика ModuleControllerFactory, которая создает экземпляр ModuleController.

<?php

    namespace Application\Controller;

    use Application\Controller\ModuleController,
        Zend\ServiceManager\Factory\FactoryInterface,
        Zend\ServiceManager\Factory,
        Interop\Container\ContainerInterface;

    class ModuleControllerFactory implements FactoryInterface {

        public function __invoke(ContainerInterface $container, $requestedName, array $options=null){
            // WE WANT TO PASS $variable1 to $variable12 TO THE ModuleController
            $variable1      = "Variable Value 1";
            $variable2      = "Variable Value 2";
            $variable3      = "Variable Value 3";
            return new ModuleController($container, $variable1, $variable2, $variable3);
        }
    }

Итак, теперь мы можем создать конструктор класса ModuleController:

  <?php

    // FILE-NAME: ModuleController.php;
    namespace Application\Controller;
    use Interop\Container\ContainerInterface;

    class ModuleController extends AbstractActionController {
        /**
         * ContainerInterface.
         * @var ContainerInterface
         */
        public $container;

        /**
         * @var string
         */
        public $var1;

        /**
         * @var string
         */
        public $var2;

        /**
         * @var string
         */
        public $var3;

        //  CONTAINER & VARIALBLES INJECTED IN CONSTRUCTOR
        public function __construct(ContainerInterface $container, $variable1=null, $variable2=null, $variable3=null) {
            $this->container    = $container;
            $this->var1         = $variable1;
            $this->var2         = $variable2;
            $this->var3         = $variable3;
        }

        // JUST PLAY WITH THE INJECTED VALUES IN THE INDEX ACTION
        public function indexAction() {
            return new ViewModel([
                'container' => $this->container,
                'var1'      => $this->var1,
                'var2'      => $this->var2,
                'var3'      => $this->var3
            ]);
        }


    }

А теперь обновите module.config.php внутри папки конфигурации вашего модуля Пример: module/Application/config/module.config.php,

<?php

    namespace Application;

    use Zend\Router\Http\Literal;
    use Zend\Router\Http\Regex;
    use Zend\Router\Http\Segment;
    use Zend\ServiceManager\Factory\InvokableFactory;

    return [
          //...
        'router' => [
          //...
        ],
        'controllers' => [
            'factories' => [
                Controller\ModuleController::class => Controller\ModuleControllerFactory::class
            ]
        ]
          //...

    ];
Другие вопросы по тегам