5

我遇到了这个错误,每当我在 shell 中运行我的简单 cron 脚本时,知道如何解决这个问题吗?从错误本身来看,当我放置

'user' => array(
    // enable cookie-based authentication
     'allowAutoLogin' => true,
 'loginUrl' => array('myaccount/blah/login'),

在控制台配置中,它正在寻找一个“类”,我应该在该数组中包含什么类?,这个用户登录 url 在登录和身份验证中使用了 LDAP 东西,我该怎么办?

4

5 回答 5

4

CConsoleApplication用于处理离线任务。例如,应用程序在 linux 系统中启动一个 cronjob。该应用程序每天都会检查您网站的注册用户是否应该更改其密码,因为它必须每 3 个月更改一次。如果密码过期发送电子邮件。
要预先选择用户,您已经设置了范围条件来检查用户的状态,以及限制登录用户对她自己的数据的范围:

    public function scopes(){
                 return array(...,
                    'user'    => array(
                                   'condition'=>'id='.Yii::app()->user->id, 
                                 ),
                    'active'  => array(
                                   'condition'=>'status='.self::STATUS_ACTIVE,
                                 ), ...
                        );
    }

现在,在您的CCA代码中,您使用活动范围来获取所有用户: $usersArray = User::model()->active()->findAll(); ...foreach.... 这里的问题在于使用扩展类CActiveRecord -class。主要用作模型中的类扩展,这些模型存储在数据库中。在这个CActiveRecord -class 中,CActiveRecord->__call函数用于获取模型的所有存储范围。之后,该类将实际请求的范围与其余的数据库标准合并。首先加载所有范围的事实在加载用户范围时发生错误,包括Yii::app()->user->id。网络用户被调用并抛出异常'CException'并带有消息'属性'CConsoleApplication.user未定义'。你不会调用WebUser,但自动为你安排这个:-)

所以,像schmunk说的那样去做。在您的范围代码中生成一个异常部分,确保Yii::app()->user不调用它:

 public function scopes(){
         if (Yii::app() instanceof CConsoleApplication) {
              $user = array(''); //no condition 
         }else{
              $user = array(
                        'condition'=>'id='.Yii::app()->user->id, 
                      );
         }
         return array(
              'user'    => $user,
              'active'  => array(
                                   'condition'=>'status='.self::STATUS_ACTIVE,
                           ), ...
         );
 }

我希望解释有所帮助,也许还有其他问题。

于 2014-07-18T13:00:39.153 回答
3

简短回答:您不能在控制台应用程序中使用 CWebUser。不要将它包含在你的config/console.php

Long(er) 回答:如果您依赖需要 CWebUser 的组件,则必须在组件中检测到这一点并为这种情况创建某种解决方法。如果您正在运行控制台应用程序,请查看此代码片段以获取如何检测的示例。

于 2013-05-02T14:10:49.133 回答
3

尝试这个

public static $console_user_id;

public function init() {
    if (Yii::app() instanceof CConsoleApplication) {
        if (self::$console_user_id) $this->id = self::$console_user_id;
        return false;
    }
    parent::init();
}
于 2014-12-18T14:00:57.323 回答
0

通过使用更新解决了我的问题,而不是保存在脚本中......不需要使用用户数组和 CWebUser 类

于 2013-05-02T15:38:09.627 回答
0

我有同样的问题。筛选了此处给出的所有答案并找到了一些好点,但以我的方式解决了我的问题,尽管它可能不是最好的。

首先,我必须弄清楚我的 Cron Jon 抛出了上述异常,因为在 Cron 作业中我正在运行一个脚本,其中包含这部分代码

if(Yii::app()->user->isAdmin()) {...} else {...}

由于未定义用户,因此控制台抛出了错误。我以测试控制台是否正在运行它的方式更改了我的代码。修改后的代码如下:

$console = false;
try {
    $test = Yii::app()->user->isAdmin();
}
catch (CException $e)  {
    $console = true;
}
if($console || (!$console && Yii::app()->user->isAdmin()) {...} else {...}

如前所述,并不完美,但也许是某人的解决方案。

于 2015-12-28T09:50:47.297 回答