Yii 活动记录和控制台命令不起作用


Yii ActiveRecord and Console Commands not working

当与 Yii 控制台命令结合使用时,我在使用 Yii + CDbCriteria/ActiveRecord 时遇到了问题

Yii 版本 1.1.13

下面的代码在从控制器调用时有效。因为 HTTP 会话是可访问的。

$criteria=new CDbCriteria;
$criteria->select='first_name';
$criteria->condition='id=:contactid';
$criteria->params=array(':contactid'=>4);
$contact=Contact::model()->find($criteria); // <-- exception occurs here... strange
echo '<pre>';
var_dump($contact->first_name);
echo '</pre>';

但是,当通过 Yii 控制台命令访问时,我收到以下错误和前 2 条跟踪跟踪行:

    exception 'CException' with message 'CConsoleApplication and its behaviors do not have a method or closure named "getSessiorks/yii/1.1.13/base/CComponent.php:265
Stack trace:
#0 /home/stm/stm_frameworks/yii/1.1.13/web/auth/CWebUser.php(193): CComponent->__call('getSession', Array)
#1 /home/stm/stm_frameworks/yii/1.1.13/web/auth/CWebUser.php(193): CConsoleApplication->getSession()

我可以理解会话不可用于控制台命令,但为什么它甚至访问会话?我对 Yii 框架不是很好。[class]::mode()->find($criteria) 我应该如何使用 ActiveRecord 膨胀对象?似乎与我在网上找到的示例相匹配

任何帮助都非常感谢

下面是命令类的示例

<?php
class FlahCommand extends CConsoleCommand
{
    var $id;
    public function actionIndex() {
        return 0; // not implemented
    }
    public function actionBlah($contactId=0) {
        $criteria=new CDbCriteria;
        $criteria->select='first_name';
        $criteria->condition='id=:contactid';
        $criteria->params=array(':contactid'=>$contactId);
        $contact=Contact::model()->find($criteria); // <-- exception occurs here... strange
        echo '<pre>';
        var_dump($contact->first_name);
        echo '</pre>';
        return 0;
    }
}

在使用 yii 控制台功能时,请注意控制台应用程序的配置文件console.php就像main.php存储 yii Web 应用程序的参数和选项一样。所以,当你在yii 1.1.13中创建一个应用程序时,默认情况下它在console.php内没有导入参数,这个参数负责处理yii自动加载的一部分,所以你会缺少类,我所做的是在我的console.php中添加以下内容作为文件中数组的新元素

'import'=>array(
            'application.models.*',
            'application.components.*',
            'application.behaviors.*',
            'application.modules.content.*',
            'application.modules.content.models.*',
            'application.extensions.*',
    ),

希望这能解决您的问题,请注意,尽管这是自动加载多个类,但您可能不需要所有类,但使用特定名称文件的名称而不是*通配符可能是最佳实践。

好的,

我最终发现客户端包含了一个我错过的模型。现在解决了,感谢人们给出的见解