# 升级指南
- [从 5.5 升级到 5.6.0 ](#upgrade-5.6.0)
- [从 5.4 升级到 5.5.0 ](#upgrade-5.5.0)
- [从 5.3 升级到 5.4.0 ](#upgrade-5.4.0)
- [从 5.2 升级到 5.3.0 ](#upgrade-5.3.0)
- [从 5.1 升级到 5.2.0 ](#upgrade-5.2.0)
## 从 5.5 升级到 5.6.0
Lumen 5.6 是维护版本,将底层的软件包升级到 5.6 版本系列。在你将 Lumen 升级到 5.6 之前,你需要参阅一下 Laravel 5.6 [升级指南](https://laravel.com/docs/5.6/upgrade#upgrade-5.6.0) 并且根据你在 Laravel 中使用的组件对你的应用程序作出适当的更改
一旦你在应用程序中做出必要的调整,你可以在 `composer.json` 文件中升级你的 Lumen 框架依赖项并运行 `composer update` 命令:
"laravel/lumen-framework": "5.6.*"
## 从 5.4 升级到 5.5.0
Lumen 5.5 是维护版本,将底层的软件包升级到 5.6 版本系列。在你将 Lumen 升级到 5.5 之前,你需要参阅一下 Laravel 5.5 [升级指南](https://laravel.com/docs/5.5/upgrade#upgrade-5.5.0) 并且根据你在 Laravel 中使用的组件对你的应用程序作出适当的更改
一旦你在应用程序中做出必要的调整,你可以在 `composer.json` 文件中升级你的 Lumen 框架依赖项并运行 `composer update` 命令:
"laravel/lumen-framework": "5.5.*"
### 更新引导文件
在 Laravel 5.5 中,服务容器实现了 PSR-11 接口,当尝试使用服务容器作为服务代理时会造成与 `get` 方法的冲突。由于这个原因, `bootstrap / app.php` 文件需要更新以将一个 `Router` 实例传递给 `routes.php` 文件。在你的 `bootstrap/app.php` 文件底部附近,调整你的 `routes.php` 文件中的内容如下:
$app->router->group([
'namespace' => 'App\Http\Controllers',
], function ($router) {
require __DIR__.'/../routes/web.php';
});
### 更新路由文件
在更新 `bootstrap/app.php` 文件之后,你需要更新你的 `routes/web.php` 文件来使用 `$router` 变量,而不是 `$app` 变量:
$router->get('/hello', function () {
return 'Hello World';
});
## 从 5.3 升级到 5.4.0
Lumen 5.4 是维护版本,将底层的软件包升级到 5.4 版本系列。在你将 Lumen 升级到 5.4 之前,你需要参阅一下 Laravel 5.4 [升级指南](https://laravel.com/docs/5.4/upgrade#upgrade-5.4.0) 并且根据你在 Laravel 中使用的组件对你的应用程序作出适当的更改
一旦你在应用程序中做出必要的调整,你可以在 `composer.json` 文件中升级你的 Lumen 框架依赖项并运行 `composer update` 命令:
"laravel/lumen-framework": "5.4.*"
#### 服务提供者的请求
如果以前你在应用程序的服务提供者中访问了当前的请求,你应该使用中间件来重构之前的代码。
## 从 5.2 升级到 5.3.0
Lumen 5.3 没有改变框架的结构。相反,它作为一个维护版本发布的,以 Laravel 软件包为基础升级到 5.3 的版本。在升级你的应用之前,你应该重新阅读 Laravel 5.3 [升级指南](https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0),并根据你对 Laravel 组件的使用对你的应用程序作出相应的修改。
一旦你在应用程序做出了必要调整,你可以在 `composer.json` 文件中指定你使用 Lumen 框架的依赖,并且执行 `composer update` 命令进行升级:
"laravel/lumen-framework": "5.3.*"
## 从 5.1 升级到 5.2.0
Lumen 5.2 的新特性是专注于向无状态 APIs 的转变。因此,`session` 被框架移除。如果你想用这些特性,你应该将你的框架从 5.1 升级到 5.2 。
要将 Lumen 的应用程序升级到完整的 Laravel 框架,只需要将路由和类文件复制到新的应用程序中即可。由于 Laravel 和 Lumen 共享了许多相同的组件,因此您的类文件并不需要任何改变。
### 升级依赖项
更新`composer.json`文件,将依赖指向`laravel/lumen-framework 5.2.*` 和 `vlucas/phpdotenv ~2.2`.
### 启动文件
在`bootstrap/app.php` 文件中,你需要修改`Dotenv::load(...)` 方法的调用为如下代码:
try {
(new Dotenv\Dotenv(__DIR__.'/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
//
}
### Application 契约
Lumen 不再实现`Illuminate\Contracts\Foundation\Application`契约。所有`Application` 契约的类型提示都应该更新为`Laravel\Lumen\Application`类的直接引用。
### 用户认证
由于 Lumen 中不再支持 Session,用户认证是完全基于 API 令牌或 Header 头信息实现的无状态认证 。关于怎样使用认证系统,请阅读完整的 [用户认证文档](/docs/{{version}}/authentication) 获取更多详细信息。
### 集合
#### Eloquent 基类集合
现在,Eloquent 集合实例会为以下方法返回一个基类集合 (`Illuminate\Support\Collection`):`pluck`,`keys`,`zip`,`collapse`,`flatten`,`flip`。
#### 保留键名
现在,`slice`、`chunk`和`reverse`方法都会保留集合的键名。如果你不想让这些方法保留键名,请在`Collection`实例上调用`value`方法。
### 数据库
#### MySQL 日期
从 MySQL 5.7 开始,`strict` 严格模式是被默认开启的,所以像 `0000-00-00 00:00:00` 这样的不再是有效格式的日期。在向数据库中插入记录时,所有 timestamp 类型的字段都必须是一个有效的默认值。你可以在迁移文件中使用 `useCurrent` 方法来将 timestamp 字段默认为当前时间,或者你也可以将其设置为 `nullable` 以允许其接收 `null` 值:
$table->timestamp('foo')->nullable();
$table->timestamp('foo')->useCurrent();
$table->nullableTimestamps();
#### MySQL JSON 字段类型
在 MySQL 驱动下,`json` 字段类型现在会被真实地创建为 JSON 字段。但如果您没有使用 MySQL 5.7 或更高版本,您将无法使用此字段类型,您可以在迁移文件中使用 `text` 字段类型来代替。
### Eloquent
#### 日期转换
当调用模型或模型集合的 `toArray` 方法时,任何被添加到 `$casts` 的属性比如 `date`、`datetime`,现在都会被转换为字符串类型。这使日期转换与 `$dates` 数组中指定的日期保持一致。
#### 全局作用域
为了使用方便,我们已经重写全局作用域的实现。因此,全局作用域不再需要 `remove` 方法,所以你应该在写了该方法的全局作用域中将其移除。
如果你曾在 Eloquent 查询构造器上调用过 `getQuery` 方法来访问底层的查询构造实例,现在你得改为调用 `toBase` 方法。
无论您曾出于任何原因只要调用过 `remove` 方法,现在都得修改为调用 `$eloquentBuilder->withoutGlobalScope($scope)` 。
在 Eloquent 查询构造器中,现在新增了 `withoutGlobalScope` 和 `withoutGlobalScopes` 方法,之前所有调用了 `$model->removeGlobalScopes($builder)` 的地方现在都得修改为 `$builder->withoutGlobalScopes()` 。
#### 主键
默认情况下,Eloquent 会默认主键为整型,并自动将其强制为整型来处理。但如果你的主键并不是整型,请在 Eloquent 模型上重写 `$incrementing` 属性设置为 `false`:
/**
* 标示 ID 主键是否自动增长。
*
* @var bool
*/
public $incrementing = true;
### 异常处理
你的 `App\Exceptions\Handler` 类的 `$dontReport` 属性应该更新为至少包含以下的异常类型:
use Illuminate\Validation\ValidationException;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
/**
* 应该被忽略的异常类型的列表。
*
* @var array
*/
protected $dontReport = [
AuthorizationException::class,
HttpException::class,
ModelNotFoundException::class,
ValidationException::class,
];
### IronMQ
IronMQ 队列驱动已经移植到它自己的包中,不再与核心框架一起提供。
[http://github.com/LaravelCollective/iron-queue](http://github.com/laravelcollective/iron-queue)
### 存储
如果你使用了 Laravel 的 Flysystem 文件系统集成,你将需要注册`filesystem`绑定。请将以下代码添加到 `bootstrap/app.php`文件中:
$app->singleton('filesystem', function ($app) {
return $app->loadComponent(
'filesystems',
Illuminate\Filesystem\FilesystemServiceProvider::class,
'filesystem'
);
});
### 验证
`ValidatesRequests` Trait 已经合并到 `ProvidesConvenienceMethods` Trait 里,并在 Lumen 的基类控制器中使用。
如果你先前在基类控制器之外使用了`ValidatesRequests`Trait,你可以 [从 5.1 分支](https://github.com/laravel/lumen-framework/blob/5.1/src/Routing/ValidatesRequests.php) 把它复制出来,或者使用完整的`ProvidesConvenienceMethods`Trait。
### 测试
`DatabaseMigrations` 和 `DatabaseTransactions` traits之前文件存放的位置 `Illuminate\Foundation\Testing\DatabaseMigrations` 和 `Illuminate\Foundation\Testing\DatabaseTransactions` 已经发生变动。 请在你的测试中更新使用新的命名空间: