Как исправить CConsoleApplication.user неопределенным в классе команды в рамках Yii Framework?

Я получаю эту ошибку, всякий раз, когда я запускаю свой простой скрипт cron в shell, есть идеи, как это исправить? Из самой ошибки говорится, что.user не зависит, когда я помещаю

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

в конфигурации консоли он ищет "класс", какой класс я должен включить в этот массив?, этот URL для входа пользователя использует LDAP-контент для входа и аутентификации, что мне делать?

5 ответов

Решение

Решил мою проблему с помощью обновления, вместо сохранения в сценарии... нет необходимости использовать пользовательский массив и класс CWebUser

Приложение CConsoleApplication предназначено для обработки автономных задач. Например, приложение запускает cronjob в системе linux. Приложение каждый день проверяет, должен ли зарегистрированный пользователь вашего сайта менять свой пароль, потому что его нужно менять каждые 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 функция вызова CActiveRecord->__ используется для получения всех сохраненных областей действия модели. После этого класс объединил фактически запрошенные области с остальными критериями базы данных. Тот факт, что все области загружаются первыми, вызывает ошибку при загрузке пользовательской области, включает Yii::app()->user->id, WebUser вызывается и выдает исключение "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,
                           ), ...
         );
 }

Я надеюсь, что объяснение помогает и, возможно, также для других проблем.

Краткий ответ: Вы не можете использовать CWebUser в консольном приложении. Не включайте это в свой config/console.php

Длинный (er) ответ: Если вы полагаетесь на компонент, которому нужен CWebUser, вам придется обнаружить это в компоненте и создать какой-то обходной путь для этого случая. Посмотрите на этот фрагмент кода, чтобы узнать, как определить, запускаете ли вы консольное приложение.

Попробуй это

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();
}

У меня такая же проблема. Изучил все ответы, приведенные здесь, и нашел кое-что хорошее, но решил свою проблему по-своему, хотя, возможно, и не самый лучший.

Прежде всего я должен был выяснить, что мой 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 {...}

Как сказано, не идеально, но, возможно, решение для кого-то.

Другие вопросы по тегам