【问题标题】:ZF3 - Call a function with parameters in factories' Module classZF3 - 在工厂的模块类中调用带有参数的函数
【发布时间】:2017-03-05 09:30:41
【问题描述】:

我是 ZendFramework3 的新手,我只是想知道是否可以调用具有更多参数的函数,而不仅仅是工厂中的 serviceManager(在我的 Module 类中):(是否可以在 @ 旁边传递一个参数987654321@参数?)

//class Module

//getConfig()
//getServiceConfig()

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

【问题讨论】:

  • 这是来自 v2 的 SM,无论如何,您决定下一个是哪个...您能粘贴您的具体问题吗?
  • 我没有具体问题。我只是在寻找一种解决方案来制作可以与我项目中的所有模块一起使用的通用代码。主要目标不是为我的所有模块创建一个工厂(每个 ModuleTable 一个工厂,每个 ModuleTableGateway 一个工厂,......我只想参数化一个工厂来处理我拥有的每个模块。为此,我需要知道在我的代码中操作了哪个模块。我不能再使用 $this->getServiceLocator() 从我的控制器中获取正确的对象(类)。对,我只想知道是否有可能得到 函数($sm, $another)

标签: php zend-framework zend-framework2 servicemanager zf3


【解决方案1】:

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

在那个工厂中,您可以从 $requestedName 中检查哪些是依赖项。例如。您可以从类构造函数中读取依赖项,然后注入该依赖项(或从 $container 中再次提取)。您还可以在 config 中设置依赖项,这样就可以为所有类创建一个工厂。

【讨论】:

  • 是的!这就是我需要的。太感谢了。只是一件事,他们没有指定我们必须在哪里创建 ServiceManager。这就是我不明白的地方。他们只是说“//创建服务管理器时:”但是我们需要在哪里定义它? // 创建服务管理器时: $serviceManager = new ServiceManager([ 'factories' => [ MyObjectA::class=> MyObjectFactory::class, MyObjectB::class=> MyObjectFactory::class ] ]);
  • 如果您使用框架,则默认创建。安装后检查 ZF 骨架github.com/zendframework/ZendSkeletonApplication 查看 index.php 文件和周围...
  • 我正在使用框架并且我使用了 ZendSkeleton。但是我查看了 index.php 文件,但它并没有告诉我有关 serviceManager 的任何信息。如果你能告诉我它在哪里,那将是一个真正的乐趣:) 非常感谢
【解决方案2】:

您可以(当然)将其他参数传递给工厂,只要要创建的类可以优雅地处理参数。在下面的示例中,在控制器目录中创建了一个工厂类。这就是工厂——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
            ]
        ]
          //...

    ];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多