仮定:エンティティEvent\Service\EventService
で動作する私の個人的なオブジェクトですEvent\Entity\Event
このコードは ActionController で機能します。
$eventService = $this->getServiceLocator()->get('Event\Service\EventService');
どうすれば同じように入ることができ$eventService
ますZend\Form\Form
か?
仮定:エンティティEvent\Service\EventService
で動作する私の個人的なオブジェクトですEvent\Entity\Event
このコードは ActionController で機能します。
$eventService = $this->getServiceLocator()->get('Event\Service\EventService');
どうすれば同じように入ることができ$eventService
ますZend\Form\Form
か?
このような依存関係がある場合、2 つのオプションがあります。あなたの場合、 aは aForm
に依存しますService
。最初のオプションは依存関係を注入することです:
class Form
{
protected $service;
public function setService(Service $service)
{
$this->service = $service;
}
}
$form = new Form;
$form->setService($service);
この場合、$form
は の場所を認識せず、$service
一般的には良いアイデアとして受け入れられます。が必要になるたびにすべての依存関係を自分でセットアップする必要がないようにするForm
ために、サービス マネージャーを使用してファクトリを作成できます。
ファクトリを作成する 1 つの方法 (他にもあります) はgetServiceConfiguration()
、モジュール クラスにメソッドを追加し、クロージャを使用してForm
オブジェクトをインスタンス化することです。これは a に a を注入する例Service
ですForm
:
public function getServiceConfiguration()
{
return array(
'factories' => array(
'Event\Form\Event' => function ($sm) {
$service = $sm->get('Event\Service\EventService');
$form = new Form;
$form->setService($service);
return $form;
}
)
);
}
次にForm
、サービス マネージャーから を取得します。たとえば、コントローラーで次のようにします。
$form = $this->getServiceLocator()->get('Event\Form\Event');
2 つ目のオプションは、依存関係をプルすることです。フォームのようなクラスにはお勧めしませんが、サービス マネージャーを挿入して、フォームが依存関係自体をプルできるようにすることができます。
class Form
{
protected $sm;
public function setServiceManager(ServiceManager $sm)
{
$this->sm = $sm;
}
/**
* This returns the Service you depend on
*
* @return Service
*/
public function getService ()
{
return $this->sm->get('Event\Service\EventService');
}
}
ただし、この 2 番目のオプションでは、コードが不要な結合と結合され、コードのテストが非常に難しくなります。したがって、依存関係を自分でプルするのではなく、依存関係の注入を使用してください。依存関係を自分でプルしたい場合はほんの一握りです:)
module.php のすべてのオプションを使用してフォームを構成するだけです。次のコードでは、次のようにします。
コード:
public function getServiceConfiguration()
{
return array(
'factories' => array(
'my_form' => function ($sm) {
$model = new \MyModule\Form\MyForm($sm->get('something1'));
$obj = $sm->get('something2');
$model->setSomething($obj);
return $model;
},
),
);
}
次に、コントローラーで次の行により、オブジェクトに必要なすべての依存関係が設定されます
$form = $this->getServiceLocator()->get('my_form');
フォーム要素マネージャーを使用して、コントローラーでフォームを取得します。
$form = $this->getServiceLocator()->get('FormElementManager')->get('Path\To\Your\Form', $args);
次に、あなたの形でこれになります
<?php
namespace Your\Namespace;
use Zend\Form\Form;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ ServiceLocatorAwareTrait;
class MyForm extends Form implements ServiceLocatorAwareInterface {
use ServiceLocatorAwareTrait;
public function __construct($class_name, $args)
{
/// you cannot get the service locator in construct.
}
public function init()
{
$this->getServiceLocator()->get('Path\To\Your\Service');
}
}