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。