覆盖FoSuser后提取用户属性

时间:2018-02-14 19:01:13

标签: symfony twig fosuserbundle

这是我的用户类扩展了FoSUser Base用户,我添加了nom和prenom

class User extends BaseUser
{


    /**
     * @ORM\Column(type="string", length=255)
     */
    private $nom;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $prenom;

    public function __construct()
    {
        parent::__construct();

        // your own logic
    }

这是控制器

public function demandeBoutiqueAction(Request $request)
    {

        $user = new User();

        $user=$this->get('security.token_storage')->getToken()->getUser();

        $user = $this->getUser();
        return $this->render('GestionBoutiquesBundle:Gestion:demande_boutique.html.twig', array('user'=>$user));
    }

这是视图

<h1>Nom:{{ usr.nom }}
    Username:{{usr.username}}
</h1>

我得到的结果就是这个,usr.nom是空的

喃:

用户名:okk2

我坚持使用nom和prenom没有问题,是否有提取它们,除非通过实体的存储库?

1 个答案:

答案 0 :(得分:1)

$nom课程的User字段为private,因此{{ usr.nom }}无效(您无法访问private和{{1}一个对象的字段)。

如果我们查看BaseUser class,我们可以看到protected字段为$username,因此protected也不应该有效。但确实如此!为什么?

这是因为{{ usr.username }}班级有public method getUsername() on line 191,会返回BaseUser字段。

现在让我们来看看Twig's documentation of variables

  

为方便起见,$username在PHP上执行以下操作   层:

     
      
  • 检查foo.bar是否为数组,foo是否为有效元素;
  •   
  • 如果没有,如果bar是对象,请检查foo是否为有效财产;
  •   
  • 如果没有,如果bar是对象,请检查foo是否为有效方法(即使bar是构造函数 - 请改用bar); < / LI>   
  • 如果没有,如果__construct()是对象,请检查foo是否为有效方法;
  •   
  • 如果没有,如果getBar是对象,请检查foo是否为有效方法;
  •   
  • 如果没有,如果isBar是对象,请检查foo是否为有效方法;
  •   
  • 如果没有,请返回hasBar值。
  •   
     另一方面,

null仅适用于PHP数组:

     
      
  • 检查foo['bar']是否为数组,foo是否为有效元素;
  •   
  • 如果没有,请返回bar值。
  •   

因此,当您在Twig中使用null时,您实际上并未访问{{ usr.username }}字段protected(您不能,因为它不是$username)。相反,Twig在幕后使用public方法。

因此,要使getUsername()有效,请将此方法添加到{{ usr.nom }}类:

User

Twig将首先尝试访问public function getNom() { return $this->nom; } 字段,但不能,因为该字段为$nom。相反,Twig将使用private方法,因此getNom()应该有效。