使用yaml路由描述时,如何在运行时获取Symfony2中的路由名称?

Jea*_*ean 8 php yaml url-routing symfony twig

在这里你可以找到关于Symfony2的第n个问题.

我正在使用一个使用文件中提供的路由名称的分页包routing.yml.从我的角度来看,这种方法不灵活并导致代码脏,因为如果我更改路由的名称,那么我必须查看所有的Twig模板或PHP文件来更新路由名称.这适用于小型Web应用程序,但会为较大的应用程序提供此类错误,并且还需要开发人员的高负担.

所以,我想知道将字符串变量x传递给Pager上面提到的包提供的对象.字符串x应该在控制器中初始化,并且必须提供routing.yml文件中给出的所需路由名称.

让我举个例子.路由文件如下:

//routing.yml
 AcmeTestBundle_listall:
pattern:  /test/page/{page}
defaults: { _controller: AcmeTestBundle:List:listall, page: 1 }
requirements:
    page:  \d+   
Run Code Online (Sandbox Code Playgroud)

然后相关的控制器是:

//use something....
class ListController extends Controller
{

  public function exampleAction($page)
  {
    $array = range(1, 100);
    $adapter = new ArrayAdapter($array);
    $pager = new Pager($adapter, array('page' => $page, 'limit' => 25));

    return array('pager' => $pager);  
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,在twig模板中,$pager接收引用上述包的路由名称

{% if pager.isPaginable %}
   {{ paginate(pager, 'AcmeTestBundle_listall') }}
{% endif %}
{% for item in pager.getResults %}
   <p>{{ item }}</p>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

知道如何在运行时只在控制器内获取'AcmeTestBundle_listall'字符串值?

Ami*_*mit 30

您可以使用apptwig中可用的全局变量来从请求中获取当前路由.

{% if pager.isPaginable %}
   {{ paginate(pager, app.request.get('_route') }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

更多关于app 这里这里.

  • Symfony将路由名称存储为Request的*属性*,因此最好将其检索为:`app.request.attributes.get('_ route')`.避免使用`Request :: get()`方法,因为它首先尝试从查询参数包中检索参数 - 属性包仅用作后备.也就是说,使用`Request :: get()`,用户可以通过在URL中附加`?_route = my_tainted_pa​​ram`来覆盖`_route`. (3认同)