我想从我的自定义服务访问控制器方法。我创建了类MyManager,我需要在其中调用createForm()
和generateUrl()
函数。在控制器中我可以使用:$this->createForm(...)
和$this->generateUrl(...)
,但服务有哪些?有可能的?我真的需要这种方法!我应该使用什么参数?
答案 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);
}
基本上,您需要服务router
和form.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");
}
}