Lumem(一):入门介绍

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
9
bootstrap/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。