包 | 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 设置为了 public 成员变量。 但开发者应该使用 changeRequestUDI() 方法来修改 $module_name 等变量。
请求包含的命名空间
请求包含的控制器名称
请求包含的动作名
附加的参数
路由对象
当前请求 URL
当前请求 URL 不包含查询参数的部分
当前请求 URL 的目录部分
路由模式
UDI 的默认值
public void reinit($full_init)
$full_init | boolean | 是否进行完全的初始化 |
{return} |
根据服务器运行环境,重新初始化 QContext 对象
public static QContext instance()
返回 QContext 对象的唯一实例
$context = QContext::instance();
public mixed __get($parameter)
$parameter | string | 要访问的请求参数 |
{return} | mixed | 参数值 |
魔法方法,访问请求参数
__get() 魔法方法让开发者可以用 $context->parameter 的形式访问请求参数。 如果指定的参数不存在,则返回 null。
$title = $context->title;
查找请求参数的顺行是 $_GET、$_POST 和 QContext 对象附加参数。
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');
public boolean __isset($parameter)
$parameter | string | 要检查的参数 |
{return} | boolean | 是否具有指定参数 |
魔法方法,确定是否包含指定的参数
public void __unset($parameter)
$parameter | string | 要删除的参数 |
{return} |
删除指定的附加参数
__unset() 魔法方法只影响 QContext 对象的附加参数。
unset($context['title']); // 此时读取 title 附加参数将获得 null echo $context->param('title');
public boolean offsetExists($parameter)
$parameter | string | 要检查的参数 |
{return} | boolean | 参数是否存在 |
确定是否包含指定的参数,实现 ArrayAccess 接口
echo isset($context['title']);
public void offsetSet($parameter, $value)
$parameter | string | 要设置的参数 |
$value | mixed | 参数值 |
{return} |
设置附加参数,实现 ArrayAccess 接口
该方法功能同 __set() 魔法方法。
$context['title'] = $title; echo $context->param('title');
public mixed offsetGet($parameter)
$parameter | string | 要访问的请求参数 |
{return} | mixed | 参数值 |
访问请求参数,实现 ArrayAccess 接口
$title = $context['title'];
public void offsetUnset($parameter)
$parameter | string | 要取消的附加参数 |
{return} |
取消附加参数,实现 ArrayAccess 接口
同 __unset() 方法,QContext::offsetUnset() 只影响 QContext 对象的附加参数。
unset($context['title']);
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 对象附加参数。
public mixed get($parameter, $default)
$parameter | string | 要查询的参数名 |
$default | mixed | 参数不存在时要返回的默认值 |
{return} | mixed | 参数值 |
获得 GET 数据
从 $_GET 中获得指定参数,如果参数不存在则返回 $default 指定的默认值。
$title = $context->get('title', 'default title');
如果 $parameter 参数为 null,则返回整个 $_GET 的内容。
public mixed post($parameter, $default)
$parameter | string | 要查询的参数名 |
$default | mixed | 参数不存在时要返回的默认值 |
{return} | mixed | 参数值 |
获得 POST 数据
从 $_POST 中获得指定参数,如果参数不存在则返回 $default 指定的默认值。
$body = $context->post('body', 'default body');
如果 $parameter 参数为 null,则返回整个 $_POST 的内容。
public mixed cookie($parameter, $default)
$parameter | string | 要查询的参数名 |
$default | mixed | 参数不存在时要返回的默认值 |
{return} | mixed | 参数值 |
获得 Cookie 数据
从 $_COOKIE 中获得指定参数,如果参数不存在则返回 $default 指定的默认值。
$auto_login = $context->cookie('auto_login');
如果 $parameter 参数为 null,则返回整个 $_COOKIE 的内容。
public mixed server($parameter, $default)
$parameter | string | 要查询的参数名 |
$default | mixed | 参数不存在时要返回的默认值 |
{return} | mixed | 参数值 |
从 $_SERVER 查询服务器运行环境数据
如果参数不存在则返回 $default 指定的默认值。
$request_time = $context->server('REQUEST_TIME');
如果 $parameter 参数为 null,则返回整个 $_SERVER 的内容。
public mixed env($parameter, $default)
$parameter | string | 要查询的参数名 |
$default | mixed | 参数不存在时要返回的默认值 |
{return} | mixed | 参数值 |
从 $_ENV 查询服务器运行环境数据
如果参数不存在则返回 $default 指定的默认值。
$os_type = $context->env('OS', 'non-win');
如果 $parameter 参数为 null,则返回整个 $_ENV 的内容。
public QContext changeParam($parameter, $value)
$parameter | string | 要设置的参数名 |
$value | mixed | 参数值 |
{return} | QContext | 返回 QContext 对象本身,实现连贯接口 |
设置 QContext 对象的附加参数
$context->changeParam('arg', $value);
public mixed param($parameter, $default)
$parameter | string | 要查询的参数名 |
$default | mixed | 参数不存在时要返回的默认值 |
{return} | mixed | 参数值 |
获得 QContext 对象的附加参数
如果参数不存在则返回 $default 指定的默认值。
$value = $context->param('arg', 'default value');
如果 $parameter 参数为 null,则返回所有附加参数的内容。
public array params()
返回所有上下文参数
public string protocol()
取得当前请求使用的协议
返回值不包含协议的版本。常见的返回值是 HTTP。
$protocol = $context->protocol(); echo $protocol;
public QContext changeRequestUri($request_uri)
$request_uri | string | 新的 REQUEST_URI 值 |
{return} | QContext | 返回 QContext 对象本身,实现连贯接口 |
设置 REQUEST_URI
这项修改不会影响 $_SERVER 中值,但是修改后 QContext::requestUri() 将返回新值。 同时还影响 QContext::baseUri() 和 QContext::baseDir() 的返回结果。
public string requestUri()
确定请求的完整 URL
几个示例:
此方法参考 Zend Framework 实现。
public string baseUri()
返回不包含任何查询参数的 URI(但包含脚本名称)
几个示例:
此方法参考 Zend Framework 实现。
public string baseDir()
返回请求 URL 中的基础路径(不包含脚本名称)
几个示例:
public string serverPort()
返回服务器响应请求使用的端口
通常服务器使用 80 端口与客户端通信,该方法可以获得服务器所使用的端口号。
public string scriptName()
获得响应请求的脚本文件名
public string pathinfo()
返回 PATHINFO 信息
此方法参考 Zend Framework 实现。
public string requestMethod()
返回请求使用的方法
public boolean isGET()
是否是 GET 请求
public boolean isPOST()
是否是 POST 请求
public boolean isPUT()
是否是 PUT 请求
public boolean isDELETE()
是否是 DELETE 请求
public boolean isHEAD()
是否是 HEAD 请求
public boolean isOPTIONS()
是否是 OPTIONS 请求
public boolean isAJAX()
判断 HTTP 请求是否是通过 XMLHttp 发起的
public boolean isFlash()
判断 HTTP 请求是否是通过 Flash 发起的
public string requestRawBody()
返回请求的原始内容
public string header($header)
$header | string | 要查询的请求头参数 |
{return} | string | 参数值 |
返回 HTTP 请求头中的指定信息,如果没有指定参数则返回 false
public string referer()
返回当前请求的参照 URL
public QRouter router()
返回当前使用的路由服务对象
如果没有启动路由,则返回 null。
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。可用的选项有:
public string UDIString($udi)
$udi | array | 要处理的 UDI |
{return} | string |
返回 UDI 的字符串表现形式
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。
public string|array requestUDI($return_array)
$return_array | boolean | 是否返回数组形式的 UDI |
{return} | string|array | 对应当前请求的 UDI |
返回当前请求对应的 UDI
将当前请求中包含的控制器、动作、名字空间和模块名提取出来,构造为一个 UDI。
dump($context->requestUDI());
public QContext changeRequestUDI($udi)
$udi | array|string | 要设置的 UDI |
{return} | QContext | 返回 QContext 对象本身,实现连贯接口 |
将 QContext 对象保存的请求参数设置为 UDI 指定的值
$context->changeRequestUDI('posts/edit'); // 将输出 posts echo $context->controller_name;