0

我想重用一个实现InputFilterProviderInterface的 Fieldset o 它有getInputFilterSpecification方法,我可以在其中声明字段集中所有元素的规范。

public function getInputFilterSpecification()
    {
        return array(
            'email' => array(
                'filters' => $this->getTextFilters(),
                'validators' => array(
                    $this->getUniqueObjectValidator()
...

问题是 getUniqueObjectValidator 需要Doctrine\ORM\EntityManager它没有在 InputFilter 的 ServiceLocator 中声明

您认为我可以如何访问 inputFilter 工厂中的 EntityManager?

4

1 回答 1

1

为此,您需要DoctrineORM EntityManagerfieldset. 例如,您可以将它们$em从控制器传输到表单,然后从表单传输到字段集,但这是一个糟糕且丑陋的解决方案,特别是当您有一个包含许多字段集的复杂表单时。一个好的解决方案是利用Zend\ServiceManager\ServiceLocator.

这是处理此问题的正确方法:

首先,您必须在Module 类中实现该getFormElementConfig()功能。像这样的东西:

// module.php
public function getFormElementConfig()
{
return array(
    'factories' => array(
        'yourfieldset' => function ($sm) {
            $em = $sm->getServiceLocator()->get('Doctrine\ORM\EntityManager');
            $fieldset = new YourFieldset($em);
            return $fieldset;
        }
    )
);
}

然后确保你的 fieldest 像这样调用父构造函数:

parent::__construct('yourfieldset'); //with the name of the factory

最后通过以下方式实例化表单FormElementManager.

$formManager = $this->serviceLocator->get('FormElementManager');
$form = $formManager->get('ModuleName\Form\YourForm');

请查看这些链接了解更多详情:

于 2015-04-05T17:01:25.417 回答