通过Yii2中的自定义控制器为特定用户启用调试器工具

时间:2018-08-03 08:07:20

标签: yii2 yii2-basic-app

要启用调试器工具,我们修改 web / index.php 文件

defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod');

如何在自定义控制器中覆盖或更改这些变量?

class CommonController extends Controller {
  public function init() {
    $user_id = 1;
    if($user_id == 1){
      defined('YII_DEBUG') or define('YII_DEBUG', true);
      defined('YII_ENV') or define('YII_ENV', 'dev');
    }
  }
}

目标是为特定用户启用调试器。我知道有一种方法可以解决AllowedIps。但是,我一直在寻找特殊的用户。有可能吗?

1 个答案:

答案 0 :(得分:0)

  

基于此article

在某个地方创建了一个新类,我使用了common\components\Debug。从yii\debug\Module扩展它,并用所需的逻辑覆盖checkAccess()

<?php

namespace common\components;

class Debug extends \yii\debug\Module
{
    private $_basePath;

    protected function checkAccess()
    {
        $user = \Yii::$app->getUser();

        if (
            $user->identity &&
            $user->can('admin')
        ) {    
            return true;
        }
        //return parent::checkAccess();
    }

    /**
     * @return string root directory of the module.
     * @throws \ReflectionException
     */
    public function getBasePath()
    {
        if ($this->_basePath === null) {
            $class = new \ReflectionClass(new \yii\debug\Module('debug'));
            $this->_basePath = dirname($class->getFileName());
        }

        return $this->_basePath;
    }
}

然后为您需要的应​​用更新您的main-local.php

if (!YII_ENV_TEST) {
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'common\components\Debug', // <--- Here
    ];

    ...
}

这当然将为所有用户运行调试器,但仅向管理员显示。这可能会给您的应用程序带来一些不必要的开销,但是调试过程会在检查身份之前开始。