所谓老的系统,是指没有使用php 5.3以上命名空间(namespace)特性编码的系统。
但是,只要你的系统运行在 php 5.3及以上的环境,在你的老系统中,是可以使用这些基于新特性如命名空间编码的库或代码的。
以前只是有洁癖不用而已。
比如,我是个工具控,想让所用的禅道系统也像那些国际化开源 issue 项目一样有一套标准开放的 api - 禅道本身是有套 html、json 自适配模式可以当接口用的,可以用于其他客户端或系统集成。这几天在尝试编写的用于兼容 redmine rest 风格接口的禅道 pms api,就有意识的用了这种混合的写法。
由于要兼容 redmine 的 rest 风格,首先选用了 slim 这个微服务框架,毫无疑问,它是要求运行环境>5.3的,但我总得复用禅道已有的代码,这样效率才高。
原理很简单,就是一根反斜杠,或者两根。
先用composer 初始化了slim 库。
重点部位的代码:
入口文件 index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
require __dir__ . '/vendor/autoload.php' ; require __dir__ . '/inc/zentao/nb/autoloader.php' ; \zentao\nb\autoloader::register(); $app = \zentao\core\application::app(dirname(ztnb_root)); //禅道的router $slim = new \slim\slim(); $routes = require __dir__ . '/data/config/routes.php' ; foreach ( $routes as $method => $_routes ) { if ( $_routes ) { foreach ( $_routes as $rule => $map ) { $slim -> $method ( $rule , '\\zentao\\nb\\resource\\' . $map ); } } } $slim ->run(); |
\zentao\core\application 是独立封装的兼容禅道原来运行环境的类,由禅道中的 framework/router.class.php 改造而来,主要用于加载禅道中的相关资源如配置文件、模型等。精华应该在这里面,主要是加了一些“\”来让微服务中能跑起来禅道运来的运行环境,并作为一个命名空间的桥梁可以在新的代码中调用。
再看看资源类的父类 \zentao\nb\resource,片段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
<?php namespace zentao\nb; /** * 资源类 父类 */ class resource { public function __construct() { } /** * load the model file of one module. * * @param string $methodname the method name, if empty, use current module's name. * @access public * @return object|bool if no model file, return false. else return the model object. */ protected function loadmodel( $modulename ) { $modelfile = \helper::setmodelfile( $modulename ); /* if no model file, try load config. */ if (!\helper::import( $modelfile )) { $this ->app->loadconfig( $modulename , false); $this ->app->loadlang( $modulename ); $this ->dao = new dao(); return false; } $modelclass = class_exists ( 'ext' . $modulename . 'model' ) ? 'ext' . $modulename . 'model' : $modulename . 'model' ; $modelclass = '\\' . $modelclass ; if (! class_exists ( $modelclass )) $this ->app->triggererror( " the model $modelclass not found" , __file__ , __line__ , $exit = true); $this -> $modulename = new $modelclass (); $this ->dao = $this -> $modulename ->dao; return $this -> $modulename ; } |
这样可以在资源类中调用禅道的 model 类。
还有另外一种用法,加载语言包:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
<?php namespace zentao\nb\resource; use zentao\nb\enum\bugtype; /** * 项目自行定义的问题分类 */ class issuecategory extends \zentao\nb\resource { public function fetchall( $format = 'json' ) { global $app ; $types = $app ->loadlang( 'bug' )->bug->typelist; $issue_categories = array (); foreach ( $types as $key => $name ) { $issue_categories [] = array ( 'id' => bugtype::getidbyinterid( $key ), 'name' => $name ); } echo json_encode( array ( 'issue_categories' => $issue_categories )); } /** * 根据项目来取其中定义的分类 * @param int $projectid * @param string $format */ public function fetchallbyprojectid( $projectid , $format = 'json' ) { $model = $this ->loadmodel( 'project' ); $project = $model ->getbyid( $projectid ); //todo 支持按项目代号查找 if (! $project ) { $this ->responsenotexixted(); } global $app ; $types = $app ->loadlang( 'bug' )->bug->typelist; $issue_categories = array (); foreach ( $types as $key => $name ) { $issue_categories [] = array ( 'id' => bugtype::getidbyinterid( $key ), 'project' => array ( 'id' => $projectid , 'name' => $project ->name), 'name' => $name ); } echo json_encode( array ( 'issue_categories' => $issue_categories , 'total_count' => 2 )); } } |
基本项目结构如下:
项目只是初步成型,尚未完成。
这是在 nb 中的任务列表。
这是在 nb 中的任务详情。
以上就是告诉大家如何在旧的php系统中使用php 5.3之后的库,希望对大家的学习有所帮助。