如何将所有symfony的控制器路由中的重复数据发送到twig?

时间:2016-03-31 09:30:26

标签: php twig symfony

以下是用例:

我有一个简单的navbar,其中包含一个简单的dropdown菜单。 我在数据库中有一个城市列表,其中包含城市名称。我想获取所有城市并将其添加到下拉菜单中。

简单的方法是将其他数据(例如城市数组)发送到树枝。但我有很多路线,我不认为每次重复抓取都是好的。这不好,对吧?

 public function testpageAction(){
        $em = $this->getDoctrine()->getEntityManager();
        $cities = $em->getRepository('AppBundle:City')->findAll();
        return $this->render('appviews/testpage.html.twig',array('cities'=>$cities));
    }

有一个method to inject variable into all templates,但这是静态数据,所以它不是解决方案。

我脑子里有一个计划要制作一个在控制器方法之前运行的方法,它会将数据发送到这些方法。但它似乎并不好,我相信有更好的方法来解决它。

1 个答案:

答案 0 :(得分:2)

您可以使用带有方法getAllCities的CityController或BaseController,并将此控制器嵌入到基本模板中。

来自Symfony docs

  

在某些情况下,您需要做的不仅仅是包含一个简单的模板。假设您的布局中有一个侧栏,其中包含三篇最新文章。检索这三篇文章可能包括查询数据库或执行无法在模板中完成的其他繁重逻辑。   解决方案是简单地从模板中嵌入整个控制器的结果。

这样的事情:

class BaseController extends Controller
{
   public function getAllCities()
   {
       // make a database call or other logic
       // to get all cities
       $cities = ...;

       return $this->render(
           'cities.html.twig',
           array('cities' => $cities)
       );
   }
}

您的城市模板:

{# app/Resources/views/cities.html.twig #}
{% for city in cities %}
    <a href="#"> {{ city}} </a>
{% endfor %}

在您的基本模板中:

{# app/Resources/views/base.html.twig #}
<div id="sidebar">
    {{ render(controller(
       'AppBundle:Base:getAllCities'
    )) }}
</div>