2

Zend\Form\Formネストされたフィールドセット ( ) を含むフォーム ( )Zend\Form\Fieldsetがあります。構成は、フォーム コレクション チュートリアルの構成と非常によく似ています。

Storage\Form\MyForm
|_'Storage\Form\Fieldset\FooFieldset'
  |_'Storage\Form\Fieldset\BarFieldset'
|_'Storage\Form\Fieldset\BazFieldset'
...

MyForm

class MyForm {
    public function __construct()
    {
        ...
        $this->add(
            [
                'type' => 'Storage\Form\Fieldset\FooFieldset',
                'options' => [
                    'use_as_base_fieldset' => true
                ]
            ]
        );
    }
}

FooFieldset

class FooFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct('foo');
        $this->setHydrator(new ClassMethodsHydrator())->setObject(new Foo()); // dependencies!
    }
}

動作しますが、fieldset クラスには 2 つの依存関係があります。注射したい。それを行うために、私は を作成し、byFooFieldsetFactoryを拡張し/module/MyModule/config/module.config.phpました:

'service_manager' => [
    'factories' => [
        'Storage\Form\Fieldset\FooFieldset' => 'Storage\Form\Fieldset\Factory\FooFieldsetFactory',
    ],
],

工場は単に無視されています。サービスロケーターは最初に名前空間でクラスを見つけようとし、何も見つからない場合にのみ and を調べinvokablesますfactories。わかった。次に、エイリアスを作成しました。

'service_manager' => [
    'factories' => [
        'Storage\Form\Fieldset\FooFieldset' => 'Storage\Form\Fieldset\Factory\FooFieldsetFactory',
    ],
],
'aliases' => [
    'Storage\Form\Fieldset\Foo' => 'Storage\Form\Fieldset\FooFieldset',
],

Storage\Form\Fieldset\FooFieldset...そして、フォームクラスの代わりに使用しようとしました。しかし今、私は例外を受け取ります:

Zend\Form\FormElementManager::get は Storage\Form\Fieldset\Foo のインスタンスを取得または作成できませんでした

私もこれを直接試しました:

'service_manager' => [
    'factories' => [
        'Storage\Form\Fieldset\Foo' => 'Storage\Form\Fieldset\Factory\FooFieldsetFactory',
    ],
],

効果なし、同じエラー。

そして、これも機能しませんでした (同じエラー):

'form_elements' => [
    'factories' => [
        'Storage\Form\Fieldset\Foo' => 'Storage\Form\Fieldset\Factory\FooFieldsetFactory',
    ],
],

したがって、フィールドセットのサービスの参照は機能しないようです。それとも私は何か間違ったことをしていますか?

フォームフィールドセットのサービスを使用するには?


アップデート

いくつかのデバッグで、Fooフィールドセット ファクトリが のfactoriesリストに追加されていないため、見つからないことがわかりましたZend\Form\FormElementManager。の場所は次のZend\Form\Factoryとおりです。

ここに画像の説明を入力

だから私の設定

'form_elements' => [
    'factories' => [
        'Storage\Form\Fieldset\Foo' => 'Storage\Form\Fieldset\Factory\FooFieldsetFactory',
    ],
],

は無視されます。これを修正する方法は?


UPDATE追加情報、Formオブジェクトの作成方法。

/module/Foo/config/module.config.php

return [
    'controllers' => [
        'factories' => [
            'Foo\Controller\My' => 'Foo\Controller\Factory\MyControllerFactory'
        ]
    ],
    'service_manager' => [
        'factories' => [
            'Foo\Form\MyForm' => 'Foo\Form\Factory\MyFormFactory',
        ],
    ],
];

/module/Foo/src/Foo/Form/Factory/MyFormFactory.php

namespace Foo\Form\Factory;

use ...;

class MyFormFactory implements FactoryInterface
{

    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $form = new MyForm();
        $form->setAttribute('method', 'post')
            ->setHydrator(new ClassMethods())
            ->setInputFilter(new InputFilter());
        return $form;
    }
}

/module/Foo/src/Foo/Controller/Factory/MyControllerFactory.php

namespace Foo\Controller\Factory;

use ...;

class MyControllerFactory implements FactoryInterface
{

    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $fooPrototype = new Foo();
        $realServiceLocator = $serviceLocator->getServiceLocator();
        // $myForm = $realServiceLocator->get('Foo\Form\MyForm'); <-- This doesn't work correctly for this case. The FormElementManager should be used instead.
        $formElementManager = $realServiceLocator->get('FormElementManager');                        
        $myForm = $formElementManager->get('Foo\Form\MyForm');
        return new MyController($myForm, $fooPrototype);
    }
}
4

1 に答える 1