【发布时间】: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 使用文件名。