2016-12-07 2 views
1

много раз я вижу, например, в Symfony:Можно ли подключить методы маршрутизации к представлению?

HTML файл:

<hr> 
<?php $this->generateUrl('blog_show', array('slug' => 'slug-value')); ?> 
<br> 

это неприятный запах, как не с помощью инъекции depencency: таким образом HTML связан с текущей структурой. Я должен отредактировать его, если я хочу переместить его в другую структуру. Не было бы лучше просто передать сгенерированную строку url из контроллера?

+5

На этот вопрос нет ответа, это зависит от вас, чтобы определить предел между логикой и представлением. –

+1

Плохой запах? Скажите это реакционерам-разработчикам;) – Timurib

+1

Согласен. URL-адрес должен быть сгенерирован в контроллере, а не в представлении. Представление предназначено только для вывода не для какой-либо логики. разделение проблем. –

ответ

0

URL может быть сгенерирован в контроллере, чтобы отделить модель от вида. Но это только первый шаг. Лучший способ - отделить модель, просмотр и маршрутизацию. Я думаю, что лучший способ - использовать помощник вида, который генерирует путь. Я изменил некоторые рамки для проекта (отказ от symfony). Это проще, когда проект использовал шаблон (например, Smarty или Twig)

Посмотрите расширения Symfony Twig, чтобы иметь пример, который разделяет создание пути и контроллер.

В качестве примера, Twig предназначается метод пути. This view helper выполняет поиск маршрута URL-адреса маршрута. Он не имеет никакого отношения к контроллеру или модели.

Путь: Возвращает относительный URL (без схемы и хоста) для данного маршрута . Если относительный параметр включен, он создаст путь относительно текущего пути .

Как вы можете видеть там, вы должны быть осторожны с именем маршрута.

/**YourController**/ 
/** 
* @Route("/foo", name="new-game", methods="get") 
* 
* @return Response 
*/ 
public function myFooAction() 
{ 
    //Your code 

    //The rendering without information about his own or other path 
    return $this->render('default/foo.html.twig', []); 
} 

И соответствующий путь в Twig:

<hr> 
<a href="{{ path('foo') }}" title="Alt">Some text</a> 
<br> 
1

Вы можете отделить представление от вашего внутреннего интерфейса, как вы хотите, но ваш файл внешнего интерфейса для ссылки на URL в каком-то момент, даже если он это просто api.

Изменение вашего URL-адреса от <?php $this->generateUrl('blog_show', array('slug' => 'slug-value')); ?> до <?php $showUrl; ?> просто сделайте его менее ремонтопригодным и труднее перенести в другую структуру.

Если вы хотите быть независимым от Framework, вы должны использовать бэкэнд Symfony, как API.

Смежные вопросы