如何从所有symfony发送重复数据';的控制器路由到trick


How to send repeating data from all symfony's controller routes to twig?

以下是用例:

我有一个简单的导航栏和一个简单下拉菜单。我在数据库里有一个城市列表,上面有城市的名字。我想得到所有的城市,并将它们添加到下拉菜单中。

简单的方法是发送额外的数据,比如要分支的城市阵列。但我有很多路线,我不认为每次都重复抓取是件好事。这不好,对吧?

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

有一种方法可以将变量注入所有模板,但这是静态数据,因此不是解决方案。

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

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

来自Symfony文档:

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

类似这样的东西:

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>