四十四、逐行阅读Yii2.0.43_Yii框架文件yii\web\Request.php(11)

一、属性

1. $_port 端口号

2. $_securePort 端口号(安全连接)

3. $_contentType 内容类型

4. $_languages 语言

    //端口号
    private $_port;

    //端口号(安全连接)
    private $_securePort;

    //内容类型
    private $_contentTypes;

    //语言
    private $_languages;

 二、方法

1. getPort方法,返回端口号

    // 返回端口号
    public function getPort()
    {
        if ($this->_port === null) {
            $serverPort = $this->getServerPort();
            $this->_port = !$this->getIsSecureConnection() && $serverPort !== null ?
 $serverPort : 80;
        }

        return $this->_port;
    }

2. setPort方法,设置端口号

    //设置端口
    public function setPort($value)
    {
        if ($value != $this->_port) {
            $this->_port = (int) $value;
            $this->_hostInfo = null;
        }
    }

3. getSecurePort方法,返回端口号(安全连接)

    // 端口号(安全连接)
    public function getSecurePort()
    {
        if ($this->_securePort === null) {
            $serverPort = $this->getServerPort();
            $this->_securePort = $this->getIsSecureConnection() && $serverPort !== null ?
                $serverPort : 
                443;
        }

        return $this->_securePort;
    }

4. setSecurePort方法,设置端口号(安全连接)

    //设置端口号(安全连接)
    public function setSecurePort($value)
    {
        if ($value != $this->_securePort) {
            $this->_securePort = (int) $value;
            $this->_hostInfo = null;
        }
    }

 5. getAcceptableContentTypes方法,返回可接受的内容类型

    // 解析Accept请求头
    public function getAcceptableContentTypes()
    {
        if ($this->_contentTypes === null) {
            if ($this->headers->get('Accept') !== null) {
                $this->_contentTypes = $this->parseAcceptHeader(
                    $this->headers->get('Accept')
                );
            } else {
                $this->_contentTypes = [];
            }
        }

        return $this->_contentTypes;
    }

6. setAcceptableContentTypes方法,设置可接受的内容类型

    // 设置可接受的内容类型
    public function setAcceptableContentTypes($value)
    {
        $this->_contentTypes = $value;
    }

7. getContentType方法,返回内容类型

    //请求的内容类型
    public function getContentType()
    {
        if (isset($_SERVER['CONTENT_TYPE'])) {
            return $_SERVER['CONTENT_TYPE'];
        }

        //fix bug https://bugs.php.net/bug.php?id=66606
        // 请求头中获取
        return $this->headers->get('Content-Type');
    }

8. getAcceptableLanguages方法,终端用户的可接受的语言列表

    // 终端用户可接受的语言列表
    public function getAcceptableLanguages()
    {
        if ($this->_languages === null) {
            if ($this->headers->has('Accept-Language')) {
                $this->_languages = array_keys(
                    $this->parseAcceptHeader(
                        $this->headers->get('Accept-Language')
                    )
                );
            } else {
                $this->_languages = [];
            }
        }

        return $this->_languages;
    }

9. setAcceptableLanguages方法,设置语言列表

    // 设置语言列表
    public function setAcceptableLanguages($value)
    {
        $this->_languages = $value;
    }

10. parseAcceptHeader方法,解析Accept或Accept-language请求头

    //解析“Accept”(或“Accept- language”)请求头
    public function parseAcceptHeader($header)
    {
        $accepts = [];
        foreach (explode(',', $header) as $i => $part) {
            $params = preg_split('/\s*;\s*/', trim($part), -1, PREG_SPLIT_NO_EMPTY);
            if (empty($params)) {
                continue;
            }
            $values = [
                'q' => [$i, array_shift($params), 1],
            ];
            foreach ($params as $param) {
                if (strpos($param, '=') !== false) {
                    list($key, $value) = explode('=', $param, 2);
                    if ($key === 'q') {
                        $values['q'][2] = (float) $value;
                    } else {
                        $values[$key] = $value;
                    }
                } else {
                    $values[] = $param;
                }
            }
            $accepts[] = $values;
        }

        usort($accepts, function ($a, $b) {
            $a = $a['q']; // index, name, q
            $b = $b['q'];
            if ($a[2] > $b[2]) {
                return -1;
            }

            if ($a[2] < $b[2]) {
                return 1;
            }

            if ($a[1] === $b[1]) {
                return $a[0] > $b[0] ? 1 : -1;
            }

            if ($a[1] === '*/*') {
                return 1;
            }

            if ($b[1] === '*/*') {
                return -1;
            }

            $wa = $a[1][strlen($a[1]) - 1] === '*';
            $wb = $b[1][strlen($b[1]) - 1] === '*';
            if ($wa xor $wb) {
                return $wa ? 1 : -1;
            }

            return $a[0] > $b[0] ? 1 : -1;
        });

        $result = [];
        foreach ($accepts as $accept) {
            $name = $accept['q'][1];
            $accept['q'] = $accept['q'][2];
            $result[$name] = $accept;
        }

        return $result;
    }

11. getPreferredLanguage方法,返回首选项语言

    // 返回首选语言
    public function getPreferredLanguage(array $languages = [])
    {
        if (empty($languages)) {
            return Yii::$app->language;
        }
        foreach ($this->getAcceptableLanguages() as $acceptableLanguage) {
            $acceptableLanguage = str_replace('_', '-', strtolower($acceptableLanguage));
            foreach ($languages as $language) {
                $normalizedLanguage = str_replace('_', '-', strtolower($language));

                if (
                    $normalizedLanguage === $acceptableLanguage // en-us==en-us
                    || strpos($acceptableLanguage, $normalizedLanguage . '-') === 0 // en==en-us
                    || strpos($normalizedLanguage, $acceptableLanguage . '-') === 0 // en-us==en
                ) {
                    return $language;
                }
            }
        }

        return reset($languages);
    }

12. getETags方法,解析ETag头

    // Etags
    public function getETags()
    {
        if ($this->headers->has('If-None-Match')) {
            return preg_split(
                '/[\s,]+/', 
                str_replace(
                    '-gzip', 
                    '', 
                    $this->headers->get('If-None-Match'
                    )
                ), -1, PREG_SPLIT_NO_EMPTY);
        }

        return [];
    }

 

总结:

 阅读了4个属性和12个方法:

  • $_port 端口号
  • $_securePort 端口号(安全连接)
  • $_contentType 内容类型
  • $_languages 语言
  • getPort方法,返回端口号
  • setPort方法,设置端口号
  • getSecurePort方法,返回端口号(安全连接)
  • setSecurePort方法,设置端口号(安全连接)
  • getAcceptableContentTypes方法,返回可接受的内容类型
  • setAcceptableContentTypes方法,设置可接受的内容类型
  • getContentType方法,返回内容类型
  • getAcceptableLanguages方法,终端用户的可接受的语言列表
  • setAcceptableLanguages方法,设置语言列表
  • parseAcceptHeader方法,解析Accept或Accept-language请求头
  • getPreferredLanguage方法,返回首选项语言
  • getETags方法,解析ETag头
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值