访问symfony 1.4中的扩展类


access to extended class in symfony 1.4

所以。。。我基本上遵循了实用的符号书,并遇到了以下问题。我已经正确地(我想)安装了sfGuardPlugin,构建了模型、sql等,创建了用户,并尝试使用输入的用户名和密码登录。

我收到以下错误消息:

Fatal error: Call to undefined method sfGuardUserPeer::retrieveByUsername() in /***/plugins/sfGuardPlugin/lib/validator/sfGuardValidatorUser.class.php on line 53

它在我看来很奇怪,因为sfGuardValidatorUser类的问题部分看起来像这样:

// user exists?
if ($user = sfGuardUserPeer::retrieveByUsername($username))
{
  // password is ok?
  if ($user->getIsActive() && $user->checkPassword($password))
  {
    return array_merge($values, array('user' => $user));
  }
}

而sfGuardUserPeer只有空类:

class sfGuardUserPeer extends PluginsfGuardUserPeer
{
}

它扩展了PluginsfGuardUserPeer,所以我也检查了一下:

class PluginsfGuardUserPeer extends BasesfGuardUserPeer
{
  public static function retrieveByUsername($username, $isActive = true)
  {
    $c = new Criteria();
    $c->add(self::USERNAME, $username);
    $c->add(self::IS_ACTIVE, $isActive);
    return self::doSelectOne($c);
  }
}

这就是缺失的功能!

那么,怎么了?为什么它不起作用?我已经尝试了谷歌的所有解决方案,但都不起作用:/

终于找到了!

symfony propel:build-model

任务不必要地从插件目录中的架构文件生成了模型目录中的sfGuard类,而所有类都已存在于sfGuard文件夹中。

天哪,在这样一个发达的框架和插件中不应该发生这种情况。。。

简单地说

public static function retrieveByUsername($username, $isActive = true)
  {
    $c = new Criteria();
    $c->add(self::USERNAME, $username);
    $c->add(self::IS_ACTIVE, $isActive);
    return self::doSelectOne($c);
  } 

将代码写入您的sfGuardUserPeer类,这将解决问题,当我收到这个错误时,我也做了同样的操作,它对我有效。