覆盖 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 时没有遇到任何问题,除了通过实体的存储库之外,还有什么方法可以提取它们吗?
User
class的$nom
字段是private
,所以{{ usr.nom }}
不行(不能访问private
和 protected
个对象的字段)。
如果我们看一下 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 }}
应该可以工作。
这是我的用户 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 时没有遇到任何问题,除了通过实体的存储库之外,还有什么方法可以提取它们吗?
User
class的$nom
字段是private
,所以{{ usr.nom }}
不行(不能访问private
和 protected
个对象的字段)。
如果我们看一下 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 andbar
a valid element;- if not, and if
foo
is an object, check thatbar
is a valid property;- if not, and if
foo
is an object, check thatbar
is a valid method (even ifbar
is the constructor - use__construct()
instead);- if not, and if
foo
is an object, check thatgetBar
is a valid method;- if not, and if
foo
is an object, check thatisBar
is a valid method;- if not, and if
foo
is an object, check thathasBar
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 andbar
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 }}
应该可以工作。