最近使用 Lumen 作了 2 個業餘項目,特此記錄和分享一下。php
在使用一項新的技術時,瞭解其應用場景是首要的事情。laravel
Lumen 的口號:爲速度而生的 Laravel 框架
Lumen 的定位:微框架
Lumen 的應用場景:Lumen 專爲微服務或者 API 設計
Lumen 的優勢:構建在 Laravel 之上, 使其具有 Laravel 強大的功能
Lumen 包含了 Laravel 的哪些功能:git
以上內容來自:Lumen 的介紹,建議點擊閱讀詳情。github
目前是1.0 版本,是基於 Laravel 5.x 開發。看 github 上做者更新的很勤快,可是這也致使文檔和實際狀況有不一致的狀況,變更也比較頻繁。吐個槽:也許,我下面說的一些狀況都發生了變化。redis
既然是爲了快速而生,砍掉功能的必然的,功能的有或無,事先了解到便可,倒不算做最大的區別。我認爲可見的最大變化是:數據庫
Lumen 沒有使用 Symfony 的路由模塊, 而是採用了速度更加快的 nikic/fast-route。bootstrap
這個變化也延伸出其餘的一些變化,好比和路由相關的一些 helper 函數也少了。緩存
不可見的變化:我猜測框架的初始化機制應該也發生了很大的變化,可是對於使用框架並無可見的影響。由於我沒有深刻去讀框架源碼,因此也不敢亂說。cookie
Lumen 下的 Artisan 命令比 Laravel 的少不少。這個在項目下運行 php artisan
,和 Laravel 的比較一下就知道了。
可是,有些命令沒有也不影響原有功能的使用,畢竟 Artisan 命令工具只是起到輔助開發和提升效率的做用。session
在 Laravel 中,要建立一個新的自定義命令,可使用 make:console
這個 Artisan 命令。好比:php artisan make:console FooCommand
。
可是,在 Lumen 中沒有這個 Artisan 命令。因而,我在 Laravel 下使用該命令,生成了文件 app/Console/Commands/FooCommand.php
。我將文件複製到 Lumen 項目中的 app/Console/Commands/
的目錄下,並按照 Laravel 的文檔 Artisan 開發編寫,成功運行。以後,我使用該方式建立了兩個具備完整功能的 Artisan 命令(一個是爬蟲並和 MySQL 交互,另外一個是和 Redis 交互),目前尚沒有發現有任何問題。
框架的入口文件是 public/index.php
。裏面也只有兩行代碼:
php$app = require __DIR__.'/../bootstrap/app.php'; $app->run();
啓動並運行。
閱讀 bootstrap/app.php
文件仍是很重要的,下面的內容幾乎都有涉及這個文件。
Lumen 的配置文件是項目根目錄下的 .env
文件,官方給出了一個例子文件:.env.example
。須要在 bootstrap/app.php
中將 Dotenv::load(__DIR__ . '/../');
的註釋去掉才能使用 .env
,幾乎不少操做都依賴這個,不知道爲何它默認是加上註釋的。
在 bootstrap/app.php
中,最後兩行代碼是:
phprequire __DIR__ . '/../app/Http/routes.php'; return $app;
路由定義在文件 app/Http/routes.php
中。裏面給出了一個例子:
php$app->get('/', function() use ($app) { return $app->welcome(); });
路由的詳情能夠參見文檔 HTTP 路由。
這裏我想吐個槽,$app->welcome
這個可能是爲了測速而耍的小伎倆,由於 welcome
這個方法只是單純輸出 HTML 歡迎頁,可是是直接寫在 Laravel\Lumen\Application
類中的,這不科學。
在路由中指定控制器類必須寫全命名空間,否則會提示找不到類。
php$app->get('/test', array( 'uses' => 'App\Http\Controllers\TestController@getIndex', ));
這個和 Laravel 不一樣,在 Laravel 中是能夠沒必要指定 App\Http\Controllers
:
php$app->get('/test', array( 'uses' => 'TestController@getIndex', ));
由於在 Laravel 中,默認控制器的根命名空間爲 App\Http\Controllers
。這個也能夠設置:URL::setRootControllerNamespace('App\Http\Controllers');
。參見 Laravel 文檔:HTTP 控制器。
可是,在 Lumen 中,這些都是沒有的。我只在框架源碼中找到接口 UrlGenerator
中有 setRootControllerNamespace
的定義,並無找到實現。我猜這個應該也是換路由帶來的影響,不知道後面會不會有修改。
若是實在不想重複寫全命名空間,除了定義一個變量(或常量)外,還有一種旁門左道的方法,使用組路由:
php$app->group(array('namespace' => 'App\Http\Controllers'), function () use ($app) { $app->get( '/login', array( 'as' => 'login', 'uses' => 'PassportController@getLogin', )); });
畢竟是旁門左道,我其實的拒絕的。
Facades 提供一個靜態接口給在應用程序的服務容器中能夠取用的類
好比:
php\Cache::put('key', 'value', $minutes); \DB::getQueryLog()
在 Lumen 中,這個功能默認是沒有開啓的。開啓方式是去掉 bootstrap/app.php
中 $app->withFacades();
的註釋。
固然,若是不開啓,也不礙事:
phpuse Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\DB; Cache::put('key', 'value', $minutes); DB::getQueryLog();
Lumen 中可使用的 Facades,查看源代碼,可用清單以下:
phppublic function withFacades() { Facade::setFacadeApplication($this); if (! static::$aliasesRegistered) { static::$aliasesRegistered = true; class_alias('Illuminate\Support\Facades\App', 'App'); class_alias('Illuminate\Support\Facades\Auth', 'Auth'); class_alias('Illuminate\Support\Facades\Bus', 'Bus'); class_alias('Illuminate\Support\Facades\DB', 'DB'); class_alias('Illuminate\Support\Facades\Cache', 'Cache'); class_alias('Illuminate\Support\Facades\Cookie', 'Cookie'); class_alias('Illuminate\Support\Facades\Crypt', 'Crypt'); class_alias('Illuminate\Support\Facades\Event', 'Event'); class_alias('Illuminate\Support\Facades\Hash', 'Hash'); class_alias('Illuminate\Support\Facades\Log', 'Log'); class_alias('Illuminate\Support\Facades\Mail', 'Mail'); class_alias('Illuminate\Support\Facades\Queue', 'Queue'); class_alias('Illuminate\Support\Facades\Request', 'Request'); class_alias('Illuminate\Support\Facades\Schema', 'Schema'); class_alias('Illuminate\Support\Facades\Session', 'Session'); class_alias('Illuminate\Support\Facades\Storage', 'Storage'); class_alias('Illuminate\Support\Facades\Validator', 'Validator'); } }
數據庫相關配置信息在 .env 文件裏面, DB_* 開頭。 你能夠定義全部的數據庫鏈接。目前 Lumen 支持四種數據庫系統:MySQL、Postgres、SQLite、以及 SQL Server。
數據庫和 Eloquent ORM 和 Laravel 中的用法同樣,看 Laravel 的相關文檔便可。
數據庫操做日誌默認是關閉的,啓動方式:
phpDB::connection()->enableQueryLog();
詳情參見:查找日誌記錄。
在 Lumen 中若是須要使用 Eloquent ORM,應該去掉 bootstrap/app.php
中 $app->withEloquent();
的註釋。
詳情參見:數據庫使用基礎。
Session 默認未開啓。
開啓方式:去掉 bootstrap/app.php
中 $app->middleware();
的 StartSession
中間件的註釋。
使用時發生錯誤:Class 'Memcached' not found
,由於在 .env
文件中,Session 的默認驅動是:memcached
。修改便可。
目前支持的驅動有:file
、cookie
、database
、memcached
、redis
、array
。詳情參見:會話。
對了,說一句,重定向的功能有依賴於 Session。
若是你想讓全部的 Cookie 都加密的話, 你須要把
bootstrap/app.php
的EncryptCookies
中間件去掉註釋. Lumen 所創建的 cookie 會加密而且加上認證記號,這表明着被用戶擅自更改的 cookie 會失效。
通常使用 cookie 都是伴着 Response
對象返回給客戶端的:
php$response->withCookie(cookie('name', 'value', $minutes)); return $response;
若是不喜歡上面那種方式,還有另一種:
phpCookie::queue('name', 'value'); return $response;
可是:
你須要在
bootstrap/app.php
文件裏面註釋掉AddQueuedCookiesToResponse
這一行來使用此功能.
最後說一下,Lumen 定位是微框架,Laravel 定位是全棧框架。使用一項技術時,得先了解一下它適用的場景。Lumen 的適用場景,官方有介紹:在何時使用 Lumen?。若是場景不對,那麼 Lumen 的優點(好比:速度、簡單)可能就發揮不出來,而劣勢卻會更加凸顯。若是想用 Lumen 作太多太複雜的事情,仍是直接上 Laravel。否則,你可能會以爲 Lumen 怎麼這也沒有那也不行的(尤爲是用過 Laravel,這種感受可能更甚)。好在 Lumen 自己和 Laravel 出自同門,Lumen 向 Laravel 遷移是很容易的事情,代碼改動量並不大。
最後的最後,若是熟悉 Laravel,那麼學習 Lumen 的成本是極低的。
祝玩的愉快!