phalapi可以依赖注入么_3.11 PhalApi DI服务汇总

全部依赖注入的资源服务,都位于./config/di.php文件内。

默认情况下,会进行基本注册如下:

$di = \PhalApi\DI();

// 配置

$di->config = new FileConfig(API_ROOT . '/config');

// 调试模式,$_GET['__debug__']可自行改名

$di->debug = !empty($_GET['__debug__']) ? true : $di->config->get('sys.debug');

// 日记纪录

$di->logger = new FileLogger(API_ROOT . '/runtime', Logger::LOG_LEVEL_DEBUG | Logger::LOG_LEVEL_INFO | Logger::LOG_LEVEL_ERROR);

// 数据操作 - 基于NotORM

$di->notorm = new NotORMDatabase($di->config->get('dbs'), $di->debug);

可以根据项目的需要,进行定制化的注册,只需要把下面的注释去掉即可。

// 签名验证服务

// $di->filter = new \PhalApi\Filter\SimpleMD5Filter();

// 缓存 - Memcache/Memcached

// $di->cache = function () {

// return new \PhalApi\Cache\MemcacheCache(DI()->config->get('sys.mc'));

// };

// 支持JsonP的返回

// if (!empty($_GET['callback'])) {

// $di->response = new \PhalApi\Response\JsonpResponse($_GET['callback']);

// }

如果需要更多的DI服务,也可以参考并使用下面的DI服务资源一览表。

假设,我们已有:

$di = \PhalApi\DI();

则:

服务名称是否启动时自动注册是否必须接口/类作用说明$di->config否是PhalApi\Config配置:负责项目配置的读取,需要手动注册,指定存储媒介,默认是PhalApi\Config\FileCache$di->logger否是PhalApi\Logger日记纪录:负责日记的写入,需要手动注册,指定日记级别和存储媒介,默认是PhalApi\Logger\FileLogger$di->request是是PhalApi\Request接口参数请求:用于收集接口请求的参数$di->response是是PhalApi\Response结果响应:用于输出返回给客户端的结果,默认为PhalApi\Response\JsonResponse$di->notorm否推荐PhalApi\Database\NotORMDatabase数据操作:基于NotORM的DB操作,需要手动注册,指定数据库配置$di->cache否推荐PhalApi\Cache缓存:实现缓存读写,需要手动注册,指定缓存$di->filter否推荐PhalApi\Filter拦截器:实现签名验证、权限控制等操作$di->crypt否否PhalApi\Crypt对称加密:实现对称加密和解密,需要手动注册$di->curl否否PhalApi\CUrlCURL请求类:通过curl实现的快捷方便的接口请求类,需要手动注册$di->cookie否否PhalApi\CookieCOOKIE的操作$di->tracer是是PhalApi\Helper\Tracer内置的全球追踪器,支持自定义节点标识 $di->debug否否boolean应用级的调试开关,通常可从配置读取,为true时开启调试模式

当需要判断一个DI服务是否已被注册,出于常识会这样判断:

if (isset(\PhalApi\DI()->cache)) {

但这样的判断永远为false,不管注册与否。

追其原因在于,DI类使用了魔法方法的方式来提供类成员属性,并存放于PhalApi\DependenceInjection::$data中。

这就导致了如果直接使用isset(\PhalApi\DI()->cache)的话,首先不会触发魔法方法 PhalApi\DependenceInjection::__get($name)的调用,其次也确实没有PhalApi\DependenceInjection::$cache 这个成员属性,最终判断是否存在时都为false。

简单来说,以下两种判断,永远都为false:

$di = \PhalApi\DI();

// 永远为false

var_dump(isset($di->XXX));

var_dump(!empty($di->XXX));

正确的用法应该是:

// 先获取,再判断

$XXX = $di->XXX;

var_dump(isset($XXX));

var_dump(!empty($XXX));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值