YII2框架开发程序时,很多时候会遇到一些功能大致相同的方法,这时候,可以选择把这些方法统一写到外部以方便管理。
例如在yii2的演示包里siteController.php文件中就有一段:
public function actions(){return ['error' => ['class' => 'yii\web\ErrorAction',],//返回错误'captcha' => ['class' => 'yii\captcha\CaptchaAction','fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,],//返回验证];}
在这段程序里,分别用到了error和captcha两个外部action,分别用来回显错误和校验图形验证码。我们可以在vendor/yiisoft/yii2里找到对应的程序文件。
类似的,Yii2共提供了如下action:
InlineAction
CaptchaAction
CreateAction
DeleteAction
IndexAction
OptionsAction
UpdateAction
ViewAction
ErrorAction
GenerateAction
仿造这些文件,我们也可以编写自己的外部action。
第一步:找到frontend/libs文件夹,新建 文件TestAction.php
自写义的外部action,可以放到任意位置,作为示例,我把它放到网站的frontend/libs里面。
第二步:在文件TestAction.php中输入代码:
仿照已有的action文件,在新建的TestAction.php文件中写入如下内容:
<?php
namespace frontend\libs;
use yii\base\Action;
class TestAction extends Action {public function run() {return $this->controller->render('test');}
}
第三步:在SiteController里调用testAction:
修改SiteController的function actions,加上以下代码中的高亮部分:
public function actions(){return ['error' => ['class' => 'yii\web\ErrorAction',],//返回错误'captcha' => ['class' => 'yii\captcha\CaptchaAction','fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,],//返回验证'test'=>['class'=>'frontend\libs\TestAction',]];}
第四步:在views/site下添加test.php视图文件
在TestAction中我们调用了视图,所以,需要添加相应的视图文件。如果在多个不同的controller中用到TestAction,那么,可以为每个controller配置不同的视图。
view/test.php
<h1>TestAction</h1>
<p>这是TestAction演示页面!</p>
第五步:现在,TestAction已经完成了,我们可以输入网址预览一下:
接下来,我们可以试试为testAction添加参数:
第六步:修改TestAction.php,添加待输入的三个参数:
<?php
namespace frontend\libs;
use yii\base\Action;
class TestAction extends Action {public $param1=NULL;public $param2=NULL;public function run($get=NULL) {return $this->controller->render('test',['get'=>$get,'param1'=>$this->param1,'param2'=>$this->param2]);}
}
这段代码中需要配置三个参数,$get、$param1、$param2,其中$get是在url中传递的,例如按照我电脑上的配置,访问http://127.0.0.8/index.php?r=site%2Ftest&get=xxx,就会为$get赋值xxx。而$param1和$param2则是在controller中设置的。
第七步:修改SiteController的function actions,为$param1和$param2赋值
public function actions(){return ['error' => ['class' => 'yii\web\ErrorAction',],'captcha' => ['class' => 'yii\captcha\CaptchaAction','fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,],'test'=>['class'=>'frontend\libs\TestAction','param1'=>'参数一','param2'=>'参数二',]];}
这样,$param1和$param2参数就传递过去了。
最后,配置视图views/site/test.php完成测试:
<h1>TestAction</h1>
<p>这是TestAction演示页面!</p>
<p>$get="<?=$get?>"</p>
<p>$param1="<?=$param1?>"</p>
<p>$param2="<?=$param2?>"</p>
按各人本地路径访问网址如:http://127.0.0.8/index.php?r=site%2Ftest&get=xxx
可看到显示结果