Flightphp 中文版教程

Flight是什么?

Flight是一個(gè)快速,簡(jiǎn)易党饮,可擴(kuò)展的PHP框架。Flight能使你快速和輕松地創(chuàng)建RESTful Web應(yīng)用驳庭。

require 'flight/Flight.php';

Flight::route('/', function(){
    echo 'hello world!';
});

Flight::start();

需求

Flight需要PHP 5.3或更高版本刑顺。

License

Flight is released under the MIT license.

安裝

1.框架下載

如果你在使用Composer,你可以運(yùn)行如下命令:

composer require mikecao/flight

或者你可以直接下載饲常,之后將Flight框架文件放入你的web目錄中蹲堂。

2. 配置你的web服務(wù)器

對(duì)于Apache服務(wù)器,編輯你的.htaccess文件添加如下內(nèi)容:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

對(duì)于Nginx服務(wù)器贝淤,添加如下內(nèi)容到你的server聲明中:

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

3. 創(chuàng)建你的index.php文件(示例)

首先引入這個(gè)框架柒竞。

require 'flight/Flight.php';

接著定義一個(gè)路由并且注冊(cè)一個(gè)函數(shù)去處理對(duì)應(yīng)請(qǐng)求。

Flight::route('/', function(){
    echo 'hello world!';
});

最后播聪,啟動(dòng)框架朽基。

Flight::start();

路由

Flight中的路由是指將一個(gè)URL模式(pattern)匹配到一個(gè)回調(diào)函數(shù)中布隔。

Flight::route('/', function(){
    echo 'hello world!';
});

只要能被調(diào)用,都可以當(dāng)做回調(diào)函數(shù)稼虎。所以可以使用一個(gè)普通的函數(shù)當(dāng)做回調(diào):

function hello(){
    echo 'hello world!';
}

Flight::route('/', 'hello');

也可以是某一個(gè)類的方法:

class Greeting {
    public static function hello() {
        echo 'hello world!';
    }
}

Flight::route('/', array('Greeting','hello'));

如果定義了多個(gè)路由衅檀,路由依照定義它們的順序進(jìn)行匹配。第一個(gè)匹配到該請(qǐng)求的路由將被調(diào)用霎俩。

HTTP METHOD路由

在默認(rèn)不指定的情況下哀军,路由會(huì)對(duì)相應(yīng)請(qǐng)求的所有Method(例如:GET POST PUT DELETE...)進(jìn)行匹配。你可以通過在URL前面加一個(gè)方法標(biāo)識(shí)符的方式來響應(yīng)指定的Method茸苇。

Flight::route('GET /', function(){
    echo 'I received a GET request.';
});

Flight::route('POST /', function(){
    echo 'I received a POST request.';
});

你還可以使用|分隔符來映射多個(gè)Method到同一個(gè)回調(diào)中排苍。

Flight::route('GET|POST /', function(){
    echo 'I received either a GET or a POST request.';
});

正則表達(dá)式

在路由中你可以使用正則表達(dá)式:

Flight::route('/user/[0-9]+', function(){
    // 這個(gè)將匹配到 /user/1234
});

命名參數(shù)

你可以在路由中指定命名參數(shù)沦寂,它們會(huì)被傳遞到你的回調(diào)函數(shù)里学密。

Flight::route('/@name/@id', function($name, $id){
    echo "hello, $name ($id)!";
});

你也可以通過使用:分隔符在命名變量中引入正則表達(dá)式

Flight::route('/@name/@id:[0-9]{3}', function($name, $id){
    // 這個(gè)將匹配到 /bob/123
    // 但是不會(huì)匹配到 /bob/12345
});

可選參數(shù)

你可以通過將URL段(segments)包在括號(hào)里的方式來指定哪些命名參數(shù)是可選的。

Flight::route('/blog(/@year(/@month(/@day)))', function($year, $month, $day){
    // 它將匹配如下URLS:
    // /blog/2012/12/10
    // /blog/2012/12
    // /blog/2012
    // /blog
});

任何沒有被匹配到的可選參數(shù)將以NULL值傳入传藏。

通配符

匹配只發(fā)生在單獨(dú)的URL段(segments)腻暮。如果你想匹配多段,可以使用*通配符毯侦。

Flight::route('/blog/*', function(){
    // 這個(gè)將匹配到 /blog/2000/02/01
});

要將所有的請(qǐng)求路由到單一的回調(diào)上哭靖,你可以這么做:

Flight::route('*', function(){
    // Do something
});

路由的傳遞

當(dāng)從一個(gè)被匹配到的回調(diào)函數(shù)中返回true時(shí),路由功能將繼續(xù)執(zhí)行侈离,傳遞到下一個(gè)能匹配的路由中试幽。

Flight::route('/user/@name', function($name){
    // 檢查某些條件
    if ($name != "Bob") {
        // 延續(xù)到下一個(gè)路由
        return true;
    }
});

Flight::route('/user/*', function(){
    // 這里會(huì)被調(diào)用到
});

路由信息

如果你想檢視匹配到的路由信息,可以請(qǐng)求將路由對(duì)象傳遞到你的回調(diào)函數(shù)中:你需要把
route方法的第三個(gè)參數(shù)設(shè)置成true卦碾。這個(gè)路由對(duì)象總是會(huì)作為最后一個(gè)參數(shù)傳入你的回調(diào)函數(shù)铺坞。

Flight::route('/', function($route){
    // 匹配到的HTTP方法的數(shù)組
    $route->methods;

    // 命名參數(shù)數(shù)組
    $route->params;

    // 匹配的正則表達(dá)式
    $route->regex;

    // Contains the contents of any '*' used in the URL pattern
    $route->splat;
}, true);

擴(kuò)展

Fligth被設(shè)計(jì)成一個(gè)可擴(kuò)展的框架。這個(gè)框架帶來了一系列的默認(rèn)方法和組件洲胖,但是它允許你
映射你自己的方法济榨,注冊(cè)你自己的類,甚至可以重寫已有的類和方法绿映。

方法的映射

你可以使用map函數(shù)去映射你自定義的方法:

// 映射你自己的方法
Flight::map('hello', function($name){
    echo "hello $name!";
});

// 調(diào)用你的自定義方法
Flight::hello('Bob');

類的注冊(cè)

你可以使用register函數(shù)去注冊(cè)你自己的類:

// 注冊(cè)你定義的類
Flight::register('user', 'User');

// 得到你定義的類的一個(gè)實(shí)例
$user = Flight::user();

register方法允許你向類的構(gòu)造函數(shù)傳遞參數(shù)擒滑。所以當(dāng)你加載自定義類的時(shí)候,它將會(huì)
預(yù)初始化(pre-initialized)叉弦。你可以通過一個(gè)追加的數(shù)組來傳遞定義的構(gòu)造函數(shù)參數(shù)丐一。
這是一個(gè)加載數(shù)據(jù)庫(kù)連接的例子:

// 注冊(cè)一個(gè)帶有構(gòu)造函數(shù)參數(shù)的類
Flight::register('db', 'PDO', array('mysql:host=localhost;dbname=test','user','pass'));

// 得到你定義的類的一個(gè)實(shí)例
// 這里將創(chuàng)建一個(gè)帶有你定義的參數(shù)的對(duì)象
//
//     new PDO('mysql:host=localhost;dbname=test','user','pass');
//
$db = Flight::db();

如果你傳遞了額外的回調(diào)函數(shù)參數(shù),它將會(huì)在類構(gòu)造完之后立即執(zhí)行淹冰。這就允許你為這個(gè)新對(duì)象去
執(zhí)行任何的安裝過程(set up procedures)钝诚。這個(gè)回調(diào)函數(shù)會(huì)被傳遞一個(gè)參數(shù),就是這個(gè)新對(duì)象的實(shí)例榄棵。

// 這個(gè)回調(diào)函數(shù)將會(huì)傳遞到這個(gè)被構(gòu)造的對(duì)象中
Flight::register('db', 'PDO', array('mysql:host=localhost;dbname=test','user','pass'), function($db){
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
});

默認(rèn)情況下凝颇,每次你加載一個(gè)類潘拱,你會(huì)得到一個(gè)共享的實(shí)例。如果要得到一個(gè)類的新實(shí)例拧略,
簡(jiǎn)單的傳遞一個(gè)false參數(shù)就行了芦岂。

// 類的共享實(shí)例
$shared = Flight::db();

// 類的新實(shí)例
$new = Flight::db(false);

需要記住的是,被映射的方法優(yōu)先于被注冊(cè)的類垫蛆。如果你用相同的名字將它們都聲明了禽最,那么只有
映射的方法會(huì)被調(diào)用。

重寫(Overriding)

Flight允許你按照自己的需要去重寫它的默認(rèn)功能袱饭,而不用修改任何框架的代碼川无。

例如,當(dāng)Flight的路由功能沒有匹配到一個(gè)URL時(shí)虑乖,它會(huì)調(diào)用notFound方法懦趋,發(fā)出一個(gè)通用的
HTTP 404響應(yīng)。你可以使用map方法去重寫這個(gè)行為疹味。

Flight::map('notFound', function(){
    // 顯示自定義的404頁(yè)面
    include 'errors/404.html';
});

Flight也允許你替換這個(gè)框架的核心組件仅叫。例如你可以將默認(rèn)的Router類替換成你自定義的類:

// 注冊(cè)成你自定義的類
Flight::register('router', 'MyRouter');

// When Flight loads the Router instance, it will load your class
// 當(dāng)Flight加載Router實(shí)例時(shí),將會(huì)加載到你自定義的類
$myrouter = Flight::router();

然而框架的方法諸如mapregister是不能夠被重寫的糙捺。如果你嘗試這么做的話你會(huì)得到一個(gè)error诫咱。

過濾

Flight允許你在方法調(diào)用之前和之后去過濾它『榈疲框架里沒有任何你需要記住的預(yù)定義的鉤子坎缭。你可以
過濾任何被映射的自定義方法和框架中的方法。

一個(gè)過濾器函數(shù)是像這樣的:

function(&$params, &$output) {
    // Filter code
}

通過傳入的變量签钩,你可以操作輸入?yún)?shù)和/或輸出參數(shù)掏呼。

這樣做就可以在一個(gè)方法運(yùn)行之前運(yùn)行一個(gè)過濾器:

Flight::before('start', function(&$params, &$output){
    // Do something
});

這樣做就可以在一個(gè)方法運(yùn)行之后運(yùn)行一個(gè)過濾器:

Flight::after('start', function(&$params, &$output){
    // Do something
});

你可以給任何函數(shù)添加任意數(shù)量的過濾器。它們將按照聲明的順序依次被調(diào)用边臼。

這里是一個(gè)過濾器處理的例子:

// 映射一個(gè)自定義的方法
Flight::map('hello', function($name){
    return "Hello, $name!";
});

// 添加一個(gè)前置的過濾器
Flight::before('hello', function(&$params, &$output){
    // 操作這里的params
    $params[0] = 'Fred';
});

// 添加一個(gè)后置的過濾器
Flight::after('hello', function(&$params, &$output){
    // 操作這里的output
    $output .= " Have a nice day!";
});

// 調(diào)用這個(gè)自定義方法
echo Flight::hello('Bob');

這個(gè)將會(huì)輸出:

Hello Fred! Have a nice day!

如果你定義了多個(gè)過濾器哄尔,你可以通過在任意一個(gè)過濾器函數(shù)中返回false來終結(jié)這個(gè)過濾器鏈。

Flight::before('start', function(&$params, &$output){
    echo 'one';
});

Flight::before('start', function(&$params, &$output){
    echo 'two';

    // 如下將會(huì)終止這個(gè)過濾器鏈
    return false;
});

// 這里將不會(huì)得到調(diào)用
Flight::before('start', function(&$params, &$output){
    echo 'three';
});

記住柠并,核心函數(shù)諸如mapregister是不能夠被過濾的岭接,因?yàn)樗鼈兪潜恢苯诱{(diào)用而非動(dòng)態(tài)調(diào)用的。

變量

Flight允許你定義變量臼予,使得它能在應(yīng)用內(nèi)的任何地方被使用鸣戴。

// 保存你定義的變量
Flight::set('id', 123);

// 在應(yīng)用的其他地方使用
$id = Flight::get('id');

去檢測(cè)一個(gè)變量是否被設(shè)置了可以這么做:

if (Flight::has('id')) {
     // Do something
}

去清除一個(gè)變量你可以這么做:

// 清除這個(gè)id變量
Flight::clear('id');

// 清除所有的變量
Flight::clear();

Flight框架使用變量的目的還包括了配置。

Flight::set('flight.log_errors', true);

視圖

Flight默認(rèn)提供了一些基礎(chǔ)的模板功能粘拾。調(diào)用帶有模板文件和
可選的模板數(shù)據(jù)的render函數(shù)窄锅,去顯示一個(gè)視圖模板。

Flight::render('hello.php', array('name' => 'Bob'));

你傳進(jìn)來的模板數(shù)據(jù)缰雇,會(huì)被自動(dòng)的注入到模板當(dāng)中入偷,并且可以像一個(gè)本地變量一樣去引用追驴。
模板文件就是簡(jiǎn)單的PHP文件。如果一個(gè)文件名為hello.php的模板文件的內(nèi)容是這樣的:

Hello, '<?php echo $name; ?>'!

輸出會(huì)是:

Hello, Bob!

你可以使用set函數(shù)來手動(dòng)的設(shè)置視圖中的變量:

Flight::view()->set('name', 'Bob');

這個(gè)name 變量現(xiàn)在在你所有的視圖中都是可用的了疏之。所以就可以簡(jiǎn)化成這樣了:

Flight::render('hello');

注意當(dāng)你在render函數(shù)中指定模板名時(shí)殿雪,你可以去掉這個(gè).php的擴(kuò)展名。

默認(rèn)情況下Flight會(huì)在views目錄下尋找模板文件锋爪。你可以通過如下配置的設(shè)定來為你的模板
設(shè)置另外一個(gè)路徑丙曙。

Flight::set('flight.views.path', '/path/to/views');

布局(Layouts)

對(duì)網(wǎng)站來說,擁有一個(gè)單獨(dú)的可交換內(nèi)容的布局(layout)模板文件是很常見的其骄。要在布局中使用渲染的內(nèi)容亏镰,
你可以給render函數(shù)傳遞一個(gè)可選的參數(shù)。

Flight::render('header', array('heading' => 'Hello'), 'header_content');
Flight::render('body', array('body' => 'World'), 'body_content');

緊接著你的視圖就有了命名為header_contentbody_content的已保存的變量拯爽。接下來你就可以
這樣渲染你的布局了:

Flight::render('layout', array('title' => 'Home Page'));

如果你的模板文件是這樣的:

header.php:

<h1><?php echo $heading; ?></h1>

body.php:

<div><?php echo $body; ?></div>

layout.php:

<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
<?php echo $header_content; ?>
<?php echo $body_content; ?>
</body>
</html>

輸出會(huì)是:

<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Hello</h1>
<div>World</div>
</body>
</html>

自定義視圖

Flight允許你替換默認(rèn)的視圖引擎索抓,只需簡(jiǎn)單的注冊(cè)你自己的視圖類即可。這里展示的是在視圖中
如何使用Smarty模板引擎:

// 加載Smarty類庫(kù)
require './Smarty/libs/Smarty.class.php';

// 將Smarty注冊(cè)成視圖類
// 同時(shí)傳遞一個(gè)回調(diào)函數(shù)某抓,在加載過程中配置Smarty
Flight::register('view', 'Smarty', array(), function($smarty){
    $smarty->template_dir = './templates/';
    $smarty->compile_dir = './templates_c/';
    $smarty->config_dir = './config/';
    $smarty->cache_dir = './cache/';
});

// 模板中數(shù)據(jù)的賦值
Flight::view()->assign('name', 'Bob');

// 顯示這個(gè)模板
Flight::view()->display('hello.tpl');

出于完備性纸兔,你還應(yīng)該重寫Flight的默認(rèn)render方法:

Flight::map('render', function($template, $data){
    Flight::view()->assign($data);
    Flight::view()->display($template);
});

錯(cuò)誤(Error)處理

錯(cuò)誤(Errors)和異常(Exceptions)

所有的errors和exceptions都會(huì)被Flight捕獲惰瓜,然后傳到error方法否副。該方法默認(rèn)的行為是
發(fā)出一個(gè)帶有錯(cuò)誤信息的通用的HTTP 500 Internal Server Error響應(yīng)。

出于你自己的需要崎坊,你可以重寫這個(gè)行為:

Flight::map('error', function(Exception $ex){
    // 錯(cuò)誤處理
    echo $ex->getTraceAsString();
});

默認(rèn)情況下备禀,錯(cuò)誤(errors)是不會(huì)被記錄日志到web服務(wù)器的。你可以通過改變配置來允許記錄奈揍。

Flight::set('flight.log_errors', true);

Not Found

當(dāng)一個(gè)URL沒有被找到時(shí)曲尸,F(xiàn)light將會(huì)調(diào)用notFound方法。該方法默認(rèn)的行為是
發(fā)出一個(gè)通用的HTTP 404 Not Found響應(yīng)并帶有簡(jiǎn)單的說明信息男翰。

出于你自己的需要另患,你可以重寫這個(gè)行為:

Flight::map('notFound', function(){
    // 處理not found
});

重定向(Redirects)

你可以使用redirect方法將當(dāng)前請(qǐng)求重定向到傳入的新URL中。

Flight::redirect('/new/location');

默認(rèn)情況下Flight會(huì)發(fā)出一個(gè)HTTP 303狀態(tài)碼蛾绎。你可以選擇設(shè)置一個(gè)自定義的狀態(tài)碼昆箕。

Flight::redirect('/new/location', 401);

請(qǐng)求

Flight將HTTP請(qǐng)求封裝到一個(gè)單獨(dú)的對(duì)象中,你可以這樣獲取到它:

$request = Flight::request();

request對(duì)象提供了如下的屬性:

url - 被請(qǐng)求的url
base - The parent subdirectory of the URL
method - 請(qǐng)求的Method (GET, POST, PUT, DELETE)
referrer - 引用(referrer)的 URL
ip - 客戶點(diǎn)的IP地址
ajax - 是否是一個(gè)ajax請(qǐng)求
scheme - 服務(wù)器scheme (http, https)
user_agent - 瀏覽器信息
type - Content-type
length - Content-length
query - 查詢字符串參數(shù)(Query string parameters)
data - Post數(shù)據(jù)或者JSON數(shù)據(jù)
cookies - Cookies數(shù)據(jù)
files - 上傳的文件
secure - Whether the connection is secure
accept - HTTP accept parameters
proxy_ip - 客戶端代理ip地址

你可以通過數(shù)組或?qū)ο蟮姆绞絹慝@取query,data,cookiesfiles屬性租冠。

也就是說鹏倘,你可以這樣獲取到查詢字符串參數(shù)(query string parameter):

$id = Flight::request()->query['id'];

或者你可以這樣做:

$id = Flight::request()->query->id;

請(qǐng)求體原始數(shù)據(jù)(RAW Request Body)

要獲取原始的HTTP請(qǐng)求體數(shù)據(jù),舉例來說當(dāng)你正在處理PUT方法的請(qǐng)求時(shí)顽爹,你可以這么做:

$body = Flight::request()->getBody();

JSON 輸入

如果你發(fā)送application/json類型的請(qǐng)求并帶有數(shù)據(jù){"id": 123}時(shí)纤泵,它將被從data屬性中獲取到。

$id = Flight::request()->data->id;

HTTP緩存

Flight為HTTP級(jí)別的緩存提供了內(nèi)建的支持镜粤。如果滿足緩存的條件捏题,F(xiàn)light將會(huì)返回一個(gè)
HTTP304 Not Modified響應(yīng)玻褪。當(dāng)下一次客戶端請(qǐng)求相同的資源時(shí),它們會(huì)被提示去使用它們
本地的緩存版本公荧。

Last-Modified

你可以使用lastModified方法并傳遞一個(gè)UNIX時(shí)間戳去設(shè)置一個(gè)頁(yè)面最后被修改的日期和時(shí)間归园。
客戶端將繼續(xù)使用它們的緩存直到last modified的值被改變了。

Flight::route('/news', function(){
    Flight::lastModified(1234567890);
    echo 'This content will be cached.';
});

ETag

ETag緩存與Last-Modified類似稚矿,但你可以對(duì)資源指定任意的id庸诱。

Flight::route('/news', function(){
    Flight::etag('my-unique-id');
    echo 'This content will be cached.';
});

需要記住的是,不論調(diào)用了lastModified或是etag晤揣,都會(huì)設(shè)置并且檢查緩存的值桥爽。如果緩存中的值
跟請(qǐng)求的相同,F(xiàn)light會(huì)立即發(fā)送一個(gè)HTTP 304響應(yīng)并且停止處理昧识。

停止

你可以通過調(diào)用halt方法在任何地方停止這個(gè)框架:

Flight::halt();

你也可以指定可選的HTTP狀態(tài)碼和信息:

Flight::halt(200, 'Be right back...');

調(diào)用halt將會(huì)丟棄在那個(gè)點(diǎn)之前的任何的響應(yīng)內(nèi)容钠四。如果你想停止這個(gè)框架并輸出當(dāng)前的響應(yīng),使用stop方法:

Flight::stop();

JSON

Flight對(duì)發(fā)送JSON和JSONP響應(yīng)提供了支持跪楞。發(fā)送一個(gè)JSON響應(yīng)時(shí)缀去,你傳遞的數(shù)據(jù)將被JSON編碼。

Flight::json(array('id' => 123));

對(duì)于JSONP請(qǐng)求甸祭,你可以選擇傳遞查詢參數(shù)名(query parameter name)用于定義你的回調(diào)函數(shù):

Flight::jsonp(array('id' => 123), 'q');

所以缕碎,當(dāng)使用?q=my_func構(gòu)造一個(gè)GET請(qǐng)求時(shí),你應(yīng)該會(huì)收到這樣的輸出:

my_func({"id":123});

如果你沒有傳遞查詢參數(shù)名(query parameter name)的話池户,它會(huì)有一個(gè)默認(rèn)名jsonp咏雌。

配置

你可以使用set方法去設(shè)置配置的值,來自定義Flight的某些行為校焦。

Flight::set('flight.log_errors', true);

下面是所有的可進(jìn)行設(shè)置的配置列表:

flight.base_url - 覆蓋該請(qǐng)求的base url赊抖。(默認(rèn)值:null)
flight.handle_errors - 允許Flight處理所有的內(nèi)部錯(cuò)誤。 (默認(rèn)值:true)
flight.log_errors - 向web服務(wù)器的錯(cuò)誤日志文件里記錄錯(cuò)誤日志寨典。 (默認(rèn)值:false)
flight.views.path - 包含視圖模板文件的目錄路徑氛雪。 (默認(rèn)值:./views)

框架的方法

Flight框架被設(shè)計(jì)成易于使用和易于理解的。下面就是這個(gè)框架完整的方法集合耸成。它由 是常規(guī)靜態(tài)函數(shù)
的核心方法报亩,和被映射的可以被過濾和重寫的擴(kuò)展方法組成。

核心方法

Flight::map($name, $callback) // 創(chuàng)建一個(gè)自定的框架方法
Flight::register($name, $class, [$params], [$callback]) //將一個(gè)類注冊(cè)成框架方法
Flight::before($name, $callback) // 添加框架方法的前置過濾器
Flight::after($name, $callback) // 添加框架方法的后置過濾器
Flight::path($path) // 添加類自動(dòng)加載(autoloading)的路徑
Flight::get($key) // 獲取某個(gè)變量的值
Flight::set($key, $value) // 設(shè)置變量的值
Flight::has($key) // 某個(gè)變量是否被設(shè)值
Flight::clear([$key]) // 清除一個(gè)變量
Flight::init() // 初始化框架到默認(rèn)的設(shè)定
Flight::app() // 獲取整個(gè)應(yīng)用對(duì)象的實(shí)例

擴(kuò)展方法

Flight::start() // 開啟框架(接收響應(yīng)開始工作)
Flight::stop() // 框架停止并且發(fā)送返回響應(yīng)
Flight::halt([$code], [$message]) // 停止框架并返回一個(gè)可選的http狀態(tài)碼和信息
Flight::route($pattern, $callback) // 將一個(gè)URL匹配到一個(gè)回調(diào)中
Flight::redirect($url, [$code]) // 重定向到另一個(gè)URL
Flight::render($file, [$data], [$key]) // 渲染模板文件
Flight::error($exception) // 發(fā)送HTTP 500響應(yīng)
Flight::notFound() // 發(fā)送HTTP 404響應(yīng)
Flight::etag($id, [$type]) // 運(yùn)行HTTP Etag緩存
Flight::lastModified($time) // 運(yùn)行HTTP last modified緩存
Flight::json($data, [$code], [$encode]) // 發(fā)送JSON響應(yīng)
Flight::jsonp($data, [$param], [$code], [$encode]) // 發(fā)送JSONP響應(yīng)

任何通過mapregister添加的自定義方法都可以被過濾墓猎。

框架的實(shí)例

替代將Flight運(yùn)行成一個(gè)全局的靜態(tài)類捆昏,你可以選擇將它運(yùn)行成一個(gè)對(duì)象的實(shí)例。

require 'flight/autoload.php';

use flight\Engine;

$app = new Engine();

$app->route('/', function(){
    echo 'hello world!';
});

$app->start();

也就是取代調(diào)用靜態(tài)方法毙沾,你可以調(diào)用Engine對(duì)象實(shí)例里同名的方法骗卜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寇仓,更是在濱河造成了極大的恐慌举户,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遍烦,死亡現(xiàn)場(chǎng)離奇詭異俭嘁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)服猪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門供填,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罢猪,你說我怎么就攤上這事近她。” “怎么了膳帕?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵粘捎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我危彩,道長(zhǎng)攒磨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任汤徽,我火速辦了婚禮娩缰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泻骤。我一直安慰自己漆羔,他們只是感情好梧奢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布狱掂。 她就那樣靜靜地躺著,像睡著了一般亲轨。 火紅的嫁衣襯著肌膚如雪趋惨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天惦蚊,我揣著相機(jī)與錄音器虾,去河邊找鬼。 笑死蹦锋,一個(gè)胖子當(dāng)著我的面吹牛兆沙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莉掂,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼葛圃,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起库正,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤曲楚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后褥符,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龙誊,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年喷楣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趟大。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铣焊,死狀恐怖护昧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粗截,我是刑警寧澤惋耙,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站熊昌,受9級(jí)特大地震影響绽榛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婿屹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一灭美、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昂利,春花似錦届腐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扩所,卻和暖如春围详,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祖屏。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工助赞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袁勺。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓雹食,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親期丰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子群叶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容