升级指南


Lumen 5.2 只专注与提供无状态API,因此,session已经从框架中移除,如果你想要使用session,需要切换到 Laravel 5.2。

从 Lumen 5.2 升级到 Laravel 5.2 很简单,只需要将路由和应用中自己编写的类拷贝到 Laravel 中即可,由于 Laravel 和 Lumen 共用很多底层组件,即使是自己编写的类也无需做大的改动。

1、升级依赖

更新composer.json文件指向 laravel/lumen-framework 5.2.*

2、Application

Lumen 不再实现 Illuminate\Contracts\Foundation\Application 契约,任何声明此类型依赖的都需要更新为直接引用 Laravel\Lumen\Application类。

认证

由于Lumen不再支持会话,认证完全基于API token或请求头来实现。关于Lumen中认证的实现及使用请参考完整认证文档。

集合

3、Eloquent集合基类

Eloquent集合实例现在返回一个集合基类( Illuminate\Support\Collection)以便提供如下几种方法: pluckkeyszipcollapseflattenflip

保留Key

slicechunkreverse方法现在可以保留集合中的key,如果你不想要这些方法保留key,可以使用 Collection实例上的values方法。

4、数据库

MySQL日期

从 MySQL 5.7 开始, 0000-00-00 00:00:00不再被认为是一个有效的日期,因为strict模式是默认开启的,所有时间戳字段在插入记录到数据库的时候必须接收一个有效的默认值,你可以在迁移中使用 useCurrent方法将时间戳字段默认设置为当前时间戳,或者调用nullable方法以允许null值:

$table->timestamp('foo')->nullable();
$table->timestamp('foo')->useCurrent();
$table->nullableTimestamps();

MySQL JSON 字段类型

MySQL 5.7 起开始支持 json 字段,所以json字段类型现在可以创建一个json字段并保存到数据库,如果使用MySQL版本低于5.7,那么需要使用text字段保存json数据到该字段。

5、Eloquent

日期转化

被添加到$casts的所有被标记为date或datetime的属性在调用模型或集合上的toArray方法时现在都会被转化为字符串,从而和$dates数组中定义的日期转化保持一致。

全局作用域

全局作用域的实现被重写以便使用起来更加简单,全局作用域不再需要remove方法,所以你编写的代码中如果调用了该方法需要将其移除。

如果你调用了Eloquent查询构建器上的getQuery方法来访问底层的查询构建器实例,现在需要将其改为toBase

如果你调用了remove方法,需要将其修改为 $eloquentBuilder->withoutGlobalScope($scope)

Eloquent查询构建器新增了 withoutGlobalScopewithoutGlobalScopes方法,所有调用 $model->removeGlobalScopes($builder)的地方现在需要修改为更加简单的 $builder->withoutGlobalScopes()

主键

默认情况下,Eloquent假设你的主键是整型并且会将其自动转化为整型,设置任何不是整型的主键需要设置Eloquent模型上的 $incrementing属性值为false

/**
 * Indicates if the IDs are auto-incrementing.
 *
 * @var bool
 */
public $incrementing = true;

6、异常处理

App\Exceptions\Handler类的 $dontReport属性现在需要包含至少以下几种异常类型:

use Illuminate\Validation\ValidationException;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;

/**
 * A list of the exception types that should not be reported.
 *
 * @var array
 */
protected $dontReport = [
    AuthorizationException::class,
    HttpException::class,
    ModelNotFoundException::class,
    ValidationException::class,
];

7、IronMQ

IronMQ 队列驱动现在被转移到其自己的包中,核心框架不再包含其处理,要使用IronMQ,请参考: http://github.com/LaravelCollective/iron-queue

8、存储

如果你使用了Laravel的Flysystem,需要注册filesystem绑定,添家如下代码到 bootstrap/app.php

$app->singleton('filesystem', function ($app) {
    return $app->loadComponent(
        'filesystems',
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        'filesystem'
    );
});

9、验证

被Lumen控制器基类使用的 ValidatesRequests trait现在被合并到 ProvidesConvenienceMethods trait。

如果你先前在控制器基类之外使用了 ValidatesRequests trait,可以将其从5.1分支拷贝过来或者直接使用 ProvidesConvenienceMethods trait。