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

时间:2015-04-01 18:25:30

标签: php symfony

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

2 个答案:

答案 0 :(得分:21)

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

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

基本上,您需要服务routerform.factory才能实现功能。我不建议将控制器传递给你的班级。控制器是特殊类,主要由框架本身使用。如果您打算将您的课程用作服务,只需创建它。

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

创建一个带有两个服务参数的构造函数,并在类中实现所需的方法。

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 ...
}

答案 1 :(得分:0)

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

示例

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

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