ZF2:在Zend的形式getServiceLocator等效(ZF2: Equivalent of

2019-07-29 18:38发布

假设: Event\Service\EventService是我个人的目标与工作Event\Entity\Event实体

此代码工作在ActionController的:

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

我怎样才能获得$eventServiceZend\Form\Form以同样的方式?

Answer 1:

你有两个选择,如果你有这样的相关性。 在你的情况下, Form取决于Service 。 第一个选项是注入依赖

class Form
{
  protected $service;
  public function setService(Service $service)
  {
    $this->service = $service;
  }
}

$form = new Form;
$form->setService($service);

在这种情况下, $form不知情的位置的$service和普遍接受的是一个好主意。 为了确保您不需要设置每个你需要一个时间所有依赖自己的Form ,您可以使用服务管理器创建一个工厂。

一种方法(还有更多),以创建一个工厂是一个加getServiceConfiguration()方法,以你的模块类,并使用了闭包来实例化一个Form对象。 这是注入一个示例ServiceForm

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

第二个选择就是拉依赖性 。 虽然不建议像表格类,你可以注入一个服务管理器,这样的形式可以拉动的依赖本身:

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

然而,这第二个选项将你的代码不必要的接头,它使得它很难对代码进行测试。 所以,请使用依赖注入,而不是自己拉动的依赖。 只有一个地方你可能要自己拉依赖性病例一把:)



Answer 2:

你可以只配置形式在module.php所有选项。 在下面的代码我:

  • 命名服务为my_form
  • 与此服务关联的新对象\ MyModule的\表格\ 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');



Answer 3:

使用表单元素管理器来获得你的控制器形式:

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


文章来源: ZF2: Equivalent of getServiceLocator in Zend Form