DI服务速查:各资源服务一览表
“完成,好过完美。” -- 脸谱书文化之一
1.19.1 一览表
变量名称 | 是否启动时自动注册 | 是否必须 | 接口/类 | 作用说明 |
---|---|---|---|---|
loader | 否 | 是 | PhalApi_Loader | 自动加载:负责PEAR风格下类的自动加载,需要手动注册,指定项目路径 |
config | 否 | 是 | PhalApi_Config | 配置:负责项目配置的读取,需要手动注册,指定存储媒介,默认是PhalApi_Config_File |
logger | 否 | 是 | PhalApi_Logger | 日志纪录:负责日志的写入,需要手动注册,指定日志级别和存储媒介,默认是PhalApi_Logger_File |
request | 是 | 是 | PhalApi_Request | 接口参数请求:用于收集接口请求的参数 |
response | 是 | 是 | PhalApi_Response | 结果响应:用于输出返回给客户端的结果,默认为PhalApi_Response_Json |
notorm | 否 | 推荐 | PhalApi_DB_NotORM | 数据操作:基于NotORM的DB操作,需要手动注册,指定数据库配置 |
cache | 否 | 推荐 | PhalApi_Cache | 缓存:实现缓存读写,需要手动注册,指定缓存 |
filter | 否 | 推荐 | PhalApi_Filter | 拦截器:实现签名验证、权限控制等操作 |
crypt | 否 | 否 | PhalApi_Crypt | 对称加密:实现对称加密和解密,需要手动注册 |
curl | 否 | 否 | PhalApi_CUrl | CURL请求类:通过curl实现的快捷方便的接口请求类,需要手动注册 |
cookie | 否 | 否 | PhalApi_Cookie | COOKIE的操作 |
debug | 否 | 否 | boolean | 应用级的调试开关,通常可从配置读取,暂时框架未用到 |
_formatterArray | 否 | 否 | PhalApi_Request_Formatter_Array | 数组格式化服务(系统内部使用) |
_formatterBoolean | 否 | 否 | PhalApi_Request_Formatter_Boolean | 布尔值格式化服务(系统内部使用) |
_formatterCallable | 否 | 否 | PhalApi_Request_Formatter_Callable | 回调格式化服务(系统内部使用) |
_formatterDate | 否 | 否 | PhalApi_Request_Formatter_Date | 日期格式化服务(系统内部使用) |
_formatterEnum | 否 | 否 | PhalApi_Request_Formatter_Enum | 枚举格式化服务(系统内部使用) |
_formatterFile | 否 | 否 | PhalApi_Request_Formatter_File | 上传文件格式化服务(系统内部使用) |
_formatterFloat | 否 | 否 | PhalApi_Request_Formatter_Float | 浮点数格式化服务(系统内部使用) |
_formatterInt | 否 | 否 | PhalApi_Request_Formatter_Int | 整数格式化服务(系统内部使用) |
_formatterString | 否 | 否 | PhalApi_Request_Formatter_String | 字符串格式化服务(系统内部使用) |
1.19.2 DI服务是否已注册的判断误区
(1)错误的判断方法
当需要判断一个DI服务是否已被注册,出于常识会这样判断:
if (isset(DI()->cache)) {
但这样的判断永远为false,不管注册与否。
追其原因在于,DI类使用了魔法方法的方式来提供类成员属性,并存放于PhalApi_DI::$data中。
这就导致了如果直接使用isset(DI()->cache)的话,首先不会触发魔法方法 PhalApi_DI::__get($name)的调用,其次也确实没有PhalApi_DI::$cache这个成员属性,最终判断是否存在时都为false。
简单来说,以下两种判断,永远都为false:
//永远为false
var_dump(isset(DI()->XXX));
var_dump(!empty(DI()->XXX));
(2)正确判断的写法:先获取,再判断
正确的用法应该是:
//先获取,再判断
$XXX = DI()->XXX;
var_dump(isset($XXX));
var_dump(!empty($XXX));
这里,可能会对大家带来一定的困惑,所以在这里特别进行说明。也对框架中这一点不合理的设计深感抱歉。