使用Yii框架的“​​extends CAction”类

时间:2012-03-05 08:23:28

标签: php yii magic-methods

在Yii框架的本教程中 http://www.yiiframework.com/doc/guide/1.1/en/basics.controller#action

我想将我的操作从控制器放到单独的操作文件中 并按照说明“创建一个Action类”

这是我的动作类文件

class LoginAction extends CAction
{

    private $contents = array();
    public function run(){
        $loginmodel = new LoginForm;

        //answer ajax validating request
        if(isset($_POST['ajax']) && $_POST['ajax']==='login-form'){
            echo CActiveForm::validate($loginmodel);
            Yii::app()->end();
        }

        //collect user input data to do login
        if(isset($_POST["LoginForm"]))
        {
            $loginmodel->attributes = $_POST["LoginForm"];
            // validate user input and redirect to the previous page if valid
            if($loginmodel->validate() && $loginmodel->login()){ //<--invoking here the login and validate function
                $this->redirect(Yii::app()->user->returnUrl);
            }
        }

        $this->contents["loginmodel"] =  $loginmodel;
        $this->render('index',$this->contents); 
    }    

}

并在我的控制器中

class SandboxController extends Controller{       
    public function actions(){
        // return external action classes, e.g.:
            return array(
            'authlog'=>'application.controllers.authentication.LoginAction',
            // page action renders "static" pages stored under 'protected/views/site/pages'
            // They can be accessed via: index.php?r=site/page&view=FileName
            'page'=>array(
                'class'=>'CViewAction',
            ),
        );   
    }
}

然后我使用

浏览单独的动作控制器
  

http://localhost/mysite/index.php/sandbox/authlog/login

我的错误是

  

LoginAction及其行为没有命名的方法或闭包   “渲染”。

我做错了什么?感谢。

这是stacktrace

  

CException LoginAction及其行为没有方法或   闭包名为“渲染”。

     

d:\ XAMPP \ htdocs中\ mysite的\框架\碱\ CComponent.php(266)

     

254 public function __call($ name,$ parameters)255 {256
  if($ this-&gt; _m!== null)257 {258 foreach($ this-&gt; _m   作为$ object)259 {260
  if($ object-&gt; getEnabled()&amp;&amp; method_exists($ object,$ name))261
  return call_user_func_array(array($ object,$ name),$ parameters); 262个
  } 263} 264 if(class_exists('Closure',false)&amp;&amp;   $ this-&gt; canGetProperty($ name)&amp;&amp; $ this-&gt; $ name instanceof Closure)265
  return call_user_func_array($ this-&gt; $ name,$ parameters); 266个
  抛出新的CException(Yii :: t('yii','{class}及其行为不会   有一个名为“{name}”的方法或闭包。',267
  数组('{class}'=&gt; get_class($ this),'{name}'=&gt; $ name))); 268} 269   270 / ** 271 *返回指定的行为对象。 272 *   'asa'这个名字代表'as a'。 273 * @param string $行为   行为名称274 * @return IBehavior行为对象,或   如果行为不存在则为null 275 * / 276 public   function asa($ behavior)277 {278 return   isset($ this-&gt; _m [$ behavior])? $ this-&gt; _m [$ behavior]:null;堆栈跟踪

     

0

     
      
  • d:\ XAMPP \ htdocs中\ mysite的\保护\控制器\认证\ LoginAction.php(26):   CComponent-&gt; __ call(“render”,array(“index”,array(“loginmodel”=&gt;   LoginForm的)))

         

    1

  •   
  • d:\ XAMPP \ htdocs中\ mysite的\保护\控制器\认证\ LoginAction.php(26):   LoginAction-&gt; render(“index”,array(“loginmodel”=&gt; LoginForm))

         

    2

  •   
  • D:\ xampp \ htdocs \ mysite \ framework \ web \ actions \ CAction.php(75):LoginAction-&gt; run()

         

    3

  •   
  • D:\ xampp \ htdocs \ mysite \ framework \ web \ CController.php(309):CAction-&gt; runWithParams(array(“login”=&gt;“”))

         

    4

  •   
  • D:\ xampp \ htdocs \ mysite \ framework \ web \ CController.php(287):CController-&gt; runAction(LoginAction)

         

    5

  •   
  • D:\ xampp \ htdocs \ mysite \ framework \ web \ CController.php(266):CController-&gt; runActionWithFilters(LoginAction,array())

         

    6

  •   
  • D:\ xampp \ htdocs \ mysite \ framework \ web \ CWebApplication.php(276):CController-&gt; run(“authlog”)

         

    7

  •   
  • D:\ xampp \ htdocs \ mysite \ framework \ web \ CWebApplication.php(135):CWebApplication-&gt; runController(“sandbox / authlog / login”)

         

    8

  •   
  • D:\ xampp \ htdocs \ mysite \ framework \ base \ CApplication.php(162):CWebApplication-&gt; processRequest()

         

    9

  •   
  • D:\ xampp \ htdocs \ mysite \ index.php(13):CApplication-&gt; run()2012-03-05 09:37:43 Apache / 2.2.21(Win32)mod_ssl / 2.2 0.21   OpenSSL / 1.0.0e PHP / 5.3.8 mod_perl / 2.0.4 Perl / v5.10.1 Yii   框架/ 1.1.10

  •   

2 个答案:

答案 0 :(得分:7)

问题在于这行代码:

$this->render('index',$this->contents);

如果它在控制器内部就没问题,但是一旦代码在专用动作类中移动,就不再需要在render上调用$this方法,因此错误。< / p>

您只需首先获得对控制器的引用,然后在其上调用render

$controller=$this->getController();
$controller->render('index',$this->contents);

答案 1 :(得分:2)

您可以扩展您的操作以访问任何控制器方法:

//MyAction.php
<?php

class MyAction extends CAction
{
    public function render($view, array $options=array())
    {
        $this->getController()->render($view, $options);
    }
}

//LoginAction.php:
<?php

class LoginAction extends MyAction
{
(...)