<NME> README.md
<BEF> # PhpBoot

[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/caoym/phpboot/master/LICENSE)
[![Package version](http://img.shields.io/packagist/v/caoym/phpboot.svg)](https://packagist.org/packages/caoym/phpboot)
[![Documentation Status](https://readthedocs.org/projects/phpboot/badge/?version=latest)](http://phpboot.readthedocs.io/zh/latest/?badge=latest)
[![Build Status](https://travis-ci.org/caoym/phpboot.svg?branch=master)](https://travis-ci.org/caoym/phpboot)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/caoym/phpboot/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/caoym/phpboot/?branch=master)
[![Code Coverage](https://scrutinizer-ci.com/g/caoym/phpboot/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/caoym/phpboot/?branch=master)

> phprs-restful 2.x is renamed to PhpBoot, and incompatible with 1.x. You can get the old version from [phprs-restful v1.x](https://github.com/caoym/phprs-restful/tree/v1.2.4)


## 亮点

和其他框架相比较, PhpBoot 的有以下几个亮点:

* **以面向对象的方式编写接口**


### 1. Designing object-oriented APIs

**WITHOUT**  PhpBoot:

```PHP
class BookController
{
            $name = $request->get('name');
            $offset = $request->get('offset', 0);
            $limit = $request->get('limit', 10);
            
            $books = ... ;// 查询
            $total = ... ;// 可查询的总条数
            return new Response([
                'total'=>$total,
                'data'=>$books
            ]);
        }
        
        public function createBook(Request $request)
        {
            ...
            return new Response(...)
        }
    }
    //注册路由
    $app->get('/books/', 'BookController@findBooks');
    $app->post('/books/', 'BookController@createBook');
    ```
    
    很多主流框架都需要用类似代码编写接口。但这种代码的一个问题是, 方法的输入输出隐藏在实现里, 这不是通常我们提倡的编码方式。如果你对代码要求更高, 你可能还会实现一层 Service 接口, 而在 Controller 里只是简单的去调用 Service 接口。而使用 PhpBoot, 你可以用更自然的方式去定义和实现接口。上面的例子, 在 PhpBoot 框架中实现是这样的:

**WITH**  PhpBoot:

```PHP
/**
 * @path /books/
 */
class Books
{
    /**
         */
        public function findBooks($name, &$total=null, $offset=0, $limit=10)
        {
            $books = ... ;// 查询
            $total = ... ;// 可查询的总条数
            return $books;
        }
      
        return $books;
    }
  
    /**
     * @route POST /
     * @param Book $book {@bind request.request} bind $book with http body
     * @return string id of created book
     */
    public function createBook(Book $book)
    {
        $id = ... 
    ```
    上面两份代码执行的效果是一样的。可以看到 PhpBoot 编写的代码更符合面向对象编程的原则, 以上代码完整版本请见[phpboot-example](https://github.com/caoym/phpboot-example)。
    
* **完美的支持 Swagger**

    [Swagger](https://swagger.io)是目前最流行的接口文档框架。虽然很多框架都可以通过扩展支持Swagger, 但一般不是需要编写很多额外的注释, 就是只能导出基本的路由信息, 而不能导出详细的输入输出参数。目前只有 PhpBoot 可以在不增加额外编码负担的情况下, 更多内容请见[文档](https://caoym.gitbooks.io/phpboot/content/ji-ben-te-xing/wen-dang-shu-chu.html)和[在线 Demo](http://118.190.86.50:8007/index.html?url=http://118.190.86.50:8009/docs/swagger.json)。
    ![](https://github.com/caoym/phpboot-book/raw/master/assets/WX20170809-184015.png)
    
* **简单易用的分布式支持**
    

Read more: [Online Demo](http://swagger.phpboot.org/?url=http://example.phpboot.org/docs/swagger.json)

### 3. RPC

Call the remote Books with RPC:

```PHP
$books = $app->make(RpcProxy::class, [
        'interface'=>Books::class, 
        'prefix'=>'http://x.x.x.x/'
    ]);
    
$books->findBooks(...);
```

Concurrent call RPC：

```PHP
$res = MultiRpc::run([
    function()use($service1){
        return $service1->doSomething();
    },
    function()use($service2){
        return $service2->doSomething();
    },
]);
```

    IDE 的代码提示功能可以让开发者轻松不少, 但很多框架在这方面做的并不好, 你必须看文档或者代码, 才能知道某个功能的用法。PhpBoot 在一开始就非常注重让代码保持IDE友好, 经可能让所有代码都能有正确的代码提示。比如下图是 DB 库在 PhpStorm IDE 下的使用:
    
    ![](https://github.com/caoym/phpboot-book/raw/master/assets/db.gif)
    

## 主要特性
   PhpBoot 框架也提供主流的特性, 如ORM、依赖注入等。 这些特性都经过精心设计或选择(有些是第三方开源代码,如 PHP-DI), 即保证极简单的使用, 又需和框架整体的风格保持一致。
## Features
   
   * [Route](http://phpboot.org/zh/latest/basic/route.html)
   * [Parameters binding ](http://phpboot.org/zh/latest/basic/params-bind.html)
   * [Validation](http://phpboot.org/zh/latest/basic/validation.html)
   * [Dependency Injection(IOC)](http://phpboot.org/zh/latest/basic/di.html)
   * [DB](http://phpboot.org/zh/latest/basic/db.html)
   * [ORM](http://phpboot.org/zh/latest/advanced/orm.html)
   * [Docgen(Swagger)](http://phpboot.org/zh/latest/advanced/docgen.html)
   * [RPC](http://phpboot.org/zh/latest/advanced/rpc.html)
   * [Hook](http://phpboot.org/zh/latest/advanced/hook.html)
   * [CLI](http://phpboot.org/zh/latest/advanced/cli.html)
## Installation

   1. Install composer

	   ```
	   curl -s http://getcomposer.org/installer | php
	   ```
       
   2. Install PhpBoot
   
       ```
       composer require "caoym/phpboot"
       ```
       
   3. index.php
       
       ```PHP
       <?php
       require __DIR__.'/vendor/autoload.php';
      
       $app = \PhpBoot\Application::createByDefault(__DIR__.'/config/config.php');
       $app->loadRoutesFromPath(__DIR__.'/App/Controllers');
       $app->dispatch();
       ```
   
## Help & Documentation

   * **[Documentation](http://phpboot.org)**
   * **[中文文档](http://phpboot.org)**
   * Email: caoyangmin@gmail.com
   

<MSG> modify readme

<DFF> @@ -12,7 +12,7 @@
 
 ## 亮点
 
-和其他框架相比较, PhpBoot 的有以下几个亮点:
+和其他框架相比较, PhpBoot 有以下这些亮点:
 
 * **以面向对象的方式编写接口**
 
@@ -27,24 +27,13 @@
             $name = $request->get('name');
             $offset = $request->get('offset', 0);
             $limit = $request->get('limit', 10);
-            
-            $books = ... ;// 查询
-            $total = ... ;// 可查询的总条数
-            return new Response([
-                'total'=>$total,
-                'data'=>$books
-            ]);
+            ...
+            return new Response(['total'=>$total, 'data'=>$books]);
         }
         
         public function createBook(Request $request)
-        {
-            ...
-            return new Response(...)
-        }
+        ...
     }
-    //注册路由
-    $app->get('/books/', 'BookController@findBooks');
-    $app->post('/books/', 'BookController@createBook');
     ```
     
     很多主流框架都需要用类似代码编写接口。但这种代码的一个问题是, 方法的输入输出隐藏在实现里, 这不是通常我们提倡的编码方式。如果你对代码要求更高, 你可能还会实现一层 Service 接口, 而在 Controller 里只是简单的去调用 Service 接口。而使用 PhpBoot, 你可以用更自然的方式去定义和实现接口。上面的例子, 在 PhpBoot 框架中实现是这样的:
@@ -61,8 +50,7 @@
          */
         public function findBooks($name, &$total=null, $offset=0, $limit=10)
         {
-            $books = ... ;// 查询
-            $total = ... ;// 可查询的总条数
+            ...
             return $books;
         }
       
@@ -80,10 +68,13 @@
     ```
     上面两份代码执行的效果是一样的。可以看到 PhpBoot 编写的代码更符合面向对象编程的原则, 以上代码完整版本请见[phpboot-example](https://github.com/caoym/phpboot-example)。
     
-* **完美的支持 Swagger**
+* **轻松支持 Swagger**
 
     [Swagger](https://swagger.io)是目前最流行的接口文档框架。虽然很多框架都可以通过扩展支持Swagger, 但一般不是需要编写很多额外的注释, 就是只能导出基本的路由信息, 而不能导出详细的输入输出参数。目前只有 PhpBoot 可以在不增加额外编码负担的情况下, 更多内容请见[文档](https://caoym.gitbooks.io/phpboot/content/ji-ben-te-xing/wen-dang-shu-chu.html)和[在线 Demo](http://118.190.86.50:8007/index.html?url=http://118.190.86.50:8009/docs/swagger.json)。
-    ![](https://github.com/caoym/phpboot-book/raw/master/assets/WX20170809-184015.png)
+    
+    <div align=center>
+    <img src="https://github.com/caoym/phpboot-book/raw/master/assets/WX20170809-184015.png" width="60%">
+    </div>
     
 * **简单易用的分布式支持**
     
@@ -118,8 +109,9 @@
 
     IDE 的代码提示功能可以让开发者轻松不少, 但很多框架在这方面做的并不好, 你必须看文档或者代码, 才能知道某个功能的用法。PhpBoot 在一开始就非常注重让代码保持IDE友好, 经可能让所有代码都能有正确的代码提示。比如下图是 DB 库在 PhpStorm IDE 下的使用:
     
-    ![](https://github.com/caoym/phpboot-book/raw/master/assets/db.gif)
-    
+    <div align=center>
+    <img src="https://github.com/caoym/phpboot-book/raw/master/assets/db.gif">
+    </div>
 
 ## 主要特性
    PhpBoot 框架也提供主流的特性, 如ORM、依赖注入等。 这些特性都经过精心设计或选择(有些是第三方开源代码,如 PHP-DI), 即保证极简单的使用, 又需和框架整体的风格保持一致。

{'addition_count': 13, 'commit_subject': 'modify readme', 'deletion_count': 21, 'file_extension': '.md', 'lang': 'md', 'license': 'mit', 'repo_name': 'caoym/phpboot'}