3

ここのようなカスタム要素を作成します: ZF2Docs: Advanced use of Forms

1. Application/Form/Element/CustomElement.php に CustomElement クラスを作成する

2. Module.php 関数に追加します

public function getFormElementConfig()
{
    return array(
        'invokables' => array(
            'custom' => 'Application\Form\Element\CustomElement',
        ),
    );
}

FQCN を使用すると、正常に動作します。

$form->add(array(
    'type' => 'Application\Form\Element\CustomElement',
    'name' => 'myCustomElement'
));

しかし、短い名前を使用する場合:

$form->add(array(
    'type' => 'Custom',
    'name' => 'myCustomElement'
));

例外をスローします:

Zend\ServiceManager\ServiceManager::get was unable to fetch or create 
an instance for Custom
4

1 に答える 1

4

問題

このエラーは、$formオブジェクトのインスタンス化方法が原因である可能性があります。式または類似のものを使用しただけではnew Zend\Form\Form、フォームは正しいサービス ロケータで設定されません。

$form = new \Zend\Form\Form;
$form->add(array(
    'type' => 'custom',
    'name' => 'foobar',
));

解決

ここでの秘訣は、FormElementManagerサービス ロケーターを使用してフォームをインスタンス化することです。

// inside a controller action
$form = $this->getServiceLocator()->get('FormElementManager')->get('Form');
$form->add(array(
    'type' => 'custom',
    'name' => 'foobar',
));

さらに良いことに、これを行うためのショートカットとしてコントローラーでメソッドを定義form()します。

class MyController extends AbstractActionController
{
    public function form($name, $options = array())
    {
        $forms = $this->getServiceLocator()->get('FormElementManager');
        return $forms->get($name, $options);
    }

    public function createAction()
    {
        $form = $this->form('SomeForm');
        // ...
    }
}

説明

各フォーム オブジェクトはフォーム ファクトリにアタッチされ、フォーム ファクトリはサービス ロケータにアタッチされます。このサービス ロケーターは、新しいフォーム/要素/フィールド セット オブジェクトをインスタンス化するために使用されるすべてのクラスをフェッチする役割を果たします。

新しいフォーム オブジェクトを (すべて単独で) インスタンス化すると、空白のサービス ロケーターがインスタンス化され、そのフォーム内の後のクラスを取得するために使用されます。ただし、後続の各オブジェクトは、同じサービス ロケーターにアタッチされます。

ここでの問題はgetFormElementConfig、このサービス ロケーターの非常に具体的なインスタンスを構成することです。これはFormElementManagerサービス ロケーターです。構成が完了すると、このサービス ロケーターから取得されたすべてのフォームがこのサービス ロケーターにアタッチされ、他の要素/フィールドセットなどを取得するために使用されます。

これで問題が解決することを願っています。

于 2013-04-09T06:48:20.840 に答える