繁体   English   中英

ZF2:Zend Form中的getServiceLocator的等价物

[英]ZF2: Equivalent of getServiceLocator in Zend Form

假设: Event\\Service\\EventService是我的个人对象,与Event\\Entity\\Event实体一起使用

此代码适用于ActionController:

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

如何以相同的方式在Zend\\Form\\Form中获取$eventService

如果你有这样的依赖,你有两个选择。 在您的情况下, 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对象。 这是将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');

第二种选择是拉依赖关系 虽然不建议像表单这样的类,但您可以注入服务管理器,以便表单可以自行提取依赖项:

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

但是,第二个选项将您的代码与不必要的耦合耦合在一起,这使得测试代码非常困难。 所以请使用依赖注入,而不是自己拉依赖。 只有极少数情况下你可能想要自己拉依赖关系:)

您可以使用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');

使用表单元素管理器获取控制器中的表单:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM