包 core

包 mvc

包 orm

包 form

包 database

包 helper

包 cache

包 webcontrols

包 behavior

包 exception

包 debug

类 - QContext

core
类层次 class QContext
实现的接口
版本 $Id: context.php 2647 2009-08-14 01:42:29Z jerry $

QContext 封装了运行时上下文

所谓运行时上下文是指 QeePHP 应用程序的运行环境本身。 QContext 主要封装了请求参数和请求状态,以及 URL 解析等功能。

QContext 使用了单子设计模式,因此只能使用 QContext::instance() 来获得 QContext 对象的唯一实例。

QContext 实现了 ArrayAccess 接口,可以将 QContext 对象当作数组一样使用。

if (isset($context['title']))
{
    echo $context['title'];
}

公开的属性

隐藏继承的属性

属性类型描述定义于
$module_name string 请求包含的模块名 QContext
$namespace string 请求包含的命名空间 QContext
$controller_name string 请求包含的控制器名称 QContext
$action_name string 请求包含的动作名 QContext

公共方法

隐藏继承的方法

方法描述定义于
reinit() 根据服务器运行环境,重新初始化 QContext 对象 QContext
instance() 返回 QContext 对象的唯一实例 QContext
__get() 魔法方法,访问请求参数 QContext
__set() 魔法方法,设置附加参数 QContext
__isset() 魔法方法,确定是否包含指定的参数 QContext
__unset() 删除指定的附加参数 QContext
offsetExists() 确定是否包含指定的参数,实现 ArrayAccess 接口 QContext
offsetSet() 设置附加参数,实现 ArrayAccess 接口 QContext
offsetGet() 访问请求参数,实现 ArrayAccess 接口 QContext
offsetUnset() 取消附加参数,实现 ArrayAccess 接口 QContext
query() 魔法方法,访问请求参数 QContext
get() 获得 GET 数据 QContext
post() 获得 POST 数据 QContext
cookie() 获得 Cookie 数据 QContext
server() 从 $_SERVER 查询服务器运行环境数据 QContext
env() 从 $_ENV 查询服务器运行环境数据 QContext
changeParam() 设置 QContext 对象的附加参数 QContext
param() 获得 QContext 对象的附加参数 QContext
params() 返回所有上下文参数 QContext
protocol() 取得当前请求使用的协议 QContext
changeRequestUri() 设置 REQUEST_URI QContext
requestUri() 确定请求的完整 URL QContext
baseUri() 返回不包含任何查询参数的 URI(但包含脚本名称) QContext
baseDir() 返回请求 URL 中的基础路径(不包含脚本名称) QContext
serverPort() 返回服务器响应请求使用的端口 QContext
scriptName() 获得响应请求的脚本文件名 QContext
pathinfo() 返回 PATHINFO 信息 QContext
requestMethod() 返回请求使用的方法 QContext
isGET() 是否是 GET 请求 QContext
isPOST() 是否是 POST 请求 QContext
isPUT() 是否是 PUT 请求 QContext
isDELETE() 是否是 DELETE 请求 QContext
isHEAD() 是否是 HEAD 请求 QContext
isOPTIONS() 是否是 OPTIONS 请求 QContext
isAJAX() 判断 HTTP 请求是否是通过 XMLHttp 发起的 QContext
isFlash() 判断 HTTP 请求是否是通过 Flash 发起的 QContext
requestRawBody() 返回请求的原始内容 QContext
header() 返回 HTTP 请求头中的指定信息,如果没有指定参数则返回 false QContext
referer() 返回当前请求的参照 URL QContext
router() 返回当前使用的路由服务对象 QContext
url() 构造 url QContext
UDIString() 返回 UDI 的字符串表现形式 QContext
normalizeUDI() 返回规范化以后的 UDI 数组 QContext
requestUDI() 返回当前请求对应的 UDI QContext
changeRequestUDI() 将 QContext 对象保存的请求参数设置为 UDI 指定的值 QContext

属性详细说明

$module_name 属性

请求包含的模块名

为了性能原因,$module_name 设置为了 public 成员变量。 但开发者应该使用 changeRequestUDI() 方法来修改 $module_name 等变量。

$namespace 属性

请求包含的命名空间

$controller_name 属性

请求包含的控制器名称

$action_name 属性

请求包含的动作名

$_params 属性

附加的参数

$_router 属性

路由对象

$_request_uri 属性

当前请求 URL

$_base_uri 属性

当前请求 URL 不包含查询参数的部分

$_base_dir 属性

当前请求 URL 的目录部分

$_url_mode 属性

路由模式

$_udi_defaults 属性

UDI 的默认值

方法详细说明

reinit() 方法

public void reinit($full_init)

$full_init boolean 是否进行完全的初始化
{return}

根据服务器运行环境,重新初始化 QContext 对象


instance() 方法

public static QContext instance()

返回 QContext 对象的唯一实例

$context = QContext::instance();

__get() 方法

public mixed __get($parameter)

$parameter string 要访问的请求参数
{return} mixed 参数值

魔法方法,访问请求参数

__get() 魔法方法让开发者可以用 $context->parameter 的形式访问请求参数。 如果指定的参数不存在,则返回 null。

$title = $context->title;

查找请求参数的顺行是 $_GET、$_POST 和 QContext 对象附加参数。


__set() 方法

public void __set($parameter, $value)

$parameter string 要设置值的参数名
$value mixed 参数值
{return}

魔法方法,设置附加参数

与 __get() 魔法方法不同,__set() 仅仅设置 QContext 对象附加参数。 因此当 $_GET 或 $_POST 中包含同名参数时,用 __set() 设置的参数值 只能使用 QContext::param() 方法来获得。

$context->title = $title;
echo $context->param('title');

__isset() 方法

public boolean __isset($parameter)

$parameter string 要检查的参数
{return} boolean 是否具有指定参数

魔法方法,确定是否包含指定的参数


__unset() 方法

public void __unset($parameter)

$parameter string 要删除的参数
{return}

删除指定的附加参数

__unset() 魔法方法只影响 QContext 对象的附加参数。

unset($context['title']);
// 此时读取 title 附加参数将获得 null
echo $context->param('title');

offsetExists() 方法

public boolean offsetExists($parameter)

$parameter string 要检查的参数
{return} boolean 参数是否存在

确定是否包含指定的参数,实现 ArrayAccess 接口

echo isset($context['title']);

offsetSet() 方法

public void offsetSet($parameter, $value)

$parameter string 要设置的参数
$value mixed 参数值
{return}

设置附加参数,实现 ArrayAccess 接口

该方法功能同 __set() 魔法方法。

$context['title'] = $title;
echo $context->param('title');

offsetGet() 方法

public mixed offsetGet($parameter)

$parameter string 要访问的请求参数
{return} mixed 参数值

访问请求参数,实现 ArrayAccess 接口

$title = $context['title'];

offsetUnset() 方法

public void offsetUnset($parameter)

$parameter string 要取消的附加参数
{return}

取消附加参数,实现 ArrayAccess 接口

同 __unset() 方法,QContext::offsetUnset() 只影响 QContext 对象的附加参数。

unset($context['title']);

query() 方法

public mixed query($parameter, $default)

$parameter string 要访问的请求参数
$default mixed 参数不存在时要返回的默认值
{return} mixed 参数值

魔法方法,访问请求参数

QContext::get() 方法让开发者可以用 $context->parameter 的形式访问请求参数。 如果指定的参数不存在,则返回 $default 参数指定的默认值。

$title = $context->query('title', 'default title');

查找请求参数的顺行是$_POST、$_GET、$_REQUEST 和 QContext 对象附加参数。


get() 方法

public mixed get($parameter, $default)

$parameter string 要查询的参数名
$default mixed 参数不存在时要返回的默认值
{return} mixed 参数值

获得 GET 数据

从 $_GET 中获得指定参数,如果参数不存在则返回 $default 指定的默认值。

$title = $context->get('title', 'default title');

如果 $parameter 参数为 null,则返回整个 $_GET 的内容。


post() 方法

public mixed post($parameter, $default)

$parameter string 要查询的参数名
$default mixed 参数不存在时要返回的默认值
{return} mixed 参数值

获得 POST 数据

从 $_POST 中获得指定参数,如果参数不存在则返回 $default 指定的默认值。

$body = $context->post('body', 'default body');

如果 $parameter 参数为 null,则返回整个 $_POST 的内容。


cookie() 方法

public mixed cookie($parameter, $default)

$parameter string 要查询的参数名
$default mixed 参数不存在时要返回的默认值
{return} mixed 参数值

获得 Cookie 数据

从 $_COOKIE 中获得指定参数,如果参数不存在则返回 $default 指定的默认值。

$auto_login = $context->cookie('auto_login');

如果 $parameter 参数为 null,则返回整个 $_COOKIE 的内容。


server() 方法

public mixed server($parameter, $default)

$parameter string 要查询的参数名
$default mixed 参数不存在时要返回的默认值
{return} mixed 参数值

从 $_SERVER 查询服务器运行环境数据

如果参数不存在则返回 $default 指定的默认值。

$request_time = $context->server('REQUEST_TIME');

如果 $parameter 参数为 null,则返回整个 $_SERVER 的内容。


env() 方法

public mixed env($parameter, $default)

$parameter string 要查询的参数名
$default mixed 参数不存在时要返回的默认值
{return} mixed 参数值

从 $_ENV 查询服务器运行环境数据

如果参数不存在则返回 $default 指定的默认值。

$os_type = $context->env('OS', 'non-win');

如果 $parameter 参数为 null,则返回整个 $_ENV 的内容。


changeParam() 方法

public QContext changeParam($parameter, $value)

$parameter string 要设置的参数名
$value mixed 参数值
{return} QContext 返回 QContext 对象本身,实现连贯接口

设置 QContext 对象的附加参数

$context->changeParam('arg', $value);

param() 方法

public mixed param($parameter, $default)

$parameter string 要查询的参数名
$default mixed 参数不存在时要返回的默认值
{return} mixed 参数值

获得 QContext 对象的附加参数

如果参数不存在则返回 $default 指定的默认值。

$value = $context->param('arg', 'default value');

如果 $parameter 参数为 null,则返回所有附加参数的内容。


params() 方法

public array params()

返回所有上下文参数


protocol() 方法

public string protocol()

取得当前请求使用的协议

返回值不包含协议的版本。常见的返回值是 HTTP。

$protocol = $context->protocol();
echo $protocol;

changeRequestUri() 方法

public QContext changeRequestUri($request_uri)

$request_uri string 新的 REQUEST_URI 值
{return} QContext 返回 QContext 对象本身,实现连贯接口

设置 REQUEST_URI

这项修改不会影响 $_SERVER 中值,但是修改后 QContext::requestUri() 将返回新值。 同时还影响 QContext::baseUri() 和 QContext::baseDir() 的返回结果。


requestUri() 方法

public string requestUri()

确定请求的完整 URL

几个示例:

此方法参考 Zend Framework 实现。


baseUri() 方法

public string baseUri()

返回不包含任何查询参数的 URI(但包含脚本名称)

几个示例:

此方法参考 Zend Framework 实现。


baseDir() 方法

public string baseDir()

返回请求 URL 中的基础路径(不包含脚本名称)

几个示例:


serverPort() 方法

public string serverPort()

返回服务器响应请求使用的端口

通常服务器使用 80 端口与客户端通信,该方法可以获得服务器所使用的端口号。


scriptName() 方法

public string scriptName()

获得响应请求的脚本文件名


pathinfo() 方法

public string pathinfo()

返回 PATHINFO 信息

此方法参考 Zend Framework 实现。


requestMethod() 方法

public string requestMethod()

返回请求使用的方法


isGET() 方法

public boolean isGET()

是否是 GET 请求


isPOST() 方法

public boolean isPOST()

是否是 POST 请求


isPUT() 方法

public boolean isPUT()

是否是 PUT 请求


isDELETE() 方法

public boolean isDELETE()

是否是 DELETE 请求


isHEAD() 方法

public boolean isHEAD()

是否是 HEAD 请求


isOPTIONS() 方法

public boolean isOPTIONS()

是否是 OPTIONS 请求


isAJAX() 方法

public boolean isAJAX()

判断 HTTP 请求是否是通过 XMLHttp 发起的


isFlash() 方法

public boolean isFlash()

判断 HTTP 请求是否是通过 Flash 发起的


requestRawBody() 方法

public string requestRawBody()

返回请求的原始内容


header() 方法

public string header($header)

$header string 要查询的请求头参数
{return} string 参数值

返回 HTTP 请求头中的指定信息,如果没有指定参数则返回 false


referer() 方法

public string referer()

返回当前请求的参照 URL


router() 方法

public QRouter router()

返回当前使用的路由服务对象

如果没有启动路由,则返回 null。


url() 方法

public string url($udi, $params, $route_name, $opts)

$udi string UDI 字符串
$params array|string 附加参数数组
$route_name string 路由名
$opts array 控制如何生成 URL 的选项
{return} string 生成的 URL 地址

构造 url

用法:

url(UDI, [附加参数数组], [路由名])

UDI 是统一目的地标识符(Uniform Destination Identifier)的缩写。 UDI 由控制器、动作、名字空间以及模块名组成,采用如下的格式:

namespace::controller/action@module

UDI 字符串中,每一个部分都是可选的。 如果没有提供控制器和动作名,则使用当前的控制器和默认动作名(index)代替。 同样,如果未提供模块名和名字空间,均使用当前值代替。

UDI 字符串写法示例:

'controller'
'controller/action'
'/action'
'controller@module'
'controller/action@module'
'namespace::controller'
'namespace::controller/action'
'namespace::controller@module'
'namespace::controller/action@module'
'@module'
'namespace::@module'

示例:

url('admin::posts/edit', array('id' => $post->id()));

$params 参数除了采用数组,还可以是以“/”符号分割的字符串:

url('posts/index', 'page/3');
url('users/show', 'id/5/profile/yes');

在使用 PATHINFO 和 URL 重写时,可以使用通过制定路由名来强制要求 QeePHP 采用指定的路由规则来生成 URL。强制指定路由规则可以加快 URL 的生成, 但在路由规则名称发生变化时,需要修改生成 URL 的代码。

$opts 参数用于控制如何生成 URL。可用的选项有:

  • base_uri: 指定 URL 前部要添加的路径(可以包括协议、域名和端口,以及路径)
  • script: 指定 URL 前部要使用的脚本名
  • mode: 指定 URL 生成模式,可以是 standard、pathinfo 和 rewrite

UDIString() 方法

public string UDIString($udi)

$udi array 要处理的 UDI
{return} string

返回 UDI 的字符串表现形式


normalizeUDI() 方法

public array normalizeUDI($udi, $return_array)

$udi string|array 要处理的 UDI
$return_array boolean 是否返回数组形式的 UDI
{return} array 处理后的 UDI

返回规范化以后的 UDI 数组

$udi = array(
    QContext::UDI_CONTROLLER => '',
    QContext::UDI_ACTION     => '',
    QContext::UDI_NAMESPACE  => '',
    QContext::UDI_MODULE     => '',
);
 
// 输出
// array(
//     controller: default
//     action:     index
//     namespace:  default
//     module:     default
// )
dump($context->normalizeUDI($udi));
 
$udi = 'admin::posts/edit';
// 输出
// array(
//     controller: posts
//     action:     edit
//     namespace:  admin
//     module:     default
// )
dump($context->normalizeUDI($udi));

如果要返回字符串形式的 UDI,设置 $return_array 参数为 false。


requestUDI() 方法

public string|array requestUDI($return_array)

$return_array boolean 是否返回数组形式的 UDI
{return} string|array 对应当前请求的 UDI

返回当前请求对应的 UDI

将当前请求中包含的控制器、动作、名字空间和模块名提取出来,构造为一个 UDI。

dump($context->requestUDI());

changeRequestUDI() 方法

public QContext changeRequestUDI($udi)

$udi array|string 要设置的 UDI
{return} QContext 返回 QContext 对象本身,实现连贯接口

将 QContext 对象保存的请求参数设置为 UDI 指定的值

$context->changeRequestUDI('posts/edit');
// 将输出 posts
echo $context->controller_name;