我在我的应用路由文件中定义了一条路线:
RouteName:
pattern: /some/route
defaults: { _controller: MyAppBundle:Controller:action }
在控制器中我可以使用:
$this->get('router')->generate('RouteName');
我如何从我创建的新类中访问它,例如一个不扩展任何内容的视图类:
namespace My\AppBundle\View;
class ViewClass {
public function uri()
{
return getTheRoute('RouteName');
}
}
答案 0 :(得分:36)
您需要将“路由器”服务注入ViewClass。例如。在您定义ViewClass服务的地方:
viewclass.service:
class: Namespace\For\ViewClass
arguments:
router: "@router"
然后在你的构造函数中:
public function __construct(\Symfony\Bundle\FrameworkBundle\Routing\Router $router)
{
$this->router = $router;
}
答案 1 :(得分:1)
线索在于$this->generateUrl()
方法在控制器中的工作方式。参见:
/**
* Generates a URL from the given parameters.
*
* @param string $route The name of the route
* @param mixed $parameters An array of parameters
* @param Boolean $absolute Whether to generate an absolute URL
*
* @return string The generated URL
*/
public function generateUrl($route, $parameters = array(), $absolute = false)
{
return $this->container->get('router')->generate($route, $parameters, $absolute);
}
因此,您需要将您的类定义为服务并注入@router服务。或者你的类实现ContainerAwareInterface,但第一种方法肯定会更好。
答案 2 :(得分:1)
您应该将您的类注册为服务,并将路由器作为依赖项插入。
请参阅优秀的symfony2文档中的chapter on the service container。
如果您不熟悉服务容器和依赖注入的概念,您可能会感到有些不知所措。但是,请尽量了解它,因为它是symfony2架构的重要组成部分。
答案 3 :(得分:0)
您可以在实例化时将整个容器从控制器传递到视图类。这是 NOT BEST PRACTICE ,不推荐。
class View
{
protected $container;
public function __construct(\Symfony\Component\DependencyInjection\Container $container)
{
$this->container = $container;
}
}
然后在您的代码中,您可以使用
$this->container->get('router')->generate($route, $parameters, $absolute);