0

我正在 Symfony 中开发一个过滤器来跟踪用户在应用程序中执行的某些请求。为了检索当前用户,我使用以下getContext()方法:

$user = $this->getContext()->getUser();

然后我尝试访问它的属性:

...
$username = $user->getUsername();
...

问题是 Symfony 引发了以下异常:在... sfGuardSecurityUser.class.php 中的非对象上调用成员函数 getUsername(),除非我以这种方式检索用户:

$user = $this->getContext()->getUser()->getGuardUser();

根据sfDoctrineGuardUser 文档(和源代码),有这样的代理方法:

public function getUsername()
{
    return $this->getGuardUser()->getUsername();
}

为什么代理方法不起作用?

更新

经过几周的发展,问题再次出现。这次从使用$sf_user变量的角度来看。我可以用

$sf_user->getGuardUser()->getId()

但不与

$sf_user->getId()

在我自己的回答中,下面是解释。

4

4 回答 4

1

似乎$this->getGuardUser()返回null,您必须找出原因。

于 2011-03-04T14:09:51.983 回答
0

感谢@Matt Gibson 的评论,我回顾了 sfDoctrineGuardPlugin 的安装过程。看来我在某处打错了因为现在一切正常

$this->getGuardUser()->getUsername()

$this->getUsername()

但是,我认为这些代理方法可以改进,因为它缺少getId方法。您可以检索除 ID 之外的几乎所有内容,ID 必须使用长格式检索:

$this->getGuardUser()->getId()
于 2011-04-13T07:45:12.787 回答
0

只需将您的代理方法添加到您的 User 类中,它们并不多。

class myUser extends sfGuardSecurityUser
{
  public function getId()
  {
    return $this->getGuardUser()->getId();
  }
  public function getUsername()
  {
    return $this->getGuardUser()->getUsername();
  }
}

或者,如果您喜欢魔术,您可以定义虚拟 __call() 方法并将所有未定义的方法重定向到父类。

于 2011-04-13T11:02:33.190 回答
0

我在我拥有的 sfGuardSecurityUser.class.php 版本中发现了一个错误。查看第 202 行并更改它...这导致 IF 语句不会触发,因此不会在需要时返回用户。

if (!$this->user && $id = $this->getAttribute('user_id', null, 'sfGuardSecurityUser'))
{

$id = $this->getAttribute('user_id', null, 'sfGuardSecurityUser');
if (!$this->user)
{
于 2012-06-22T18:12:10.383 回答