ZF2 在运行时将参数传递给工厂

ZF2 passing arguments to factories at runtime

在 ZF2 中,我有一个用于多选框的工厂(简化)

class MultiCheckboxFactory
{
    public function __invoke(FormElementManager $formElementManager)
    {
        $multiCheck = new MultiCheckbox();

        $serviceManager = $formElementManager->getServiceLocator();
        $mapper = $serviceManager->get('Path\To\The\Mapper\SomeMapper');
        $resultFromQuery = $mapper->findText('text');

        // further setting up of the multicheckbox based on $resultFromQuery

        return $multiCheck;
    }
}

我希望多选框根据来自映射器 findText() 方法的 $resultFromQuery 呈现不同的内容。

我想传递一个变量给 __invoke(FormElementManager $formElementManager, $someText)。但问题是,当我像这样从服务管理器调用多选框时:

$element = $formElementManager->get('Path\To\Factory\Alias\Multicheckbox');

我不知道如何传递附加变量。有帮助吗?

看看 MutableCreationOptionsInterface,这允许您的工厂接收您通过 serviceManager get() 方法传递的运行时选项。

use Zend\ServiceManager\MutableCreationOptionsInterface;
use Zend\ServiceManager\MutableCreationOptionsTrait;

class MultiCheckboxFactory implements MutableCreationOptionsInterface
{
    use MutableCreationOptionsTrait;

    public function __invoke(FormElementManager $formElementManager)
    {
        $options = $this->getCreationOptions();

        var_dump($options);

        $multiCheck = new MultiCheckbox();

        ....
    }
}

现在您可以传递选项:

$element = $formElementManager->get('Path\To\Factory\Alias\Multicheckbox', ['foo' => 'bar']);

更新:MutableCreationOptionsTrait 在 ZF3 中不再可用:https://docs.zendframework.com/zend-servicemanager/migration/#miscellaneous-interfaces-traits-and-classes

现在最简单的方法似乎是

$element = $formElementManager->build('Path\To\Factory\Alias\Multicheckbox', ['foo' => 'bar']);

虽然这每次都会给你一个离散的(非共享的)实例。