【推荐】可视化代码评审工具 Phabricator - 我看过的PHP开源框架

原创
2015/01/18 01:12
阅读数 1.2K

历时五个工作日,通过对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 
<?php
require_once('/home/test/projects/phabricator/libphutil/scripts/__init_script__.php');

$parser = new PhutilArgumentParser($argv);
$parser->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"


展开阅读全文
打赏
0
2 收藏
分享
加载中
问个关于安装的问题, 我在安装的时候, 总是提示 ./bin/stroage: line 1: ../scripts/sql/manage_storage.php: No such file or directory , 请问和我的环境有关系吗?

我在我的所有环境中都有用类似的代码测试过, 建一个文件如 : test 在里面写上 ./path/to/file.php 然后在 ./path/to/file.php 中 echo 'hello'; 也是一样抛这个错误.

http://www.oschina.net/question/260887_141904
2015/01/23 16:16
回复
举报
更多评论
打赏
1 评论
2 收藏
0
分享
返回顶部
顶部