13

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

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

4 回答 4

36

您需要将“路由器”服务注入您的 ViewClass。例如。在您定义 ViewClass 服务的地方:

viewclass.service:
    class: Namespace\For\ViewClass
    arguments:
       router: "@router"

然后在你的构造函数中:

public function __construct(\Symfony\Bundle\FrameworkBundle\Routing\Router $router)
{
    $this->router = $router;
}
于 2012-09-11T14:27:41.280 回答
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,但第一种方法肯定会更好。

于 2012-09-11T14:28:49.943 回答
1

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

请参阅优秀的 symfony2 文档中关于服务容器的章节。

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

于 2012-09-11T14:29:29.080 回答
0

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

class View
{
  protected $container;

  public function __construct(\Symfony\Component\DependencyInjection\Container $container)
  {
    $this->container = $container;
  }
}

然后在你的代码中你可以使用

$this->container->get('router')->generate($route, $parameters, $absolute);
于 2012-09-14T16:00:07.233 回答