Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过symfony2中的细枝共享所有模板中的变量_Php_Symfony_Twig - Fatal编程技术网

Php 通过symfony2中的细枝共享所有模板中的变量

Php 通过symfony2中的细枝共享所有模板中的变量,php,symfony,twig,Php,Symfony,Twig,我想制作一个基于角色的动态菜单。现在,我将菜单作为一个带有参数(角色)的宏包含在内,但我正在编写要测试的角色,它可以工作。我无法从模板上的控制器获取角色的值 问题是如何将用户角色(已在控制器上捕获)发送到布局 public function loginAction(){ $ldaprdn = $_POST['login']; // ldap rdn or dn $ldappass =$_POST['pass']; $m = new Model(); $params = arr

我想制作一个基于角色的动态菜单。现在,我将菜单作为一个带有参数(角色)的宏包含在内,但我正在编写要测试的角色,它可以工作。我无法从模板上的控制器获取角色的值

问题是如何将用户角色(已在控制器上捕获)发送到布局

public function loginAction(){
 $ldaprdn  = $_POST['login'];     // ldap rdn or dn
 $ldappass =$_POST['pass'];

 $m = new Model();
 $params = array('user' => $m->login($ldaprdn,$ldappass),);

 $me = new Model();
 $user = array('user' => $me->getSettings(),);

 $this->render('::menu.html.twig',$user);
 return $this->render('intranetBundle:Default:landinga.html.twig', $user);
我已经读了很多关于在twig中创建全局变量的不可能性的书,这可以解决我的问题

这是我的代码:

# layout.html.twig #
{% block menu %}
   {{ userRole('admin') }}
{% endblock %}
这是可行的,但正如我所说,我必须写这个角色。我需要得到这个值

我也尝试过将该值作为参数发送,但问题是在我渲染到内容的控制器中,它扩展了布局

public function loginAction(){
 $ldaprdn  = $_POST['login'];     // ldap rdn or dn
 $ldappass =$_POST['pass'];

 $m = new Model();
 $params = array('user' => $m->login($ldaprdn,$ldappass),);

 $me = new Model();
 $user = array('user' => $me->getSettings(),);

 $this->render('::menu.html.twig',$user);
 return $this->render('intranetBundle:Default:landinga.html.twig', $user);
}

这是我唯一不能大体解决的问题

有什么可能的解决办法吗?也许建筑设计不是最好的。或者我可以用一些我不知道的工具

重要的是在任何模板中获取角色的值,从PHP到TWIG。完成后,问题就解决了。

尝试以下方法:

{% set var = 'inner variable' %}
My variable is {{ var }}

您使用什么symfony版本


Symfony\Bundle\FrameworkBundle\Controller\Controller中有方法getUser(),并且app.user变量全局存在于twig模板中。如果“角色”是您的用户实体中的属性,您可以通过Twig中的app.User.role获取它,只要您的用户身份验证设置正确,类似这样的功能就可以正常工作:

{% if is_granted('ROLE_ADMIN') %} ... {% endif %}

我看到了几种方法

  • 您可以使用is_-grated函数来检查细枝中的角色,而无需 来自任何控制器的变量。(最简单)

  • 可以使用渲染控制器在另一个细枝内渲染细枝(不建议使用,但不建议使用) (有时有用)

  • 可以重新定义基础的块 控制器模板中的模板
  • 你可以拥有你所有的 包含全局控制器的控制器,该全局控制器通过所有 基本模板中需要的变量

  • 最后我使用了第二个选项。它在第一次尝试时就起作用了。我用这个文档指导自己:请注意,在任何情况下使用它都不是一个好的解决方案。它可以很好地用于一些小部件,如菜单或登录配置文件图片,但不要把它用于任何事情。(对于性能:重做整个请求/响应链)