gpt4 book ai didi

php - 使用 Yii 框架的 "extends CAction"类

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:06:28 25 4
gpt4 key购买 nike

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

我想把我的 Action 从一个 Controller 放到一个单独的 Action 文件中并按照说明“创建一个 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);
}

}

在我的 Controller 中

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',
),
);
}
}

然后我使用浏览单独的 Action Controller

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

我的错误是

LoginAction and its behaviors do not have a method or closure named "render".

我做错了什么吗?谢谢。

这是堆栈跟踪

CException LoginAction and its behaviors do not have a method or closure named "render".

D:\xampp\htdocs\mysite\framework\base\CComponent.php(266)

254 public function __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
throw new CException(Yii::t('yii','{class} and its behaviors do not have a method or closure named "{name}".', 267
array('{class}'=>get_class($this), '{name}'=>$name))); 268 } 269 270 /** 271 * Returns the named behavior object. 272 * The name 'asa' stands for 'as a'. 273 * @param string $behavior the behavior name 274 * @return IBehavior the behavior object, or null if the behavior does not exist 275 */ 276 public function asa($behavior) 277 { 278 return isset($this->_m[$behavior]) ? $this->_m[$behavior] : null; Stack Trace

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)

    5

  • 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

最佳答案

问题出在这行代码上:

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

如果它在 Controller 中,这会很好,但是一旦代码被移动到专用操作类中,就不再有 render 方法可以在 $this 上调用>,因此出现错误。

您只需要先获取对 Controller 的引用,然后在其上调用render:

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

关于php - 使用 Yii 框架的 "extends CAction"类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9563562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com