2

私の Zend\Form\Fieldset AddressFieldset では、\Zend\Form\Element\Select() に対して Zend\Db\TableGateway\AbstractTableGateway BundeslandTable が必要です。

そこで、この AddressFieldset に \Zend\ServiceManager\ServiceManagerAwareInterface を実装し、__construct() の代わりに init() を使用します。

そして、module.config.php (テストされた「form_elements」だけでなく、「service_manager」でも)

'form_elements' => array(
    'factories' => array(
        'MyFormway\Form\Fieldset\Address' => function($sm) {
            $addressFieldset = new MyFormway\Form\Fieldset\AddressFieldset();
            $addressFieldset->setServiceManager($sm);
            return $addressFieldset;
        }
    ),
),

\Zend\Form\Form の init():

$this->add(array(
        'type' => 'MyFormway\Form\Fieldset\Address',
        'name' => 'address',
    ));

これはエラーをスローします:

Zend\Form\FormElementManager::get was unable to fetch or create an instance for MyFormway\Form\Fieldset\Address

zend がこの Fieldset のインスタンスを取得できないのはなぜですか?

編集 - - - - - - - - - - - -

'form_elements' => array(
    'factories' => array(
        'MyFormway\Form\Fieldset\Address' => function($formElementManager) {
            die('inna form_elements config');
            $addressFieldset = new \MyFormway\Form\Fieldset\AddressFieldset();
            $addressFieldset->setServiceManager($formElementManager->getServiceLocator());
            return $addressFieldset;
        }
    ),
),

私は Zend\Form\FormElementManager を持っているので、ServiceLocator をフェッチします...おそらく必要ありません。すべての XxxManager が Zend\ServiceManager\AbstractPluginManager を拡張し、これが ServiceManager を拡張するためです。FormElementManager と AbstractPluginManager にはメソッド getServiceManager() はありません。

しかし、私の問題: die() が呼び出されず、上記のエラーが発生します。バグですか?...私は大きな壁に立ち向かいます :(

編集 - - - - - - - - - - - -

フォームでは機能しますが、フィールドセットでは機能しません!!!

4

1 に答える 1

0

\Invokableが呼び出されているかどうかを簡単に確認できますか? 専門的なdie()デバッグで十分です。

それ以外の潜在的なエラー ソースは、ServiceManager. あなたが提供するコードでは、実際には注入していませんServiceLocatorが、FormElementManager.

$addressFieldset->setServiceManager($sm->getServiceManager());

このようにすることは、悪い習慣と見なされます。実際に必要なものだけを注入する必要があります。マネージャー全体を注入していることを考えると、Doctrine を使用しているか、DB-Data にアクセスする必要があると思います。次のようにします。

'Foo' => function ($formElementManager) {
    $sl = $formElementManager->getServiceManager();
    $fs = new FooFieldset();
    $fs->setDbDependency(
        $sl->get('MyDbDependency')
    );
    return $fs;
}

最後の注意: Fieldset を追加する場合、フィールドセットの名前は Fieldset を介して定義されるため、'name' => 'foo'内に追加する必要はありません。$this->add()__construct('name')

于 2013-09-30T06:05:43.957 に答える