0

zendフレームワーク2を手に入れました。ユーザーフォームを作成し、そのフォームをコントローラーで使用するには、コントローラーにfromクラスを含めて、newを使用してオブジェクトを作成するか、サービスを使用してフォームにアクセスできます。フォームにアクセスするためのmanagerconfig。

オブジェクトを直接インスタンス化するのではなく、ここでサービスマネージャーを使用する理由を見つけています。何か案は??

4

1 に答える 1

0

サービスマネージャーの考え方は、実行時にフォームを置き換えることができるということです。それはすべて、デカップリングと再利用性に関するものです。

モジュールFooがあり、フォームがあるとしFoo\Form\Somethingます。次に、Fooモジュールを別のアプリケーションに配置しますが、フォームを別のアプリケーションに切り替える必要があります。コントローラで行ったばかりの場合$form = new Foo\Form\Something、別のフォームをインスタンス化する簡単なオプションはありません。の下にフォームを登録するfoo_form_somethingと、Barモジュールはサービスを上書きできます。したがってfoo_form_something、ロードされませんFoo\Form\SomethingBar\Form\Something。また、コントローラーに変更は必要ありません。

別の関連するコーディングスタイルがあり、サービスマネージャーを介してフォームをプルする代わりに、コントローラーにフォームを挿入します。あなたはおそらくこれを使用します:

namespace MyModule\Controller;

class MyController
{
  public function myAction()
  {
    $form = $this->getServiceLocator()->get('foo_form_something');
  }
}

ただし、これにより、コントローラーのテストがはるかに困難になります。依存関係を注入する方が簡単です。

namespace MyModule\Controller;

use Foo\Form\Something as SomethingForm;

class MyController
{
  protected $form;

  public function __construct(SomethingForm $foo)
  {
    $this->form = $foo
  }

  public function myAction()
  {
    $form = $this->form;
  }
}

そして、コントローラー構成にフォームを挿入します。

namespace MyModule;

class Module
{
  public function getControllerConfig()
  {
    return array(
      'factories' => array(
        'MyModule\Controller\MyController' => function($sm) {
          $form       = $sm->getServiceLocator()->get('foo_form_something');
          $controller = new MyModule\Controller\MyController($form);

          return $controller;
        }
      ),
    );
  }
}
于 2013-02-09T08:56:52.820 に答える