0

ZF2 V.2.1+ の新しい ServiceManager テクニックを使用して、カスタム要素を作成し、短い名前を使用して要素をフォームに追加したい

Zendドキュメントの同じサンプルをステップごとにコピーしようとしていますが、うまくいきません。

短い名前を書いてサービスを使用すると、サービスが見つからないため例外が発生します。

    Zend\ServiceManager\Exception\ServiceNotFoundException
    File:
    Zend\ServiceManager\ServiceManager.php:456
    Message:
    Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Test

私はすべてのクラスを同じように持っていると思います。以下を参照してください

これは私のカスタム要素です:

    namespace SecureDraw\Form\Element;
    use Zend\Form\Element\Text;
    class ProvaElement extends Text {
    protected $hola;
        public function hola(){
            return 'hola';
        }
    }

これは私の Module.php です。呼び出し可能なサービスで短い名前を使用できるようにしています。

    class Module implements FormElementProviderInterface {
        //Rest of class
        public function getFormElementConfig() {
            return array(
                'invokables' => array(
                    'Test' => 'SecureDraw\Form\Element\ProvaElement'
                )               
            );
        } 
    }

要素の追加に使用するフォームでは、コメント行は正常に機能しますが、短い名前では機能しません。

    $this->add(array(
        'name' => 'prova',
        //'type' => 'SecureDraw\Form\Element\ProvaElement',
        'type' => 'Test',    //Fail
    ));

私の行動では:

    $formManager = $this->serviceLocator->get('FormElementManager');
    $form    = $formManager->get('SecureDraw\Form\UserForm');
    $prova = $form->get('prova');
    echo $prova->hola();
4

2 に答える 2

1

問題は、 FormElementManager を介して作成された要素を、このページでどのように表示されるかを示す __Construct メソッドではなく、init メソッドに作成する必要があることです。

zendのドキュメントの説明が不十分です

于 2013-03-31T18:46:45.177 に答える
0

回避策: 独自のモジュールで、次の 2 つのファイルを作成します。

  1. カスタム フォーム要素の呼び出し可能な短い名前を持つ FormElementManagerConfig。
  2. Form\Factory をサブクラス化し、getFormElementManager をオーバーライドして、構成を FormElementManager コンストラクターに渡します。

次に、独自の Factory を使用して、次のようにフォームを作成します (空の配列などの非常に初歩的なもの、または多かれ少なかれ本格的な $spec を $factory->createForm() に渡すことができます):

$factory = new Factory();
$spec    = array();
$form    = $factory->createForm($spec);

FormElementManagerConfig.php:

class FormElementManagerConfig implements ConfigInterface
{
    protected $invokables = array(
        'anything'          => 'MyModule\Form\Element\Anything',
    );

    public function configureServiceManager(ServiceManager $serviceManager)
    {
        foreach ($this->invokables as $name => $service) {
            $serviceManager->setInvokableClass($name, $service);
        }
    }
}

MyFactory.php:

class Factory extends \Zend\Form\Factory
{
    public function getFormElementManager()
    {
        if ($this->formElementManager === null) {
            $this->setFormElementManager(new FormElementManager(new FormElementManagerConfig()));
        }
        return $this->formElementManager;
    }
} 
于 2014-02-03T21:49:05.467 に答える