在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',
),
);
}
}
然后我使用
浏览单独的动作控制器我的错误是
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
答案 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
{
(...)