`

ken\trade

 
阅读更多
<?php

namespace ken\trade;

use Yii;
use yii\base\BootstrapInterface;
use yii\web\ForbiddenHttpException;

/**
 * 交易模块 - Ken Trade
 *
 * 使用配置
 *
 * ~~~
 * return [
 *     'bootstrap' => ['ktrade'],
 *     'modules' => [
 *         'ktrade' => [
 *             'class' => 'ken\trade\Module',
 *             'allowedIPs' => ['127.0.0.1', '192.168.*.*'],
 *         ],
 *     ],
 * ]
 * ~~~
 *
 * 默认时此模块仅允许在 localhost 上进行访问,也可以通过配置 
 *     [[allowedIPs]] 属性来让其它机器访问.
 * 
 * 访问地址: `http://localhost/path/to/index.php?r=gii`
 *
 * 如果启用url 美化功能 [[\yii\web\UrlManager::enablePrettyUrl|pretty URLs]],
 * 则访问地址为: `http://localhost/path/to/index.php/gii`
 *
 * @author Xiaohan Xu <vb2005xu@qq.com>
 * @since 2.0
 */
class Module extends \yii\base\Module implements BootstrapInterface
{
    /**
     * @inheritdoc
     */
    public $controllerNamespace = 'ken\trade\controllers';

    /**
     * @var array 
     * 
     * 默认只允许 localhost 访问.
     * 也可以设置 外网机器访问,例如 ['127.0.0.1', '192.168.*.*']
     */
    public $allowedIPs = ['127.0.0.1', '::1'];
    public $allowedHosts = [];
    
    /**
     * @var string 交易日志的目录
     */
    public $logPath = '@runtime/ktrade';

    /**
     * @var array 对外访问的api列表
     */
    public $apis = [];

    /**
     * @inheritdoc
     */
    public function init()
    {
        parent::init();
        $this->logPath = Yii::getAlias($this->logPath);
    }
    
    /**
     * @inheritdoc
     */
    public function bootstrap($app)
    {
        $app->getUrlManager()->addRules([
            $this->id => $this->id,
            $this->id . '/<controller:[\w\-]+>/<action:[\w\-]+>' => $this->id . '/<controller>/<action>',
        ], false);
    }

    /**
     * @inheritdoc
     */
    public function beforeAction($action)
    {
        if (!parent::beforeAction($action)) {
            return false;
        }

        if (Yii::$app instanceof \yii\web\Application && !$this->checkAccess()) {
            throw new ForbiddenHttpException('You are not allowed to access this page.');
        }

        foreach (array_merge($this->coreApis(), $this->apis) as $id => $config) {
            $this->apis[$id] = Yii::createObject($config);
        }

        $this->resetGlobalSettings();

        return true;
    }

    /**
     * Resets potentially incompatible global settings done in app config.
     */
    protected function resetGlobalSettings()
    {
        if (Yii::$app instanceof \yii\web\Application) {
            Yii::$app->assetManager->bundles = [];
        }
    }

    /**
     * @return boolean whether the module can be accessed by the current user
     */
    protected function checkAccess()
    {
        $ip = Yii::$app->getRequest()->getUserIP();
        foreach ($this->allowedIPs as $filter) {
            if ($filter === '*' || $filter === $ip || (($pos = strpos($filter, '*')) !== false && !strncmp($ip, $filter, $pos))) {
                return true;
            }
        }
        foreach ($this->allowedHosts as $hostname) {
            $filter = gethostbyname($hostname);
            if ($filter === $ip) {
                return true;
            }
        }
        Yii::warning('拒绝访问 kentrade. 请求的 IP 是 ' . $ip, __METHOD__);
        return false;
    }

    /**
     * 返回 交易模块提供的对外api接口
     * @return array
     *
     *
     * 
     */
    protected function coreApis()
    {
        return [
            'pay' => ['class' => 'ken\trade\apis'],
            'pay' => ['class' => 'ken\trade\apis'],
        ];
    }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics