【问题标题】:Yii PHP Framework: Unable to require_once inside YiiYii PHP 框架:无法在 Yii 中使用 require_once
【发布时间】:2013-01-29 01:13:26
【问题描述】:

我正在尝试在 Yii 中实现重写的 Ext.Direct 功能。一切都很顺利,除了我无法让doRpc 函数正常工作,这对应用程序正常工作至关重要,该函数在Sencha Ext.Direct Tutorial 中定义,尽管我对其进行了一些更改,所以这是我的重写代码:

组件/Ext_Router.php

class Ext_Router extends CApplicationComponent
{
    public function doRpc($cdata)
    {
        $API = Yii::app()->ext_api->getApi();
        try {
            if(!isset($API[$cdata->action])){
                throw new Exception('Call to undefined action: ' . $cdata->action);
            }

            $action = $cdata->action;
            $a = $API[$action];

            Yii::app()->ext_router->doAroundCalls($a['before'], $cdata);

            $method = $cdata->method;
            $mdef = $a['methods'][$method];
            if(!$mdef){
                throw new Exception("Call to undefined method: $method on action $action");
            }
            Yii::app()->ext_router->doAroundCalls($mdef['before'], $cdata);

            $r = array(
                'type'=>'rpc',
                'tid'=>$cdata->tid,
                'action'=>$action,
                'method'=>$method
            );

            // TODO require_once always returns: No such file or directory
            require_once("index.php?r=direct/classes/index&classaction=$action");

            $o = new $action();
            if (isset($mdef['len'])) {
                $params = isset($cdata->data) && is_array($cdata->data) ? $cdata->data : array();
            } else {
                $params = array($cdata->data);
            }

            $r['result'] = call_user_func_array(array($o, $method), $params);

            Yii::app()->ext_router->doAroundCalls($mdef['after'], $cdata, $r);
            Yii::app()->ext_router->doAroundCalls($a['after'], $cdata, $r);
        }
        catch(Exception $e){
            $r['type'] = 'exception';
            $r['message'] = $e->getMessage();
            $r['where'] = $e->getTraceAsString();
        }
        return $r;
    }

    public function doAroundCalls(&$fns, &$cdata, &$returnData=null)
    {
        if(!$fns){
            return;
        }
        if(is_array($fns)){
            foreach($fns as $f){
                $f($cdata, $returnData);
            }
        }else{
            $fns($cdata, $returnData);
        }
    }
}

modules/direct/controllers/ClassesController.php

class ClassesController extends Controller
{
    public function actionIndex($classaction)
    {
        $this->render("$classaction");
    }
}

modules/direct/views/classes/Temporary.php

class Temporary
{
    protected $_result;
    public $results;

    public function getResults(stdClass $params)
    {
        $_result = Temporary::model()->findAllByAttributes(array('id'=>Yii::app()->session['id']));

        $results = array();

        if($_results != null) {
            foreach($_result as $row) {
                $results[] = $row;
            }
        }

        return $results;
    }   

    ...
}

问题:

require_once("index.php?r=direct/classes/index&classaction=$action");

规避此问题的最佳方法是什么?我如何“解析”/包含/需要这个 PHP 文件?

(请记住,我还没有测试我的 Temporary.php,因为我根本没有克服当前的错误)

【问题讨论】:

  • 我不确定你想在这里做什么。预期的结果是什么?
  • 我正在尝试使用require_once 来包含调用中指定的文件。对于这种情况,它被命名为Temporary,因此它将变为require_once("index.php?r=direct/classes/index&classaction=Temporary"); - 但对于其他操作,它将是另外的东西。但是require_once 总是导致:require_once(index.php?r=direct/classes/index&classaction=Temporary): failed to open stream: No such file or directory
  • 因为没有名为index.php?r=direct/classes/index&classaction=Temporary的文件。这不是一个有效的文件名。 include 文件名,而不是 URL。
  • 那我该如何'解析'/include/require这个PHP文件呢?使用 Yii 绕过它的最佳方法是什么?因为我不能为 require_once 使用 URL,也不能为 Yii 使用文件名。

标签: php extjs yii


【解决方案1】:

使用Yii's import

<?php
Yii::import('application.modules.direct.views.classes.Temporary');

【讨论】:

  • 正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多