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);
}
}