Yii ActiveRecord和控制台命令无法正常工作

时间:2014-12-02 23:15:47

标签: php activerecord yii console command

与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个strack跟踪线:

    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() - &gt; 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;

    }

}

2 个答案:

答案 0 :(得分:1)

使用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.*',
    ),

希望这可以解决您的问题,同时也要注意虽然这可能是自动加载几个类,但您可能不需要所有类,但使用特定名称文件的名称而不是*通配符可能是最佳做法。

答案 1 :(得分:0)

好的,我最终弄清楚客户端是否包含了一个我错过的模型。它现在解决了感谢人们给予的洞察力