DI服务速查:各资源服务一览表

2018-11-21 21:15 更新

“完成,好过完美。” -- 脸谱书文化之一

1.19.1 一览表

变量名称是否启动时自动注册是否必须接口/类作用说明
loaderPhalApi_Loader自动加载:负责PEAR风格下类的自动加载,需要手动注册,指定项目路径
configPhalApi_Config配置:负责项目配置的读取,需要手动注册,指定存储媒介,默认是PhalApi_Config_File
loggerPhalApi_Logger日志纪录:负责日志的写入,需要手动注册,指定日志级别和存储媒介,默认是PhalApi_Logger_File
requestPhalApi_Request接口参数请求:用于收集接口请求的参数
responsePhalApi_Response结果响应:用于输出返回给客户端的结果,默认为PhalApi_Response_Json
notorm推荐PhalApi_DB_NotORM数据操作:基于NotORM的DB操作,需要手动注册,指定数据库配置
cache推荐PhalApi_Cache缓存:实现缓存读写,需要手动注册,指定缓存
filter推荐PhalApi_Filter拦截器:实现签名验证、权限控制等操作
cryptPhalApi_Crypt对称加密:实现对称加密和解密,需要手动注册
curlPhalApi_CUrlCURL请求类:通过curl实现的快捷方便的接口请求类,需要手动注册
cookiePhalApi_CookieCOOKIE的操作
debugboolean应用级的调试开关,通常可从配置读取,暂时框架未用到
_formatterArrayPhalApi_Request_Formatter_Array数组格式化服务(系统内部使用)
_formatterBooleanPhalApi_Request_Formatter_Boolean布尔值格式化服务(系统内部使用)
_formatterCallablePhalApi_Request_Formatter_Callable回调格式化服务(系统内部使用)
_formatterDatePhalApi_Request_Formatter_Date日期格式化服务(系统内部使用)
_formatterEnumPhalApi_Request_Formatter_Enum枚举格式化服务(系统内部使用)
_formatterFilePhalApi_Request_Formatter_File上传文件格式化服务(系统内部使用)
_formatterFloatPhalApi_Request_Formatter_Float浮点数格式化服务(系统内部使用)
_formatterIntPhalApi_Request_Formatter_Int整数格式化服务(系统内部使用)
_formatterStringPhalApi_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));

这里,可能会对大家带来一定的困惑,所以在这里特别进行说明。也对框架中这一点不合理的设计深感抱歉。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号