Вопрос по symfony, twig, url-routing, yaml, php – Как получить во время выполнения имя маршрута в Symfony2 при использовании описания маршрутов yaml?

8

Здесь вы можете найти мойnвопрос по Symfony2.

Я работаю спагинация который использует имя маршрута, указанное вrouting.yml файл. С моей точки зрения, этот подход не является гибким и приводит к грязному коду, так как, если я изменю название маршрута, мне придется просмотреть все шаблоны Twig или PHP-файлы, чтобы обновить имя маршрута. Это нормально для небольших веб-приложений, но предоставит такую ошибку для более крупных приложений, а также потребует от разработчиков большой нагрузки.

Итак, мне было интересно передать строковую переменнуюx кPager Объект предоставлен вышеупомянутым комплектом. Строкаx должен быть инициализирован в контроллере и должен предоставить желаемое имя маршрута, как указано вrouting.yml файл.

Позвольте мне привести пример. Файл маршрутизации выглядит следующим образом:

<code>//routing.yml
 AcmeTestBundle_listall:
pattern:  /test/page/{page}
defaults: { _controller: AcmeTestBundle:List:listall, page: 1 }
requirements:
    page:  \d+   
</code>

Тогда связанный контроллер:

<code>//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);  
  }
}
</code>

Затем в шаблоне ветки$pager получает название маршрута, которое относится к вышеуказанному комплекту

<code>{% if pager.isPaginable %}
   {{ paginate(pager, 'AcmeTestBundle_listall') }}
{% endif %}
{% for item in pager.getResults %}
   <p>{{ item }}</p>
{% endfor %}
</code>

Любая идея о том, как получить «AcmeTestBundle_listall»; строковое значение во время выполнения только внутри контроллера?

Ваш Ответ

1   ответ
30

Вы можете использоватьapp глобальная переменная, которая доступна в twig для получения текущего маршрута из запроса.

{% if pager.isPaginable %}
   {{ paginate(pager, app.request.get('_route') }}
{% endif %}

Больше оapp Вот а такжеВот.

Symfony сохраняет название маршрута какattribute Запроса, поэтому его лучше извлечь как таковое:app.request.attributes.get('_route'), Избегайте использованияRequest::get() метод, потому что он сначала пытается извлечь параметр из пакета параметров запроса - мешок атрибутов используется только как запасной вариант. Тем не менее, используяRequest::get()пользователь может переопределить_route добавив?_route=my_tainted_param на URL.
Чтобы добавить к этому, если вам нужны параметры маршрута, используйте app.request.get («aroute_params»)
Конечно! Спасибо вам большое! Быстрый и четкий ответ ... очень ценится! JeanValjean

Похожие вопросы