symfony 2中的查找路由

symfony 2中的查找路由,symfony,routing,Symfony,Routing,我已在我的应用程序路由文件中定义了路由: RouteName: pattern: /some/route defaults: { _controller: MyAppBundle:Controller:action } 在控制器中,我可以使用: $this->get('router')->generate('RouteName'); 我如何从我创建的新类(例如,不扩展任何内容的视图类)访问该类: namespace My\AppBundle\View; cla

我已在我的应用程序路由文件中定义了路由:

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');
    }
}
您需要将“路由器”服务注入到ViewClass中。例如,在您定义ViewClass服务的地方:

viewclass.service:
    class: Namespace\For\ViewClass
    arguments:
       router: "@router"
然后在构造函数中:

public function __construct(\Symfony\Bundle\FrameworkBundle\Routing\Router $router)
{
    $this->router = $router;
}

线索在于
$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服务。或者让您的类实现ContainerWareInterface,但第一种方法肯定会更好。

您应该将类注册为服务,并将路由器作为依赖项插入

请参阅优秀symfony2文档中的


如果您不熟悉服务容器和依赖项注入的概念,您可能会感到有些不知所措。但是,请尽量理解它,因为它是symfony2体系结构的重要组成部分。

实例化时,您可以将整个容器从控制器传递到视图类。这不是最佳做法,也不推荐

class View
{
  protected $container;

  public function __construct(\Symfony\Component\DependencyInjection\Container $container)
  {
    $this->container = $container;
  }
}
然后在代码中可以使用

$this->container->get('router')->generate($route, $parameters, $absolute);

我不确定创建一个服务对我来说是最好的,因为我正在为我的站点的每个视图(很多)创建一个ViewClass。因此,每个ViewClass通常只在一个地方使用,因此不是真正的服务。您能否提供更多关于实现ContainerWareInterface的信息。这是我需要加载的唯一类吗?实际上,我认为您仍然需要将该类定义为服务,以便使用ContainerWareInterface。所有这些都将在提供类之前自动调用类上的
setContainer
,从而允许您访问容器中的任何服务。你不应该担心创建一个服务,这是一个非常便宜的操作。如果这不是最佳实践,为什么你会建议这样做?它回答了问题,这不是你应该做的方式,但是OP需要这样做,才能与问题中描述的模式保持一致。你能解释一下你正在创建的
ViewClass
吗?
ViewClass
和模板之间有什么联系?我不确定自己是否真正理解这一点-因此无论我在哪里调用VewClass,我都必须通过路由器<代码>新视图类(新路由器())?不完全正确。因为在项目中的任何地方,只要需要ViewClass实例,就可以通过依赖项注入容器获得一个。例如,如果您在我的回答中定义了ViewClass服务,那么在您的控制器中,您可以通过以下方式获得它:$ViewClass=$this->get('ViewClass.service'),并且您不关心自己创建新对象。在service.yml中定义它是\Symfony\Cmf\Component\Routing\ChainRouter的不足之处,它不是syumfony full stack中的类,而是Symfony中的类CMF@bruno有人编辑了我的原始答案并添加了这个“链路由器”部分,不知道为什么会通过评论。。。()我将把它编辑成原始形式。