基于yaf实现DI容器
时间:2019-03-18
本文章向大家介绍基于yaf实现DI容器,主要包括基于yaf实现DI容器使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
DI设计与实现
方法 | 要求 |
createObject($config) | $config中必须有class节点,表示对象的类型 |
set($name,$config) | $config放入容器 |
get($name) | 如果$name已经被实例化,直接返回,若未被实例化,则实例化放入容器并返回 |
insure($config,$defaultClass='') | 动态组建 |
咱们一起来看一下yaf的Registry这个类,这是yaf代码提示中自带的类。
<?php namespace Yaf ; /** * <p>All methods of <b>\Yaf\Registry</b> declared as static, making it universally accessible. This provides the ability to get or set any custom data from anyway in your code as necessary.</p> * @link http://www.php.net/manual/en/class.yaf-registry.php */ final class Registry { /** * @var \Yaf\Registry */ protected static $_instance; /** * @var array */ protected $_entries; /** * @link http://www.php.net/manual/en/yaf-registry.construct.php */ private function __construct(){ } /** * @link http://www.php.net/manual/en/yaf-registry.clone.php */ private function __clone(){ } /** * Retrieve an item from registry * * @link http://www.php.net/manual/en/yaf-registry.get.php * * @param string $name * * @return mixed */ public static function get($name){ } /** * Check whether an item exists * * @link http://www.php.net/manual/en/yaf-registry.has.php * * @param string $name * * @return bool */ public static function has($name){ } /** * @link http://www.php.net/manual/en/yaf-registry.set.php * * @param string $name * @param mixed $value * * @return bool */ public static function set($name, $value){ } /** * @link http://www.php.net/manual/en/yaf-registry.del.php * * @param string $name * * @return void|bool */ public static function del($name){ } }
下面咱们根据Registry这个类,创建实际项目中可以用到的DI容器
/** * Class ${小痴} * @package extend */ class Di { private function __construct() { } private function __clone() { // TODO: Implement __clone() method. } /** * Notes:块赋值 * User: 小痴 * Date: 2019/3/18 * Time: 13:17 * @return void */ public static function block($object,$properties=[]) { foreach ($properties as $property => $value) { $object->$property = $value; } } /** * Notes:根据对象配置创建对象 * User: 小痴 * Date: 2019/3/18 * Time: 13:16 * @return mixed */ public static function createObject($config) { $class = $config['class']; unset($config['class']); $object = new $class(); self::block($object,$config); if(method_exists($object,'init')) { $object->init(); } return $object; } /** * Notes: * User: 小痴 * Date: 2019/3/18 * Time: 13:17 * @return bool */ public static function set($name,$config) { return Registry::set($name,$config); } /** * Notes: * User: 小痴 * Date: 2019/3/18 * Time: 13:17 * @return mixed */ public static function get($name) { $object = Registry::get($name); if(is_array($object) && isset($object['class'])) { $instance = self::createObject($object); Registry::set($name,$instance); return $instance; } return $object; } /** * Notes: * User: 小痴 * Date: 2019/3/18 * Time: 13:17 * @return array|mixed */ public static function insure($config,$defaultClass=null) { if(is_array($config)) { if(isset($config['class'])) { return self::createObject($config); } if(isset($defaultClass)) { $config['class'] = $defaultClass; return self::createObject($config); } } return $config; } }
举例:
在yaf中会有一个Bootstrap.php,在此文件中创建一个方法:
//获取一下DB
public function _initDb(\yaf\Dispatcher $dispatcher)
{
$config = \Yaf\Application::$app()->getConfig();
\Yaf\Registry::set('config',$config);
}
我们在controller中创建一个testDb.php文件:
public function testAction()
{
$db = Di::get('config');
var_dumo($db);
}
这样就获取到了。
- ElastAlert监控日志告警Web攻击行为
- Java线程使用技巧学习(二)
- 挖洞经验 | 看我如何发现“小火车托马斯”智能玩具APP聊天应用漏洞
- Hive 常见问题与技巧【Updating】
- Hive 基础(1):分区、桶、Sort Merge Bucket Join
- 简化你的 java 字符串操作:Guava 之 CharMatcher 用法简介
- WAF绕过技巧浅谈
- flask 流式响应 RuntimeError: working outside of request context
- shell 学习笔记(19)
- HBase 写优化之 BulkLoad 实现数据快速入库
- 玩转 Linux 之:由 Nginx log rotation 聊聊 mv 的妙用
- 玩转 SHELL 脚本之:linux date 知多少?
- Hive 中的 LEFT SEMI JOIN 与 JOIN ON 的前世今生
- Yaffs_guts
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- seata redis模式重构之全局事务更新
- 【STM32F407】第7章 RL-TCPnet V7.X网络协议栈移植(RTX5)
- 【STM32F429】第7章 RL-TCPnet V7.X网络协议栈移植(RTX5)
- [白话解析] 深入浅出 极大似然估计 & 极大后验概率估计
- 【STM32H7】第7章 RL-TCPnet V7.X网络协议栈移植(RTX5)
- TinyMCE 富文本编辑器的使用实例指导
- dotnet 在国产 UOS 系统利用 dotnet tool 工具做文件传输
- [白话解析] 深入浅出支持向量机(SVM)之核函数
- C# 线程同步之事件信号阻塞 AutoResetEvent
- [白话解析] 深入浅出最大熵模型
- [白话解析] 带你一起梳理Word2vec相关概念
- 利用SSE服务器主动向浏览器端发送消息
- [白话解析] Flink的Watermark机制
- [源码分析] 从源码入手看 Flink Watermark 之传播过程
- [白话解析]以水浒传为例学习隐马尔可夫模型