在Yii中正确实现runWithParams()

时间:2012-02-03 18:31:40

标签: php yii

如果您在此链接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().

我很困惑这意味着什么?我不明白如何成功实现这一点。

2 个答案:

答案 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"
}

实施方式是:

  1. runAction() CController中获取带有getActionParams()的$ _GET参数(如果有的话)
  2. runAction()将这些参数传递给runWithParams()
  3. runWithParams()使用PHP Reflection查看操作方法是否包含参数(例如$param1
    1. 如果有参数,则使用$ _GET参数调用runWithParamsInternal()
      1. runWithParamsInternal()使用$ _GET参数调用run()方法(例如run($param1)
    2. 否则只需拨打run(),不带任何参数
  4. 使用它完全是可选的,你仍然可以在你的动作中正常访问$ _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')