Как исправить 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 {...}
Как сказано, не идеально, но, возможно, решение для кого-то.