API後端框架Godtail2-路由組件

來自博客:神的尾巴,原文連接php

已提交到github,路由組件代碼,代碼質量通常,你們將就着看 : )前端

組件思路

如今都是單入口,經過index.php配置組件,而後經過組件dispatch,來調用指定的控制器。nginx

另外這個框架做爲後端純Api框架。沒有PHP模板引擎,全部與前端的數據交互都經過json(推薦)或xml。因此要支持跨域,也要支持RESTFul風格的請求。git

當前實現了的一些特性

  1. 自動調用控制器,處理請求。github

  2. 專門解析參數的Param工具類。json

  3. PHP不處理PUT請求過來的參數,添加Parser工具類,有解析器FormData,Json,用來處理前端發過來的數據。包含上傳文件的解析(設置到臨時文件,對於比較小的文件直接獲取文件內容,能夠本身配置)。後端

當前博客就是用這個組件寫的,代碼也在github上。跨域

還需完善的一些地方(近幾天抽空解決下)

  1. 自定義路由:添加正則匹配。composer

    例如`/article/:id`,自動配置整數,並設置到參數id。
    [
        'url' => '/article/:id',
        'filter' => [
            'id' => '/\d+/'
         ]
         #'controller' => 'Article@detail'
         'real' => '/article/detail/:id'
    ]

實現過程

composer.json配置框架

{
    "name": "godtail/router",
    "description": "Easy router, no config, support RESTFul.",
    "license": "MIT",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-4": {"Godtail\\Router\\": "./src"}
    }
}

須要的配置

'deep' => 2, #控制器層數 
'default' => ['Index', 'index'], #默認,自動補全
'namespacePre' => 'Service\\', #控制器命名空間前綴
'classSuffix' => 'Service', #控制器類名後綴
'crossDomain' => [ #跨域設置
    'allowOrigin' => 'http://test.net',
    'maxAge' => '86400',
    'headers' => 'Content-Type',
    'methods' => 'OPTIONS, GET, PUT, POST, DELETE',
]

如何得到比較好的URL風格

經過nginx rewrite,把匹配不到的urlrewriteindex.php?/$uri

location / {
    try_files $uri $uri/ /index.php?/$uri;
}

這樣godtail.cn/index.php?/article/tag,就能夠寫成godtail.cn/article/tag

路由分層和URL參數解析

config的deep參數,用來配置路由多少層,若是功能比較簡單能夠只分爲2層,若是分module,則能夠分紅3層。

獲取URL,根據/拆分。
例如`deep=2`, `godtail.cn/article/tag/page/2`,把page設置到Params。

Params: 保存着一個靜態變量$data,用來存放請求過來的參數。
提供get,set,parse方法。

FormData的解析

若是經過POST過來的請求,PHP可以處理,設置到$_POST或者$_FILES,可是若是是PUT請求,則須要本身處理php://input數據流

FormData的格式

------boundary--------['--'+boundary]
name=1
content-type=xxxx
[換行]
數據內容1
------boundary--------['--'+boundary]
name=2
content-type=xxxx
[換行]
數據內容2
------boundary---------[最後一個'--'+boundary+'-']

目前是經過正則來解析處理的,若是設置了saveFile。使用tempnam生成臨時文件。

啓用

#設置配置
Router::config($config['router']);

#dispatch
Router::dispatch();
相關文章
相關標籤/搜索