从 Symfony2 中的服务调用 createForm() 和 generateUrl()

Call createForm() and generateUrl() from service in Symfony2

我想从我的自定义服务访问控制器方法。我创建了 class MyManager,我需要在其中调用 createForm()generateUrl() 函数。在控制器中我可以使用:$this->createForm(...)$this->generateUrl(...),但是服务呢?有可能的?我真的需要这些方法!我应该使用什么参数?

假设您将服务注入控制器,您可以将控制器对象传递给服务函数

示例

class myService
{
  public function doSomthing($controller,$otherArgs)
  {
      $controller->generateForm();
  }
}

class Mycontroller extends Controller
{
   public function indexAction()
   {
      $this->get("my-service")->doSomthing($this,"hello");
   }
}

如果您查看 Symfony\Bundle\FrameworkBundle\Controller\Controller class 中的这两种方法,您将看到服务名称以及如何使用它们。

public function generateUrl($route, $parameters = array(), $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH)
{
    return $this->container->get('router')->generate($route, $parameters, $referenceType);
}

public function createForm($type, $data = null, array $options = array())
{
    return $this->container->get('form.factory')->create($type, $data, $options);
}

基本上,您 class 需要服务 routerform.factory 来实现功能。我不建议将控制器传递给您的 class。控制器是特殊的 classes,主要由框架本身使用。如果您打算将 class 用作服务,只需创建它即可。

services:
    my_manager:
        class: Something\MyManager
        arguments: [@router, @form.factory]

为服务创建一个带有两个参数的构造函数,并在 class.

中实现所需的方法
class MyManager
{
    private $router;
    private $formFactory;

    public function __construct($router, $formFactory)
    {
        $this->router = $router;
        $this->formFactory = $formFactory;
    }

    // example method - same as in controller
    public function createForm($type, $data = null, array $options = array())
    {
        return $this->formFactory->create($type, $data, $options);
    }

    // the rest of you class ...
}