使用一个基础控制器

在许多框架中,通常会在指导中提出基础控制器的概念,它可以被其它控制器扩展。在Yii中,它不在指导中,因为你可以用其它多种方式很灵活的达到。但是,使用一个基础控制器是可能的,并且是有用的。

假设我们想添加添加一些控制器,它们只能被登录的用于访问。我们当然可以为每一个控制器单独设置一些限制,但是我们将会用一种更好的方式来做到它。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。

如何做…

  1. 首先,我们需要一个基础控制器,它只能被登录的用于使用。创建@app/components/BaseController.php,内容如下:
  1. <?php
  2. namespace app\components;
  3. use Yii;
  4. use yii\web\Controller;
  5. use yii\filters\AccessControl;
  6. class BaseController extends Controller
  7. {
  8. public function actions()
  9. {
  10. return [
  11. 'error' => ['class' => 'yii\web\ErrorAction'],
  12. ];
  13. }
  14. public function behaviors()
  15. {
  16. return [
  17. 'access' => [
  18. 'class' => AccessControl::className(),
  19. 'rules' => [
  20. [
  21. 'allow' => true,
  22. 'actions' => 'error'
  23. ],
  24. [
  25. 'allow' => true,
  26. 'roles' => ['@'],
  27. ],
  28. ],
  29. ]
  30. ];
  31. }
  32. }

这个控制器有一个动作map,此外还有一个错误动作。

  1. 现在,使用Gii创建TestController,但是将基础类设置为app/components/BaseController

使用一个基础控制器 - 图1

你将会得到类似如下的输出:

  1. <?php
  2. namespace app\controllers;
  3. class TestController extends \app\components\BaseController
  4. {
  5. public function actionIndex()
  6. {
  7. return $this->render('index');
  8. }
  9. }
  1. 现在,你的TestController只能被登录用户访问,尽管我们没有在TestController控制器中做明确的说明。你可以在登出的时候通过访问http://yii-book.app/index.php?r=test/index来检查它。

工作原理…

这个把戏只是一个类继承。如果过滤器或者访问控制规则不在TestController,那么他们将会从SecureController中调用。

更多…

如果你需要继承基础控制器的方法,记住它不能被覆盖。例如,我们需要添加一个页面动作到控制器的动作map中:

  1. <?php
  2. namespace app\controllers;
  3. use yii\helpers\ArrayHelper;
  4. use app\components\BaseController;
  5. class TestController extends BaseController
  6. {
  7. public function actions()
  8. {
  9. return ArrayHelper::merge(parent::actions(), [
  10. 'page' => [
  11. 'class' => 'yii\web\ViewAction',
  12. ],
  13. ]);
  14. }
  15. public function behaviors()
  16. {
  17. $behaviors = parent::behaviors();
  18. $rules = $behaviors['access']['rules'];
  19. $rules = ArrayHelper::merge(
  20. $rules,
  21. [
  22. [
  23. 'allow' => true,
  24. 'actions' => ['page']
  25. ]
  26. ]
  27. );
  28. $behaviors['access']['rules'] = $rules;
  29. return $behaviors;
  30. }
  31. public function actionIndex()
  32. {
  33. return $this->render('index');
  34. }
  35. }

欲了解更多信息,参考http://www.yiiframework.com/doc-2.0/yii-base-controller.html