如果您在此链接http://www.yiiframework.com/doc/guide/1.1/en/basics.controller中查看#3,它会为您提供一种将所有控制器功能组织到单个php文件中的方法。
要做到这一点,你必须让每个php文件包含一个扩展CAction的类。每个类必须在函数run()中包含其运行代码。
这是我的UserController.php文件
public function actions()
{
$FOLDER = '.User';
$PROJECT_ROOT = 'application.controllers' . $FOLDER;
return array (
'list' => $PROJECT_ROOT . 'ListAction',
);
}
在我写的应用程序中,我需要将变量传递给特定的Actions。
Yii在Yii 1.7中实现了runWithParams($ params)以允许这种情况发生。但是,当我在(例如)DeleteAction.php文件runWithParams($ params)而不是run()中调用write而我们的前端调用post / delete /?params = 45而不是run()时,我得到一个错误“无法在文件DeleteAction.php中找到run()
class ListAction extends CAction
{
public function runWithParam($id)
{
SiteController::actionLoggedin();
$id = addslashes($id);
}
这意味着我需要run()...但是我无法将参数传递给run()。我需要runWithParams($ params)。
在函数runWithParams($ params)的文档中 http://www.yiiframework.com/doc/api/1.1/CAction#runWithParams-detail
它说
Runs the action with the supplied request parameters. This method is internally called by CController::runAction().
我很困惑这意味着什么?我不明白如何成功实现这一点。
答案 0 :(得分:4)
您只需要在CAction类中实现run()
。
您可以自动访问$ _GET参数,当然,就像您正常行动一样:
class ListAction extends CAction {
public function run() {
$id = $_GET['id']; // $_POST works too
$model = Model::model()->findbyPk($id);
// render your view next, whatever
}
}
如果要从Controller传递其他常量到CAction,可以这样做:
在Controller的操作设置中:
public function actions() {
return array(
'userSearch'=>array(
'class'=>'application.controllers.User.ListAction', // path alias to your action
'model'=>'User',
'otherVariable'=>'something here',
));
}
然后在您的CAction中:
class ListAction extends CAction {
public $modelName;
public $otherVariable;
public function run() {
$this->modelName; // 'User' - passed in from the calling Controller
$this->otherVariable; // 'something here' - passed in from the calling Controller
}
}
我不确定您可能希望将哪些其他参数传递给您的操作,但这应该涵盖它。我希望有所帮助!
更新
这个问题让我更深入地看了代码,这实际上与Yii的一个我不知道的功能有关。如果您在操作上声明了一个参数(即function actionTest($param)
),那么Yii将解析请求的$ _GET参数,并使用传入该函数的参数调用Action。因此,您不必自己获取$ _GET参数。像这样:
http://example.com/mycontroller/myaction?param1=test
function actionMyaction($param1) { // in a CAction, it would be run($param1)
echo '$_GET parameter param1 set to '.$param1; // will echo "test"
}
实施方式是:
runAction()
CController中获取带有getActionParams()
的$ _GET参数(如果有的话)runAction()
将这些参数传递给runWithParams()
runWithParams()
使用PHP Reflection查看操作方法是否包含参数(例如$param1
)
runWithParamsInternal()
runWithParamsInternal()
使用$ _GET参数调用run()
方法(例如run($param1)
)run()
,不带任何参数使用它完全是可选的,你仍然可以在你的动作中正常访问$ _GET参数。基本上,这只是强制执行所需的$ _GET参数。如果您的操作需要参数但请求URL中没有$ _GET参数,则Yii会从invalidActionParams()
返回“错误400”。它为您节省了在行动中检查isset($_GET)
的负担,这很酷。
答案 1 :(得分:0)
从同一个Yii指南中,您可以在说明中指出:
从1.1.7版开始,自动参数绑定也有效 用于基于类的操作。当动作类的run()方法是 用一些参数定义,它们将填充 相应的命名请求参数值。例如,
class UpdateAction extends CAction
{
public function run($id)
{
// $id will be populated with $_GET['id']
}
}
就这么简单。在run()中定义所需的所有参数。
当然,您可以随时获取$ _GET [&#39; key&#39;]或Yii :: app() - &gt; request-&gt; getQuery(&#39; key&#39;)< / p>
如果您在运行中添加它们,请知道如果您并不总是要传递所有参数,则可以设置默认值,否则您将收到错误。
示例:
public function run($id, $other_param='default_value')