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 EntityManagerますfieldset。たとえば$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 に答える