ZF3 -调用参数为factory '的函数;模块类


ZF3 - Call a function with parameters in factories' Module class

我是ZendFramework3的新成员,我只是想知道是否有可能调用具有更多参数的函数,而不仅仅是工厂中的serviceManager(在我的模块类中):(是否有可能在$sm参数旁边传递参数?)

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

如果你想为所有依赖项创建一个"神奇的"工厂,您应该看看SM AbstractFactory。

在这个工厂中,你可以从$ requestdname 检查哪些是依赖项。如。你可以从类构造函数中读取依赖项,然后注入依赖项(或者从$container中再次拉出依赖项)。你也可以在config中设置你的依赖项,用这种方式为你所有的类只创建一个工厂。

您可以(当然)将其他参数传递给Factory,只要要创建的类可以优雅地处理这些参数。在下面的示例中,在Controller Directory中创建了一个工厂类。现在,这就是实例化ModuleController的工厂——modulecontrolerfactory。

<?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
            ]
        ]
          //...
    ];