在symfony 2中查找路线

时间:2012-09-11 14:24:00

标签: symfony routing

我在我的应用路由文件中定义了一条路线:

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

4 个答案:

答案 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);