2

仮定:エンティティEvent\Service\EventServiceで動作する私の個人的なオブジェクトですEvent\Entity\Event

このコードは ActionController で機能します。

$eventService = $this->getServiceLocator()->get('Event\Service\EventService');

どうすれば同じように入ることができ$eventServiceますZend\Form\Formか?

4

3 に答える 3

5

このような依存関係がある場合、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 番目のオプションでは、コードが不要な結合と結合され、コードのテストが非常に難しくなります。したがって、依存関係を自分でプルするのではなく、依存関係の注入を使用してください。依存関係を自分でプルしたい場合はほんの一握りです:)

于 2012-06-18T13:07:45.527 に答える
3

module.php のすべてのオプションを使用してフォームを構成するだけです。次のコードでは、次のようにします。

  • サービスに my_form という名前を付けます
  • 新しいオブジェクト \MyModule\Form\MyForm をこのサービスに関連付けます
  • サービス 'something1' を _construct() に注入します
  • サービス「something2」を setSomething() に注入します

コード:

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');

于 2012-06-07T14:23:16.313 に答える
0

フォーム要素マネージャーを使用して、コントローラーでフォームを取得します。

  $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');
    }
}
于 2014-05-23T09:28:09.920 に答える