第九区

一个程序员的经验笔记

yii2用actions方法实现外部action统一加载

| 暂无评论

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:

  1. InlineAction
  2. CaptchaAction
  3. CreateAction
  4. DeleteAction
  5. IndexAction
  6. OptionsAction
  7. UpdateAction
  8. ViewAction
  9. ErrorAction
  10. 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配置不同的视图。

<h1>TestAction</h1>
<p>这是TestAction演示页面!</p>

第五步:现在,TestAction已经完成了,我们可以输入网址预览一下:

testAction页面截图

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

可看到显示结果:

testAction参数传递截图

testAction参数传递截图

至此,testAction就完成了。

THE END

 

 

发表评论

*为必填字段!