Redbean和Yii冲突?

时间:2012-03-23 11:53:23

标签: php yii redbean

所以这里是普通Yii控制器中代码的重要部分。

Yii::import('application.vendors.*');
    require_once('redbean/rb.php');

$config = Yii::app()->getComponents(false);

R::setup($config['db']['connectionString'],
$config['db']['username'],
$config['db']['password'])

$guest = R::dispense( 'guest' );
$guest->email = $row['Guest Email'];

错误发生在allocse()行。

  

include(Model_Guestx.php)function.include:无法打开流:否   这样的文件或目录(路径   编辑 \ framework \ YiiBase.php:418)

#0 路径   编辑 \ framework \ YiiBase.php(418):CWebApplication-> handleError()

问题是为什么Yii试图加载一个名称与redbean同名的模型?

谢谢!

4 个答案:

答案 0 :(得分:1)

我不知道是什么触发了Yii自动加载器,但是您可以包含以下代码以使Yii跳过由Redbean创建的任何模型:

public static function autoload($className)
    {
    if(!strncmp("Model_", $className, strlen("Model_")))
        return true;
    //...rest of yii code...

如果将其添加到YiiBase.php代码的开头,它将忽略以" Model _"开头的模型,这是Redbean使用的。我知道它是一个黑客,但除非你创建你打算与Yii一起使用的模型,它们属于该命名类别,否则它不应该是一个问题。

答案 1 :(得分:0)

Yii有自己的类自动加载器,不知何故(可能在检查模型是否存在时)Redbean创建一个看起来像PHP文件的字符串。所以Yii试图加入它。

您可以在使用Redbean之前禁用yii自动加载器;完成之后重新启用它:

    // Turn off our amazing library autoload 
    spl_autoload_unregister(array('YiiBase','autoload'));   

    Yii::import('application.vendors.*');
    require_once('rb.php');

    R::setup('mysql:host=localhost;dbname=dbname', 'user', 'password');

    $guest = R::dispense('guest');
    $guest->email = $row['Guest Email'];

    // Once we have finished using the library, give back the 
    // power to Yii... 
    spl_autoload_register(array('YiiBase','autoload'));


    $this->render('index');

归功于: http://www.yiiframework.com/wiki/101/how-to-use-phpexcel-external-library-with-yii/

答案 2 :(得分:0)

如果你想让它更具通用性,为什么不使用事件beforeControllerAction()和afterControllerAction()来禁用和启用专用于redbena的基本控制器中的Yii自动加载,或者如果你只想使用redbean。

像:

public function beforeControllerAction(){
spl_autoload_unregister(array('YiiBase','autoload'));   
// other code to execute...
parent::beforeControllerAction(); 
}

    public function afterControllerAction(){
spl_autoload_register(array('YiiBase','autoload'));

// other code to execute...
parent::afterControllerAction();
}

答案 3 :(得分:0)

如果你想在没有任何选项的情况下使用Readbean ORM,你可以使用类似

的redbean查询
$result = R::$f->begin()->select('*')->from('users')->where(' username = ? ')->put($_xusername)->get('row');

这里你不需要注册或取消注册自动加载