覆盖 FoSuser 后提取用户属性

extracting user attributes after overriding FoSuser

这是我的用户 class,它扩展了 FoSUser 基本用户,我添加了 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 时没有遇到任何问题,除了通过实体的存储库之外,还有什么方法可以提取它们吗?

Userclass的$nom字段是private,所以{{ usr.nom }}不行(不能访问privateprotected 个对象的字段)。

如果我们看一下 BaseUser class,我们可以看到 $username 字段是 protected,因此 {{ usr.username }} 也不应该起作用。但确实如此!这是为什么?

那是因为 BaseUser class 有一个 public method getUsername() on line 191 returns $username 字段。

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

For convenience's sake foo.bar does the following things on the PHP layer:

  • check if foo is an array and bar a valid element;
  • if not, and if foo is an object, check that bar is a valid property;
  • if not, and if foo is an object, check that bar is a valid method (even if bar is the constructor - use __construct() instead);
  • if not, and if foo is an object, check that getBar is a valid method;
  • if not, and if foo is an object, check that isBar is a valid method;
  • if not, and if foo is an object, check that hasBar is a valid method;
  • if not, return a null value.

foo['bar'] on the other hand only works with PHP arrays:

  • check if foo is an array and bar a valid element;
  • if not, return a null value.

所以,当你在 Twig 中使用 {{ usr.username }} 时,你实际上并没有访问 protected 字段 $username(你不能,因为它不是 public) .相反,Twig 在幕后使用 getUsername() 方法。

因此,要使 {{ usr.nom }} 起作用,请将此方法添加到您的 User class:

public function getNom() {
    return $this->nom;
}

Twig 然后将首先尝试访问 $nom 字段,但它不能,因为该字段是 private。相反,Twig 将使用 getNom() 方法,因此 {{ usr.nom }} 应该可以工作。