最近使用 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 的成本是极低的。
祝玩的愉快!