所谓老的系统,是指没有使用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之后的库,希望对大家的学习有所帮助。