代理方法在sfGuardSecurityUser中不起作用

时间:2011-03-04 12:26:02

标签: php methods symfony1 proxy sfdoctrineguard

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

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

然后我尝试访问其属性:

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

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

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

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

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

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

更新

经过几周的发展,问题又出现了。这次是从使用$sf_user变量的视图开始的。我可以用

获取ID
$sf_user->getGuardUser()->getId()

但不是

$sf_user->getId()

以下是我自己的回答。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

感谢@Matt Gibson的评论,我回顾了sfDoctrineGuardPlugin的安装过程。我似乎在某个地方犯了一个错字,因为现在一切都很好,两者都是

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

$this->getUsername()

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

$this->getGuardUser()->getId()

答案 2 :(得分:0)

只需将您的代理方法添加到您的User类中,就没有那么多。

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

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

答案 3 :(得分: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)
{