Lumen是Laravel框架作者Taylor Otwell为无状态API微服务而专门基于Laravel开发的框架。
Lumen名字来源:Illuminate,这是Laravel中主要实现包。
使用Lumen,你可以做到:
- Laravel各种优雅的用法
- 专注后端、无状态Stateless、微服务micro-service
- 性能比Laravel提升一倍
相比Laravel,去除了下列包依赖,使得包依赖由53降到28。 - Illuminate:console、cookie、exception、log、mail、redis、routing、session
- Symfony:routing、translation、process、console、debug、finder
- league:flysystem
- Jeremeamia:superclosure
Lumen 创建项目步骤
1. composer创建lumen项目
composer create-project laravel/lumen --prefer-dist
2. lumen初始化配置
这里采用Nginx作为http server,确认Nginx配置没问题,默认访问Lumen会显示Lumen版本信息。
Lumen (5.2.7) (Laravel Components 5.2.*)
- 修改区域和时区
1
2
3
4 vendor/laravel/lumen-framework/config/app.php
'locale' => env('APP_LOCALE', 'cn'),
vendor/laravel/lumen-framework/src/Application.php
date_default_timezone_set(env('APP_TIMEZONE', 'Asia/Shanghai'));
由于Lumen建议统一采用.env方式管理配置,在Application.php中也是根据APP_TIMEZONE设置的,但我们的项目里将config外提到项目根目录下,且通过部署脚本在config和config.sandbox目前间切换配置文件,因此,这里直接修改Application.php源码。
3. 路由定义
默认路由文件:app/Http/routes.php
1
2
3
4
5
6
7
8
9bootstrap/app.php
$app->group(['namespace' => 'App\Http\Controllers'], function ($app) {
require __DIR__.'/../app/Http/routes.php';
});
app/Http/routes.php
$app->get('/', function () use ($app) {
return $app->version();
});
注:5.2版本Lumen已修复之前Controller命名空间缺失的问题。
新增路由:$app->get('/', 'ExampleController@helloworld');
4. Log按日分割配置
增加LogServiceProvider,实现按日分割日志。
新增app/Providers/LogServiceProvider.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\RotatingFileHandler;
class LogServiceProvider extends ServiceProvider
{
/**
* 扩展Lumen支持按日分割保存日志
* Configure logging on boot.
*
* @return void
*/
public function boot()
{
// max files to be saved
$maxFiles = 30;
$handlers[] = (new RotatingFileHandler(storage_path('logs/lumen.log'), $maxFiles))
->setFormatter(new LineFormatter(null, null, true, true));
$this->app['log']->setHandlers($handlers);
}
/**
* Register the log service.
*
* @return void
*/
public function register()
{
// Log binding already registered in vendor/laravel/lumen-framework/src/Application.php.
}
}向容器注册ServiceProvider,修改文件:bootstrap/app.php
1
$app->register(App\Providers\LogServiceProvider::class);
5. 如何读取配置文件?
- bootstrap/app.php增加:
$app->configure('app');
- 程序中通过全局的辅助函数:
$test = config('app.cipher');
读取相应配置项
6. Redis使用
由于Lumen默认去除了Laravel中predis和illuminate/redis包依赖,所以Lumen默认无法直接支持Redis。
为Lumen添加Redis支持的步骤:
- composer安装predis和illuminate/redis包:composer require predis/predis ~1.0和illuminate/redis 5.2.*
- 开启Facades支持(bootstrap/app.php):$app->withFacades()
- 注册redisServiceProvider(bootstrap/app.php):$app->register(Illuminate\Redis\RedisServiceProvider::class);
- Facades增加Redis别名(vendor/laravel/lumen-framework/src/Application.php, withFacades函数):class_alias(‘Illuminate\Support\Facades\Redis’, ‘Redis’);
注:predis为PHP实现的Redis客户端,如考虑性能,可考虑采用PhpRedis扩展方式替代predis。