Register.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <?php
  2. /**
  3. * 将键值保存到\Qii\Config\Register::$config中
  4. * 用于保存系统相关设置,保存项目相关的配置,请注意不出现key相互覆盖的情况,可以考虑加前缀
  5. *
  6. * @author Jinhui Zhu
  7. * @version 1.3
  8. *
  9. * Usage:
  10. * 保存值:
  11. * \Qii\Config\Register::set($key, $val);
  12. * 读取值:
  13. * \Qii\Config\Register::get($key, $default);
  14. * \Qii\Config\Register::$key($default);
  15. *
  16. *
  17. */
  18. namespace Qii\Config;
  19. use \Qii\Application;
  20. use \Qii\Config\Register;
  21. use \Qii\Config\Consts;
  22. use \Qii\Exceptions\Variable;
  23. class Register
  24. {
  25. const VERSION = '1.3';
  26. /**
  27. * 存储键值的变量
  28. *
  29. * @var Array
  30. */
  31. public static $_cache;
  32. /**
  33. * 设置键值
  34. *
  35. * @param String $key
  36. * @param String $val
  37. * @param Bool overwrite 是否覆盖之前保存的值,如果之前保存了值,要想再保存需要额外设置它为true,否则不让保存
  38. */
  39. public static function set($key, $val, $overwrite = true)
  40. {
  41. if (!\Qii\Config\Register::isValid($key, $overwrite)) \Qii\Application::_e('Overwrite', $key, __LINE__);
  42. \Qii\Config\Register::$_cache[$key] = $val;
  43. }
  44. /**
  45. * 设置键
  46. *
  47. * @param String $index
  48. * @param String $key
  49. * @param String $val
  50. */
  51. public static function add($index, $key, $val)
  52. {
  53. $added = \Qii\Config\Register::get(\Qii\Config\Consts::APP_LOADED_FILE, array());
  54. $added[$index][$key] = $val;
  55. \Qii\Config\Register::$_cache[$index] = $added;
  56. }
  57. /**
  58. * 移除某一个key
  59. * @param String $key
  60. */
  61. public static function remove($key)
  62. {
  63. if (!isset(\Qii\Config\Register::$_cache[$key])) return;
  64. unset(\Qii\Config\Register::$_cache[$key]);
  65. }
  66. /**
  67. * 获取保存的值
  68. *
  69. * @param String $key
  70. * @param String $index
  71. * @param Mix $default
  72. * @return Mix
  73. */
  74. public static function get($key, $default = null)
  75. {
  76. if (!$key) throw new \Qii\Exceptions\Variable(\Qii::i(1003), __LINE__);
  77. //优先调用存在的get方法
  78. $method = 'get' . $key;
  79. if (method_exists('\Qii\Config\Register', $method)) return \Qii\Config\Register::$method();
  80. if (isset(\Qii\Config\Register::$_cache[$key])) {
  81. return \Qii\Config\Register::$_cache[$key];
  82. }
  83. return $default;
  84. }
  85. /**
  86. * 通过\Qii\Config\Register::$key($defaultVal)来获取内容
  87. *
  88. * @param String $method
  89. * @param Array $argvs
  90. * @return Mix
  91. */
  92. public static function __callStatic($method, $argvs)
  93. {
  94. $default = array_shift($argvs);
  95. return \Qii\Config\Register::get($method, $default);
  96. }
  97. /**
  98. * 整理数组,将0.key 最后会整理到 [0][key]中
  99. * @param Array $array
  100. * @return multitype:
  101. */
  102. public static function feval($array)
  103. {
  104. $data = array();
  105. foreach ($array AS $key => $value) {
  106. $keys = explode('.', $key);
  107. if (is_array($value)) {
  108. $string = "\$data['" . join("']['", $keys) . "']=" . var_export(\Qii\Config\Register::feval($value), true) . ";";
  109. } else {
  110. $string = "\$data['" . join("']['", $keys) . "']='" . $value . "';";
  111. }
  112. eval($string);
  113. }
  114. return $data;
  115. }
  116. /**
  117. * 读取ini配置文件
  118. *
  119. * @param String $fileName
  120. * @return Array
  121. */
  122. public static function ini($fileName)
  123. {
  124. if (!$fileName) throw new Qii_Exceptions_Variable(\Qii::i(1408), __LINE__);
  125. $ini = parse_ini_file($fileName, true);
  126. if (!$ini) throw new \Qii_Exceptions_InvalidFormat($fileName, __LINE__);
  127. $config = array();
  128. foreach ($ini AS $namespace => $properties) {
  129. $properties = \Qii\Config\Register::feval($properties);
  130. $extends = '';
  131. $name = $namespace;
  132. $namespaces = array();
  133. if (stristr($namespace, ':')) {
  134. $namespaces = explode(':', $namespace);
  135. $name = array_shift($namespaces);
  136. }
  137. $name = trim($name);
  138. $config[$name] = $properties;
  139. if (count($namespaces) > 0) {
  140. foreach ($namespaces AS $space) {
  141. //如果space以“.”开头,与key的方式放在当前key下边如[dev:.space],那么生成后的数据就是这样的[dev][space]否则是[space+dev]
  142. if (substr($space, 0, 1) == '.') {
  143. $space = substr($space, 1);
  144. if (isset($config[$space])) $config[$name][$space] = $config[$space];
  145. continue;
  146. }
  147. if (isset($config[$space])) $config[$name] = array_merge($config[$space], $config[$name]);
  148. }
  149. }
  150. }
  151. return $config;
  152. }
  153. /**
  154. * 返回cache的名称
  155. * @param String $iniFile
  156. * @return String
  157. */
  158. public static function getCacheName($iniFile)
  159. {
  160. $cacheName = basename($iniFile);
  161. $environs = \Qii\Config\Register::get(\Qii\Config\Consts::APP_ENVIRONS, array());
  162. if (isset($environs[$cacheName])) {
  163. $environ = $environs[$cacheName];
  164. $cacheName = $environ . '.' . $cacheName;
  165. }
  166. return $cacheName;
  167. }
  168. /**
  169. * 覆盖/添加ini文件的key对应的值
  170. * @param String $iniFile ini文件名
  171. * @param String $key 需覆盖的key
  172. * @param String $val key对应的值
  173. */
  174. public static function rewriteConfig($iniFile, $key, $val)
  175. {
  176. $config = \Qii\Config\Register::getIniConfigure($iniFile);
  177. $cacheName = \Qii\Config\Register::getCacheName($iniFile);
  178. $config[$key] = $val;
  179. \Qii\Config\Register::set($cacheName, $config);
  180. }
  181. /**
  182. * 删除ini配置文件中对应的key
  183. * @param string $iniFile ini配置我呢见
  184. * @param string $key 陪删除的key
  185. */
  186. public static function removeAppConfigure($iniFile, $key)
  187. {
  188. $config = \Qii\Config\Register::getIniConfigure($iniFile);
  189. $cacheName = \Qii\Config\Register::getCacheName($iniFile);
  190. unset($config[$key]);
  191. \Qii\Config\Register::set($cacheName, $config);
  192. }
  193. /**
  194. * 合并ini文件生成的数组
  195. * @param String $iniFile ini文件名
  196. * @param Array $array
  197. */
  198. public static function mergeAppConfigure($iniFile, $array)
  199. {
  200. if (!is_array($array)) return;
  201. $config = \Qii\Config\Register::getIniConfigure($iniFile);
  202. $environs = \Qii\Config\Register::get(\Qii\Config\Consts::APP_ENVIRONS, array());
  203. $cacheName = basename($iniFile);
  204. if (isset($environs[$cacheName])) {
  205. $environ = $environs[$cacheName];
  206. $cacheName = $environ . '.' . $cacheName;
  207. }
  208. $config = array_merge($config, $array);
  209. \Qii\Config\Register::set($cacheName, $config);
  210. }
  211. /**
  212. * 获取配置ini文件
  213. * @param String $iniFile
  214. * @param String $environ
  215. * @return boolean
  216. */
  217. public static function setConfig($iniFile, $environ = 'product')
  218. {
  219. $cacheName = basename($iniFile);
  220. $environs = \Qii\Config\Register::get(\Qii\Config\Consts::APP_ENVIRONS, array());
  221. $environs[$cacheName] = $environ;
  222. \Qii\Config\Register::set(\Qii\Config\Consts::APP_ENVIRONS, $environs);
  223. $cacheName = $environ . '.' . $cacheName;
  224. if (!is_file($iniFile)) return false;
  225. $cacheFile = \Qii\Autoloader\Psr4::getInstance()->getFileByPrefix(\Qii\Config\Register::get(\Qii\Config\Consts::APP_CACHE_PATH) . DS . $cacheName . '.php');
  226. if (\Qii\Config\Register::get(\Qii\Config\Consts::APP_CACHE_PATH)) {
  227. if (is_file($cacheFile)) {
  228. if (filemtime($cacheFile) == filemtime($iniFile)) {
  229. $common = include($cacheFile);
  230. \Qii\Config\Register::set($cacheName, $common);
  231. return $common;
  232. }
  233. }
  234. }
  235. $array = \Qii\Config\Register::ini($iniFile);
  236. if (!$array) return false;
  237. $common = $array['common'];
  238. if (isset($array[$environ])) {
  239. $environConfig = $array[$environ];
  240. $common = array_merge($common, $environConfig);
  241. }
  242. //如果文件不可写,touch就有问题,就不写缓存文件
  243. if (is_writeable($iniFile)) {
  244. file_put_contents($cacheFile, "<?php \n return " . var_export($common, true) . "\n?>", LOCK_EX);
  245. touch($iniFile);
  246. }
  247. \Qii\Config\Register::set($cacheName, $common);
  248. return $common;
  249. }
  250. /**
  251. * 设置网站的配置文件
  252. *
  253. * @param String $iniFile 配置我呢见
  254. * @param string $environ 环境变量
  255. * @return Object self
  256. */
  257. public static function setAppConfigure($iniFile, $environ = 'product')
  258. {
  259. return \Qii\Config\Register::setConfig($iniFile, $environ);
  260. }
  261. /**
  262. * 获取配置ini文件相关信息
  263. * @param String $fileName 文件名
  264. * @return Ambigous <Mix, multitype:>
  265. */
  266. public static function getIniConfigure($fileName)
  267. {
  268. $cacheName = basename($fileName);
  269. $environs = \Qii\Config\Register::get(\Qii\Config\Consts::APP_ENVIRONS, array());
  270. if (isset($environs[$cacheName])) {
  271. $cacheName = $environs[$cacheName] . '.' . $cacheName;
  272. }
  273. return \Qii\Config\Register::get($cacheName);
  274. }
  275. /**
  276. * 获取网站的配置信息
  277. *
  278. * @return Array
  279. */
  280. public static function getAppConfigure($iniFile = \Qii\Config\Consts::APP_INI, $key = NULL)
  281. {
  282. $appConfigure = \Qii\Config\Register::getIniConfigure($iniFile);
  283. if ($key == null) return $appConfigure;
  284. return isset($appConfigure[$key]) ? $appConfigure[$key] : NULL;
  285. }
  286. /**
  287. * 验证是否之前已经保存过这个属性,如果保存过,不覆盖属性对应的值就不保存
  288. *
  289. * @param String $key
  290. * @param Bool $overwrite
  291. * @return Bool
  292. */
  293. public static function isValid($key, $overwrite = false)
  294. {
  295. if ($overwrite) return true;
  296. if (isset(\Qii\Config\Register::$_cache[$key])) return false;
  297. return true;
  298. }
  299. /**
  300. * 获取当前系统环境
  301. * @return Ambigous <Mix, multitype:>
  302. */
  303. public static function getAppEnviron()
  304. {
  305. return isset(\Qii\Config\Register::$_cache[\Qii\Config\Consts::APP_ENVIRON]) ?
  306. \Qii\Config\Register::$_cache[\Qii\Config\Consts::APP_ENVIRON]
  307. : \Qii\Config\Consts::APP_DEFAULT_ENVIRON;
  308. }
  309. public function __call($method, $argvs)
  310. {
  311. }
  312. }