zendフレームワーク2を手に入れました。ユーザーフォームを作成し、そのフォームをコントローラーで使用するには、コントローラーにfromクラスを含めて、newを使用してオブジェクトを作成するか、サービスを使用してフォームにアクセスできます。フォームにアクセスするためのmanagerconfig。
オブジェクトを直接インスタンス化するのではなく、ここでサービスマネージャーを使用する理由を見つけています。何か案は??
zendフレームワーク2を手に入れました。ユーザーフォームを作成し、そのフォームをコントローラーで使用するには、コントローラーにfromクラスを含めて、newを使用してオブジェクトを作成するか、サービスを使用してフォームにアクセスできます。フォームにアクセスするためのmanagerconfig。
オブジェクトを直接インスタンス化するのではなく、ここでサービスマネージャーを使用する理由を見つけています。何か案は??
サービスマネージャーの考え方は、実行時にフォームを置き換えることができるということです。それはすべて、デカップリングと再利用性に関するものです。
モジュールFoo
があり、フォームがあるとしFoo\Form\Something
ます。次に、Foo
モジュールを別のアプリケーションに配置しますが、フォームを別のアプリケーションに切り替える必要があります。コントローラで行ったばかりの場合$form = new Foo\Form\Something
、別のフォームをインスタンス化する簡単なオプションはありません。の下にフォームを登録するfoo_form_something
と、Bar
モジュールはサービスを上書きできます。したがってfoo_form_something
、ロードされませんFoo\Form\Something
がBar\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;
}
),
);
}
}