使用Yii框架的"​​extends CAction"类

Mp *_*ega 4 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); 
    }    

}
Run Code Online (Sandbox Code Playgroud)

在我的控制器中

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',
            ),
        );   
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用浏览单独的动作控制器

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

而我的错误是

LoginAction及其行为没有名为"render"的方法或闭包.

我做错了什么?谢谢.

这是堆栈跟踪

CException LoginAction及其行为没有名为"render"的方法或闭包.

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

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

0

  • D:\ xampp\htdocs\mysite\protected\controllers\authentication\LoginAction.php(26):CComponent - > __ call("render",array("index",array("loginmodel"=> LoginForm)))

    1

  • D:\ xampp\htdocs\mysite\protected\controllers\authentication\LoginAction.php(26):LoginAction-> render("index",array("loginmodel"=> LoginForm))

    2

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

    3

  • D:\ xampp\htdocs\mysite\framework\web\CController.php(309):CAction-> runWithParams(array("login"=>""))

    4

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

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

    6

  • D:\ xampp\htdocs\mysite\framework\web\CWebApplication.php(276):CController-> run("authlog")

    7

  • D:\ xampp\htdocs\mysite\framework\web\CWebApplication.php(135):CWebApplication-> runController("sandbox/authlog/login")

    8

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

    9

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

Jon*_*Jon 7

问题在于这行代码:

$this->render('index',$this->contents);
Run Code Online (Sandbox Code Playgroud)

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

您只需要首先获得对控制器的引用并调用render:

$controller=$this->getController();
$controller->render('index',$this->contents);
Run Code Online (Sandbox Code Playgroud)