2019独角兽企业重金招聘Python工程师标准>>>
历时五个工作日,通过对phabricator的源代码查看,简单使用,以及绘制UML,发现phabricator确实是一个很优秀的开源框架。而且他的开源社区也比较有意思,不是鼓励你去写代码,而是通过其他方式来进行贡献,如宣传。更多信息,请见官网:http://phabricator.org/
主要特点:
1、更多是面向于CLI命令行的应用(使用了很多Linux下的命令),并且用了视图控件来展示页面模块。
2、在PHPUnit基础上,自定义了一套测试系统。
3、Workflow工作流概念。
4、脚本执行,以及一个很好的脚本参数规则解析组件。
5、各种丰富的引擎,如:ArcanistLintEngine、ArcanistUnitTestEngine、
6、框架结构良好,值得学习。
一些细分的点:
1、融合了Git/SVN/HG等代码版本控制系统的接口(很好的制品库支持),以及Google/Twitter/Facebook等第三方登录验证接口,还有关于网站请求、响应(各种响应状态与格式)的全面封装。
2、很符合《代码质量》里面所说的包稳定性,即不稳定包应该依赖指向于稳定包。
3、但好像有过多没必要的抽象类。但也正是各个包中的抽象类,使得整个架构和底层更加稳定、开放。
4、命名也很到位,只是个别情况下混淆了查询和命令的操作,以及表达所用的词性不是很到位(如应该用动-名词,去用了名-名)。特别值得一说的是,由于用了映射机制来加载,大大避免了类名过长,而且拥有良好自由的命名空间。
5、使用了类与路径映射的关系来自动加载类文件。
6、各个目录、各个包有对应的异常类定义。
7、好多正则的使用。
8、后台登录页面效果不错,当登录失败时,窗口会抖动。
总而言之,各包呈现独立状态,拥有较高的内聚性,在各个包内,有独立的异常定义、自动化测试、抽象类、快速操作函数。
各个包有自己的自动加载机制,但又依赖于底层包的使用。
注释上:
没有太多冗余的注释,通常是相关意图的说明,以及如何使用的示例。
代码风格上:
1、坚持短代码
2、结构层次、包分明
3、典型的面向对象设计
因为有深层次的继续,虽然有使用少量的设计模式,始常规的工厂方法、代理模式、适配器(有点牵强)、空对象模式
4、使用了final定义类
5、没有使用多余的类成员前缀以示访问级别
测试上:
各个包配置有各自独立的测试代码。
安装:
项目安装简单,nginx参考配置如下:
server {
set $www /home/test/projects/phabricator/phabricator/webroot;
root $www;
try_files $uri $uri/ /index.php;
index index.html index.htm index.php;
listen 80;
access_log logs/dogstar.phabricator.com_access.log;
error_log logs/dogstar.phabricator.com_error.log;
charset utf-8;
server_name dogstar.phabricator.com;
location / {
index index.php;
if ( !-f $request_filename )
{
rewrite ^/(.*)$ /index.php?__path__=/$1 last;
break;
}
}
location /index.php {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
#required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
#variables to make the $_SERVER populate in PHP
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
下面是一些UML图表,以及一些关键的类说明。
应用项目:
对于网站系统,比较关键的类:
【phabricator phabricator包】
PhabricatorApplication、AphrontController、AphrontRequest、AphrontApplicationConfiguration、AphrontResponse、AphrontView、PhabricatorConfigSource、PhabricatorDaemon、PhabricatorLiskDAO
中间层包:
ArcanistLintEngine、ArcanistLinter、ArcanistLintRenderer、ArcanistLintResult、ArcanistLintMessage、ArcanistDiffParser、ArcanistRepositoryAPI(SVN/GIT等支持)、ArcanistUnitTestEngine、ArcanistUnitTestResult、ArcanistWorkflow
底层通用包:
Future(命令的执行?)、PhutilDaemon(进程守护?)、PhutilArgumentParser(命令行参数按规则解析组件,日后可重用)、PhutilKeyValueCache(key-value缓存支持)、PhutilChannel、PhutilConsole、Filesystem、PhutilMarkupEngine、PhageAgentBootloader、Phobject(不知确切的作用)
下面重点用示例来说明一下其中的命令行参数的规则解析。
因为毕竟,我们编写的很多脚本在执行时都需要一些参数。
//$vim ./use_PhutilArgumentSpecification.php
setTagLine('演示命令参数规则的使用');
$parser->parseStandardArguments();
$parser->parseFull(
array(
array(
'name' => 'date',
'short' => 'd',
'help' => '请输入日期,格式为:Ymd',
'param' => 'value',
),
)
);
var_dump($parser->getArg('date'));
执行命令,并带 --help参数 就可以看到相关的帮助说明。
$php ./use_PhutilArgumentSpecification.php --help
NAME
use_PhutilArgumentSpecification.php - 演示命令参数规则的使用
OPTION REFERENCE
--date value, -d value
请输入日期,格式为:Ymd
Use --show-standard-options to show additional options.
然后可以通过长、短两种参数方式来输入。
$php ./use_PhutilArgumentSpecification.php --date 20150118
string(8) "20150118"
php ./use_PhutilArgumentSpecification.php -d 20150118
string(8) "20150118"