升级指南
- 从 5.1 升级到 5.2.0
- 升级到 5.1.11
- 升级到 5.1.0
- 升级到 5.0.16
- 从 4.2 升级到 5.0
- 从 4.1 升级到 4.2
- 从 <= 4.1.x 升级到 4.1.29
- 从 <= 4.1.25 升级到 4.1.26
- 从 4.0 升级到 4.1
从 5.1 升级到 5.2.0
预计升级时间:少于 1 小时
我们尝试提供框架中每个可能的重大更改的非常全面的列表。然而,这些更改中的许多可能不适用于您的应用程序。
更新依赖
更新您的 composer.json
文件以指向 laravel/framework 5.2.*
。
在 composer.json
文件的 require-dev
部分中添加 "symfony/dom-crawler": "~3.0"
和 "symfony/css-selector": "~3.0"
。
认证
配置文件
您应该更新您的 config/auth.php
配置文件,链接如下:https://github.com/laravel/laravel/blob/638b261a68913bae9a64f6d540612b862fa3c4dd/config/auth.php
更新文件后,根据旧的配置文件设置您的认证配置选项。如果您在 Laravel 5.1 中使用典型的基于 Eloquent 的认证服务,大多数值应该保持不变。
特别注意新 auth.php
配置文件中的 passwords.users.email
配置选项,并验证视图路径是否与您的应用程序的实际视图路径匹配,因为在 Laravel 5.2 中此视图的默认路径已更改。如果新配置文件中的默认值与现有视图不匹配,请更新配置选项。
合同
如果您实现了 Illuminate\Contracts\Auth\Authenticatable
合同但未使用 Authenticatable
trait,您应该在合同实现中添加一个新的 getAuthIdentifierName
方法。通常,此方法将返回可认证实体的“主键”列名。例如:id
。
除非您手动实现此接口,否则这不太可能影响您的应用程序。
自定义驱动
如果您使用 Auth::extend
方法定义自定义用户检索方法,现在应该使用 Auth::provider
定义自定义用户提供者。定义自定义提供者后,您可以在新 auth.php
配置文件的 providers
数组中配置它。
有关自定义认证提供者的更多信息,请查阅完整的认证文档。
重定向
Illuminate\Foundation\Auth\AuthenticatesUsers
中的 loginPath()
方法已被移除,因此在 AuthController
中放置 $loginPath
变量不再需要。默认情况下,trait 将始终在认证错误时将用户重定向回其先前的位置。
授权
Illuminate\Auth\Access\UnauthorizedException
已重命名为 Illuminate\Auth\Access\AuthorizationException
。如果您没有手动捕获此异常,这不太可能影响您的应用程序。
集合
Eloquent 基础集合
Eloquent 集合实例现在为以下方法返回基础集合 (Illuminate\Support\Collection
):pluck
、keys
、zip
、collapse
、flatten
、flip
。
键保留
slice
、chunk
和 reverse
方法现在在集合上保留键。如果您不希望这些方法保留键,请在 Collection
实例上使用 values
方法。
Composer 类
Illuminate\Foundation\Composer
类已移至 Illuminate\Support\Composer
。如果您没有手动使用此类,这不太可能影响您的应用程序。
命令和处理程序
自处理命令
您不再需要在作业/命令上实现 SelfHandling
合同。所有作业现在默认是自处理的,因此您可以从类中删除此接口。
分离命令和处理程序
Laravel 5.2 命令总线现在仅支持自处理命令,不再支持分离命令和处理程序。
如果您希望继续使用分离命令和处理程序,可以安装一个 Laravel Collective 包,该包提供向后兼容的支持:https://github.com/LaravelCollective/bus
配置
环境值
在您的 app.php
配置文件中添加一个 env
配置选项,如下所示:
'env' => env('APP_ENV', 'production'),
缓存和环境
如果您在部署期间使用 config:cache
命令,您必须确保仅在配置文件中调用 env
函数,而不是在应用程序的其他地方调用。
如果您在应用程序中调用 env
,强烈建议您将适当的配置值添加到配置文件中,并从该位置调用 env
,以便您可以将 env
调用转换为 config
调用。
编译类
如果存在,请从 config/compile.php
的 files
数组中删除以下行:
realpath(__DIR__.'/../app/Providers/BusServiceProvider.php'),
realpath(__DIR__.'/../app/Providers/ConfigServiceProvider.php'),
如果此处列出的服务提供者不存在,运行 php artisan optimize
时可能会触发错误。
CSRF 验证
在运行单元测试时不再自动执行 CSRF 验证。这不太可能影响您的应用程序。
数据库
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 列类型
json
列类型现在在使用 MySQL 驱动程序时创建实际的 JSON 列。如果您未运行 MySQL 5.7 或更高版本,则此列类型将不可用。相反,请在迁移中使用 text
列类型。
填充
在运行数据库填充时,所有 Eloquent 模型现在默认不受保护。以前需要调用 Model::unguard()
。如果您希望在填充期间保护模型,可以在 DatabaseSeeder
类的顶部调用 Model::reguard()
。
Eloquent
日期转换
任何已添加到 $casts
属性中的 date
或 datetime
属性现在在调用 toArray
时将转换为字符串。这使得日期转换与 $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;
事件
核心事件对象
Laravel 触发的一些核心事件现在使用事件对象而不是字符串事件名称和动态参数。以下是旧事件名称及其新的基于对象的对应项:
旧 | 新 |
---|---|
artisan.start | Illuminate\Console\Events\ArtisanStarting |
auth.attempting | Illuminate\Auth\Events\Attempting |
auth.login | Illuminate\Auth\Events\Login |
auth.logout | Illuminate\Auth\Events\Logout |
cache.missed | Illuminate\Cache\Events\CacheMissed |
cache.hit | Illuminate\Cache\Events\CacheHit |
cache.write | Illuminate\Cache\Events\KeyWritten |
cache.delete | Illuminate\Cache\Events\KeyForgotten |
connection.{name}.beginTransaction | Illuminate\Database\Events\TransactionBeginning |
connection.{name}.committed | Illuminate\Database\Events\TransactionCommitted |
connection.{name}.rollingBack | Illuminate\Database\Events\TransactionRolledBack |
illuminate.query | Illuminate\Database\Events\QueryExecuted |
illuminate.queue.before | Illuminate\Queue\Events\JobProcessing |
illuminate.queue.after | Illuminate\Queue\Events\JobProcessed |
illuminate.queue.failed | Illuminate\Queue\Events\JobFailed |
illuminate.queue.stopping | Illuminate\Queue\Events\WorkerStopping |
mailer.sending | Illuminate\Mail\Events\MessageSending |
router.matched | Illuminate\Routing\Events\RouteMatched |
这些事件对象中的每一个都包含与 Laravel 5.1 中传递给事件处理程序的参数完全相同的参数。例如,如果您在 5.1.* 中使用 DB::listen
,您可以像这样更新您的代码以适应 5.2.*:
DB::listen(function ($event) {
dump($event->sql);
dump($event->bindings);
});
您可以查看每个新的事件对象类以查看其公共属性。
异常处理
您的 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,
];
辅助函数
url()
辅助函数现在在未提供路径时返回 Illuminate\Routing\UrlGenerator
实例。
隐式模型绑定
Laravel 5.2 包含“隐式模型绑定”,这是一项方便的新功能,可以根据 URI 中的标识符自动将模型实例注入到路由和控制器中。然而,这确实改变了类型提示模型实例的路由和控制器的行为。
如果您在路由或控制器中类型提示模型实例并期望注入一个空模型实例,您应该删除此类型提示并直接在路由或控制器中创建一个空模型实例;否则,Laravel 将尝试根据路由 URI 中的标识符从数据库中检索现有模型实例。
IronMQ
IronMQ 队列驱动程序已移至其自己的包中,不再与核心框架一起提供。
http://github.com/LaravelCollective/iron-queue
作业/队列
php artisan make:job
命令现在默认创建一个“队列”作业类定义。如果您想创建一个“同步”作业,请在发出命令时使用 --sync
选项。
邮件
pretend
邮件配置选项已被移除。相反,请使用 log
邮件驱动程序,该驱动程序执行与 pretend
相同的功能,并记录有关邮件消息的更多信息。
分页
为了与框架生成的其他 URL 保持一致,分页器 URL 不再包含尾随斜杠。这不太可能影响您的应用程序。
服务提供者
Illuminate\Foundation\Providers\ArtisanServiceProvider
应从 app.php
配置文件中的服务提供者列表中移除。
Illuminate\Routing\ControllerServiceProvider
应从 app.php
配置文件中的服务提供者列表中移除。
会话
由于认证系统的更改,升级到 Laravel 5.2 时,任何现有会话都将失效。
数据库会话驱动
框架为 database
会话驱动编写了一个新驱动,其中包含有关用户的更多信息,例如其用户 ID、IP 地址和用户代理。如果您希望继续使用旧驱动,可以在 session.php
配置文件中指定 legacy-database
驱动。
如果您想使用新驱动,您应该在会话数据库表中添加 user_id (nullable integer)
、ip_address (nullable string)
和 user_agent (text)
列。
Stringy
框架不再包含“Stringy”库。如果您希望在应用程序中使用它,可以通过 Composer 手动安装。
验证
异常类型
ValidatesRequests
trait 现在抛出 Illuminate\Foundation\Validation\ValidationException
实例,而不是抛出 Illuminate\Http\Exception\HttpResponseException
实例。除非您手动捕获此异常,否则这不太可能影响您的应用程序。
弃用
以下功能在 5.2 中已弃用,并将在 2016 年 6 月的 5.3 版本中移除:
Illuminate\Contracts\Bus\SelfHandling
合同。可以从作业中移除。- 集合、查询构建器和 Eloquent 查询构建器对象上的
lists
方法已重命名为pluck
。方法签名保持不变。 - 使用
Route::controller
的隐式控制器路由已被弃用。请在路由文件中使用显式路由注册。这可能会被提取到一个包中。 get
、post
和其他路由助手函数已被移除。您可以使用Route
facade。- 从 5.1 开始的
database
会话驱动已重命名为legacy-database
,并将被移除。有关“数据库会话驱动”的更多信息,请查阅上面的说明。 Str::randomBytes
函数已被弃用,建议使用random_bytes
原生 PHP 函数。Str::equals
函数已被弃用,建议使用hash_equals
原生 PHP 函数。Illuminate\View\Expression
已被弃用,建议使用Illuminate\Support\HtmlString
。WincacheStore
缓存驱动已被移除。
升级到 5.1.11
Laravel 5.1.11 包括对授权和策略的支持。将这些新功能集成到现有的 Laravel 5.1 应用程序中非常简单。
这些升级是可选的,忽略它们不会影响您的应用程序。
创建策略目录
首先,在您的应用程序中创建一个空的 app/Policies
目录。
创建/注册 AuthServiceProvider 和 Gate Facade
在您的 app/Providers
目录中创建一个 AuthServiceProvider
。您可以从 GitHub 上复制默认提供者的内容从 GitHub。如果您的应用程序使用自定义命名空间,请记得更改提供者的命名空间。创建提供者后,请确保在 app.php
配置文件的 providers
数组中注册它。
此外,您应该在 app.php
配置文件的 aliases
数组中注册 Gate
facade:
'Gate' => Illuminate\Support\Facades\Gate::class,
更新用户模型
其次,在您的 App\User
模型上使用 Illuminate\Foundation\Auth\Access\Authorizable
trait 和 Illuminate\Contracts\Auth\Access\Authorizable
合同:
<?php
namespace App;
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
class User extends Model implements AuthenticatableContract,
AuthorizableContract,
CanResetPasswordContract
{
use Authenticatable, Authorizable, CanResetPassword;
}
更新基础控制器
接下来,更新您的基础 App\Http\Controllers\Controller
控制器以使用 Illuminate\Foundation\Auth\Access\AuthorizesRequests
trait:
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
abstract class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
升级到 5.1.0
预计升级时间:少于 1 小时
更新 bootstrap/autoload.php
将 bootstrap/autoload.php
中的 $compiledPath
变量更新为以下内容:
$compiledPath = __DIR__.'/cache/compiled.php';
创建 bootstrap/cache
目录
在您的 bootstrap
目录中创建一个 cache
目录 (bootstrap/cache
)。在此目录中放置一个 .gitignore
文件,内容如下:
*
!.gitignore
此目录应可写,并将由框架用于存储临时优化文件,如 compiled.php
、routes.php
、config.php
和 services.json
。
添加 BroadcastServiceProvider
提供者
在您的 config/app.php
配置文件中,将 Illuminate\Broadcasting\BroadcastServiceProvider
添加到 providers
数组中。
认证
如果您使用提供的 AuthController
,该控制器使用 AuthenticatesAndRegistersUsers
trait,您需要对新用户的验证和创建方式进行一些更改。
首先,您不再需要将 Guard
和 Registrar
实例传递给基类构造函数。您可以完全从控制器的构造函数中删除这些依赖项。
其次,Laravel 5.0 中使用的 App\Services\Registrar
类不再需要。您可以简单地将 validator
和 create
方法从此类直接复制并粘贴到您的 AuthController
中。无需对这些方法进行其他更改;但是,您应该确保在 AuthController
的顶部导入 Validator
facade 和您的 User
模型。
密码控制器
包含的 PasswordController
不再需要其构造函数中的任何依赖项。您可以删除 5.0 下所需的两个依赖项。
验证
如果您在基础控制器类上重写了 formatValidationErrors
方法,您现在应该类型提示 Illuminate\Contracts\Validation\Validator
合同,而不是具体的 Illuminate\Validation\Validator
实例。
同样,如果您在基础表单请求类上重写了 formatErrors
方法,您现在应该类型提示 Illuminate\Contracts\Validation\Validator
合同,而不是具体的 Illuminate\Validation\Validator
实例。
迁移
如果您有任何重命名列的迁移或从 SQLite 数据库中删除列的迁移,您需要将 doctrine/dbal
依赖项添加到您的 composer.json
文件中,并在终端中运行 composer update
命令以安装库。
Eloquent
create
方法
Eloquent 的 create
方法现在可以在没有任何参数的情况下调用。如果您在自己的模型中重写了 create
方法,请将 $attributes
参数的默认值设置为数组:
public static function create(array $attributes = [])
{
// 您的自定义实现
}
find
方法
如果您在自己的模型中重写了 find
方法并在自定义方法中调用 parent::find()
,您现在应该更改为在 Eloquent 查询构建器上调用 find
方法:
public static function find($id, $columns = ['*'])
{
$model = static::query()->find($id, $columns);
// ...
return $model;
}
lists
方法
lists
方法现在为 Eloquent 查询返回 Collection
实例,而不是普通数组。如果您想将 Collection
转换为普通数组,请使用 all
方法:
User::lists('id')->all();
请注意,查询构建器的 lists
方法仍然返回数组。
日期格式化
以前,可以通过在模型上重写 getDateFormat
方法来修改 Eloquent 日期字段的存储格式。这仍然是可能的;但是,为了方便起见,您可以简单地在模型上指定一个 $dateFormat
属性,而不是重写方法。
在将模型序列化为 array
或 JSON 时,也会应用日期格式。这可能会在从 Laravel 5.0 迁移到 5.1 时更改 JSON 序列化日期字段的格式。要为序列化模型设置特定的日期格式,您可以在模型上重写 serializeDate(DateTime $date)
方法。此方法允许您在不更改存储格式的情况下对序列化的 Eloquent 日期字段进行细粒度控制。
集合类
sort
方法
sort
方法现在返回一个新的集合实例,而不是修改现有集合:
$collection = $collection->sort($callback);
sortBy
方法
sortBy
方法现在返回一个新的集合实例,而不是修改现有集合:
$collection = $collection->sortBy('name');
groupBy
方法
groupBy
方法现在为父 Collection
中的每个项目返回 Collection
实例。如果您想将所有项目转换回普通数组,可以 map
它们:
$collection->groupBy('type')->map(function($item)
{
return $item->all();
});
lists
方法
lists
方法现在为 Eloquent 查询返回 Collection
实例,而不是普通数组。如果您想将 Collection
转换为普通数组,请使用 all
方法:
$collection->lists('id')->all();
命令和处理程序
app/Commands
目录已重命名为 app/Jobs
。但是,您不需要将所有命令移动到新位置,并且可以继续使用 make:command
和 handler:command
Artisan 命令生成类。
同样,app/Handlers
目录已重命名为 app/Listeners
,现在仅包含事件监听器。但是,您不需要移动或重命名现有的命令和事件处理程序,并且可以继续使用 handler:event
命令生成事件处理程序。
通过为 Laravel 5.0 文件夹结构提供向后兼容性,您可以将应用程序升级到 Laravel 5.1,并在方便时逐步将事件和命令升级到新位置。
Blade
createMatcher
、createOpenMatcher
和 createPlainMatcher
方法已从 Blade 编译器中移除。使用新的 directive
方法为 Laravel 5.1 中的 Blade 创建自定义指令。有关更多信息,请查阅扩展 Blade 文档。
测试
将受保护的 $baseUrl
属性添加到 tests/TestCase.php
文件:
protected $baseUrl = 'http://localhost';
翻译文件
已发布的供应商包的默认语言文件目录已移动。将任何供应商包语言文件从 resources/lang/packages/{locale}/{namespace}
移动到 resources/lang/vendor/{namespace}/{locale}
目录。例如,Acme/Anvil
包的 acme/anvil::foo
命名空间的英文语言文件将从 resources/lang/packages/en/acme/anvil/foo.php
移动到 resources/lang/vendor/acme/anvil/en/foo.php
。
亚马逊 Web 服务 SDK
如果您使用 AWS SQS 队列驱动程序或 AWS SES 电子邮件驱动程序,您应该将已安装的 AWS PHP SDK 更新到版本 3.0。
如果您使用 Amazon S3 文件系统驱动程序,您需要通过 Composer 更新相应的 Flysystem 包:
- Amazon S3:
league/flysystem-aws-s3-v3 ~1.0
弃用
以下 Laravel 功能已被弃用,并将在 2015 年 12 月的 Laravel 5.2 版本中完全移除:
- 路由过滤器已被弃用,建议使用中间件。
Illuminate\Contracts\Routing\Middleware
合同已被弃用。您的中间件不需要合同。此外,TerminableMiddleware
合同也已被弃用。无需实现接口,只需在中间件上定义一个terminate
方法。Illuminate\Contracts\Queue\ShouldBeQueued
合同已被弃用,建议使用Illuminate\Contracts\Queue\ShouldQueue
。- Iron.io “推送队列”已被弃用,建议使用典型的 Iron.io 队列和队列监听器。
Illuminate\Foundation\Bus\DispatchesCommands
trait 已被弃用并重命名为Illuminate\Foundation\Bus\DispatchesJobs
。Illuminate\Container\BindingResolutionException
已移至Illuminate\Contracts\Container\BindingResolutionException
。- 服务容器的
bindShared
方法已被弃用,建议使用singleton
方法。 - Eloquent 和查询构建器的
pluck
方法已被弃用并重命名为value
。 - 集合的
fetch
方法已被弃用,建议使用pluck
方法。 array_fetch
辅助函数已被弃用,建议使用array_pluck
方法。
升级到 5.0.16
在您的 bootstrap/autoload.php
文件中,将 $compiledPath
变量更新为:
$compiledPath = __DIR__.'/../vendor/compiled.php';
服务提供者
App\Providers\BusServiceProvider
可以从 app.php
配置文件中的服务提供者列表中移除。
App\Providers\ConfigServiceProvider
可以从 app.php
配置文件中的服务提供者列表中移除。
从 4.2 升级到 5.0
全新安装,然后迁移
推荐的升级方法是创建一个新的 Laravel 5.0
安装,然后将您的 4.2
站点的独特应用程序文件复制到新应用程序中。这将包括控制器、路由、Eloquent 模型、Artisan 命令、资产和其他特定于应用程序的代码文件。
首先,在本地环境中安装一个新的 Laravel 5.0 应用程序到一个新目录中。不要安装任何比 5.0 更新的版本,因为我们需要先完成 5.0 的迁移步骤。我们将在下面更详细地讨论迁移过程的每个部分。
Composer 依赖和包
不要忘记将任何额外的 Composer 依赖项复制到您的 5.0 应用程序中。这包括第三方代码,如 SDK。
某些 Laravel 特定的包可能在初始发布时与 Laravel 5 不兼容。请与您的包维护者联系,以确定适用于 Laravel 5 的包的正确版本。添加应用程序所需的任何额外 Composer 依赖项后,运行 composer update
。
命名空间
默认情况下,Laravel 4 应用程序在应用程序代码中不使用命名空间。因此,例如,所有 Eloquent 模型和控制器都简单地位于“全局”命名空间中。为了更快的迁移,您也可以在 Laravel 5 中将这些类保留在全局命名空间中。
配置
迁移环境变量
将新的 .env.example
文件复制到 .env
,这是旧 .env.php
文件的 5.0
等效文件。在此处设置任何适当的值,例如您的 APP_ENV
和 APP_KEY
(您的加密密钥)、您的数据库凭据以及您的缓存和会话驱动。
此外,将您在旧 .env.php
文件中拥有的任何自定义值复制到 .env
(本地环境的实际值)和 .env.example
(其他团队成员的示例说明值)中。
有关环境配置的更多信息,请查看完整文档。
在部署您的 Laravel 5 应用程序之前,您需要在生产服务器上放置适当的 .env
文件和值。
配置文件
Laravel 5.0 不再使用 app/config/{environmentName}/
目录为给定环境提供特定的配置文件。相反,将任何因环境而异的配置值移动到 .env
中,然后在配置文件中使用 env('key', 'default value')
访问它们。您将在 config/database.php
配置文件中看到此示例。
将 config/
目录中的配置文件设置为表示在所有环境中一致的值,或者设置为使用 env()
加载因环境而异的值。
请记住,如果您向 .env
文件添加更多键,请在 .env.example
文件中添加示例值。这将帮助您的其他团队成员创建自己的 .env
文件。
路由
将旧的 routes.php
文件复制并粘贴到新的 app/Http/routes.php
中。
控制器
接下来,将所有控制器移动到 app/Http/Controllers
目录中。由于我们在本指南中不会迁移到完整的命名空间,请将 app/Http/Controllers
目录添加到 composer.json
文件的 classmap
指令中。接下来,您可以从抽象的 app/Http/Controllers/Controller.php
基类中删除命名空间。验证迁移的控制器是否扩展了此基类。
在 app/Providers/RouteServiceProvider.php
文件中,将 namespace
属性设置为 null
。
路由过滤器
将 app/filters.php
中的过滤器绑定复制到 app/Providers/RouteServiceProvider.php
的 boot()
方法中。在 app/Providers/RouteServiceProvider.php
中添加 use Illuminate\Support\Facades\Route;
以继续使用 Route
Facade。
您不需要移动任何默认的 Laravel 4.0 过滤器,如 auth
和 csrf
;它们都在这里,但作为中间件。编辑任何引用旧默认过滤器的路由或控制器(例如 ['before' => 'auth']
),并将其更改为引用新的中间件(例如 ['middleware' => 'auth']
)。
在 Laravel 5 中未移除过滤器。您仍然可以使用 before
和 after
绑定和使用自己的自定义过滤器。
全局 CSRF
默认情况下,CSRF 保护在所有路由上启用。如果您想禁用此功能,或仅在某些路由上手动启用它,请从 App\Http\Kernel
的 middleware
数组中删除此行:
'App\Http\Middleware\VerifyCsrfToken',
如果您想在其他地方使用它,请将此行添加到 $routeMiddleware
:
'csrf' => 'App\Http\Middleware\VerifyCsrfToken',
现在,您可以使用 ['middleware' => 'csrf']
在单个路由/控制器上添加中间件。有关中间件的更多信息,请查阅完整文档。
Eloquent 模型
可以随意创建一个新的 app/Models
目录来存放您的 Eloquent 模型。同样,将此目录添加到 composer.json
文件的 classmap
指令中。
更新任何使用 SoftDeletingTrait
的模型以使用 Illuminate\Database\Eloquent\SoftDeletes
。
Eloquent 缓存
Eloquent 不再提供 remember
方法来缓存查询。您现在负责使用 Cache::remember
函数手动缓存查询。有关缓存的更多信息,请查阅完整文档。
用户认证模型
要升级您的 User
模型以适应 Laravel 5 的认证系统,请按照以下说明进行操作:
从您的 use
块中删除以下内容:
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
在您的 use
块中添加以下内容:
use Illuminate\Auth\Authenticatable;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
移除 UserInterface 和 RemindableInterface 接口。
将类标记为实现以下接口:
implements AuthenticatableContract, CanResetPasswordContract
在类声明中包含以下 traits:
use Authenticatable, CanResetPassword;
如果您使用了它们,请从您的 use 块和类声明中移除 Illuminate\Auth\Reminders\RemindableTrait
和 Illuminate\Auth\UserTrait
。
Cashier 用户更改
Laravel Cashier 使用的 trait 和接口名称已更改。请使用 Laravel\Cashier\Billable
trait,而不是 BillableTrait
。并且,改为实现 Laravel\Cashier\Contracts\Billable
接口,而不是 Laravel\Cashier\BillableInterface
。不需要其他方法更改。
Artisan 命令
将所有命令类从旧的 app/commands
目录移动到新的 app/Console/Commands
目录。接下来,将 app/Console/Commands
目录添加到 composer.json
文件的 classmap
指令中。
然后,将 Artisan 命令列表从 start/artisan.php
复制到 app/Console/Kernel.php
文件的 commands
数组中。
数据库迁移和填充
删除 Laravel 5.0 附带的两个迁移,因为您应该已经在数据库中拥有用户表。
将所有迁移类从旧的 app/database/migrations
目录移动到新的 database/migrations
。所有填充应从 app/database/seeds
移动到 database/seeds
。
全局 IoC 绑定
如果您在 start/global.php
中有任何服务容器绑定,请将它们全部移动到 app/Providers/AppServiceProvider.php
文件的 register
方法中。您可能需要导入 App
facade。
可选地,您可以按类别将这些绑定分解为单独的服务提供者。
视图
将视图从 app/views
移动到新的 resources/views
目录。
Blade 标签更改
为了默认情况下更好的安全性,Laravel 5.0 会转义来自 {{ }}
和 {{{ }}}
Blade 指令的所有输出。引入了一个新的 {!! !!}
指令来显示原始、未转义的输出。在升级应用程序时,最安全的选项是仅在您确定显示原始输出是安全的情况下使用新的 {!! !!}
指令。
但是,如果您必须使用旧的 Blade 语法,请在 AppServiceProvider@register
的底部添加以下行:
\Blade::setRawTags('{{', '}}');
\Blade::setContentTags('{{{', '}}}');
\Blade::setEscapedContentTags('{{{', '}}}');
这不应轻易进行,并可能使您的应用程序更容易受到 XSS 攻击。此外,使用 {{--
的注释将不再有效。
翻译文件
将语言文件从 app/lang
移动到新的 resources/lang
目录。
公共目录
将应用程序的公共资产从 4.2
应用程序的 public
目录复制到新应用程序的 public
目录。确保保留 5.0
版本的 index.php
。
测试
将测试从 app/tests
移动到新的 tests
目录。
杂项文件
复制项目中的任何其他文件。例如,.scrutinizer.yml
、bower.json
和其他类似的工具配置文件。
您可以将 Sass、Less 或 CoffeeScript 移动到任何您希望的位置。resources/assets
目录可能是一个不错的默认位置。
表单和 HTML 助手
如果您使用表单或 HTML 助手,您将看到一个错误,指出 class 'Form' not found
或 class 'Html' not found
。表单和 HTML 助手在 Laravel 5.0 中已被弃用;然而,有社区驱动的替代品,如由 Laravel Collective 维护的替代品。
例如,您可以在 composer.json
文件的 require
部分中添加 "laravelcollective/html": "~5.0"
。
您还需要添加表单和 HTML facade 以及服务提供者。编辑 config/app.php
并将此行添加到 'providers' 数组中:
'Collective\Html\HtmlServiceProvider',
接下来,将这些行添加到 'aliases' 数组中:
'Form' => 'Collective\Html\FormFacade',
'Html' => 'Collective\Html\HtmlFacade',
CacheManager
如果您的应用程序代码注入 Illuminate\Cache\CacheManager
以获取非 Facade 版本的 Laravel 缓存,请注入 Illuminate\Contracts\Cache\Repository
。
分页
将对 $paginator->links()
的任何调用替换为 $paginator->render()
。
将对 $paginator->getFrom()
和 $paginator->getTo()
的任何调用替换为 $paginator->firstItem()
和 $paginator->lastItem()
。
从对 $paginator->getPerPage()
、$paginator->getCurrentPage()
、$paginator->getLastPage()
和 $paginator->getTotal()
的调用中删除“get”前缀(例如 $paginator->perPage()
)。
Beanstalk 排队
Laravel 5.0 现在需要 "pda/pheanstalk": "~3.0"
而不是 "pda/pheanstalk": "~2.1"
。
远程
远程组件已被弃用。
工作台
工作台组件已被弃用。
从 4.1 升级到 4.2
PHP 5.4+
Laravel 4.2 需要 PHP 5.4.0 或更高版本。
加密默认值
在您的 app/config/app.php
配置文件中添加一个新的 cipher
选项。此选项的值应为 MCRYPT_RIJNDAEL_256
。
'cipher' => MCRYPT_RIJNDAEL_256
此设置可用于控制 Laravel 加密设施使用的默认密码。
在 Laravel 4.2 中,默认密码是 MCRYPT_RIJNDAEL_128
(AES),被认为是最安全的密码。将密码更改回 MCRYPT_RIJNDAEL_256
是解密在 Laravel <= 4.1 中加密的 cookie/值所必需的。
软删除模型现在使用 Traits
如果您使用软删除模型,softDeletes
属性已被移除。您现在必须使用 SoftDeletingTrait
,如下所示:
use Illuminate\Database\Eloquent\SoftDeletingTrait;
class User extends Eloquent
{
use SoftDeletingTrait;
}
您还必须手动将 deleted_at
列添加到您的 dates
属性中:
class User extends Eloquent
{
use SoftDeletingTrait;
protected $dates = ['deleted_at'];
}
所有软删除操作的 API 保持不变。
SoftDeletingTrait
不能应用于基模型。它必须用于实际的模型类。
视图/分页环境重命名
如果您直接引用 Illuminate\View\Environment
类或 Illuminate\Pagination\Environment
类,请更新您的代码以引用 Illuminate\View\Factory
和 Illuminate\Pagination\Factory
。这两个类已重命名以更好地反映其功能。
分页呈现器上的附加参数
如果您扩展了 Illuminate\Pagination\Presenter
类,抽象方法 getPageLinkWrapper
的签名已更改以添加 rel
参数:
abstract public function getPageLinkWrapper($url, $page, $rel = null);
Iron.Io 队列加密
如果您使用 Iron.io 队列驱动程序,您需要在队列配置文件中添加一个新的 encrypt
选项:
'encrypt' => true
从 <= 4.1.x 升级到 4.1.29
Laravel 4.1.29 改进了所有数据库驱动程序的列引用。这可以保护您的应用程序免受在模型上未使用 fillable
属性时的一些批量分配漏洞的影响。如果您在模型上使用 fillable
属性来防止批量分配,您的应用程序不会受到影响。然而,如果您使用 guarded
并将用户控制的数组传递给“更新”或“保存”类型的函数,您应该立即升级到 4.1.29
,因为您的应用程序可能面临批量分配的风险。
要升级到 Laravel 4.1.29,只需 composer update
。此版本中未引入重大更改。
从 <= 4.1.25 升级到 4.1.26
Laravel 4.1.26 引入了“记住我”cookie 的安全改进。在此更新之前,如果记住 cookie 被恶意用户劫持,即使帐户的真正所有者重置了密码、注销等,cookie 仍将保持有效。
此更改需要在 users
(或等效)数据库表中添加一个新的 remember_token
列。更改后,每次用户登录到您的应用程序时,都会为其分配一个新的令牌。用户注销应用程序时,令牌也会刷新。此更改的影响是:如果“记住我”cookie 被劫持,只需注销应用程序即可使 cookie 失效。
升级路径
首先,在 users
表中添加一个新的、可为空的 remember_token
,类型为 VARCHAR(100)、TEXT 或等效类型。
接下来,如果您使用 Eloquent 认证驱动程序,请使用以下三个方法更新您的 User
类:
public function getRememberToken()
{
return $this->remember_token;
}
public function setRememberToken($value)
{
$this->remember_token = $value;
}
public function getRememberTokenName()
{
return 'remember_token';
}
此更改将使所有现有的“记住我”会话失效,因此所有用户将被迫重新认证您的应用程序。
包维护者
Illuminate\Auth\UserProviderInterface
接口中添加了两个新方法。默认驱动程序中可以找到示例实现:
public function retrieveByToken($identifier, $token);
public function updateRememberToken(UserInterface $user, $token);
Illuminate\Auth\UserInterface
还接收了“升级路径”中描述的三个新方法。
从 4.0 升级到 4.1
升级您的 Composer 依赖
要将应用程序升级到 Laravel 4.1,请在 composer.json
文件中将 laravel/framework
版本更改为 4.1.*
。
替换文件
用存储库中的这个新副本替换您的 public/index.php
文件。
用存储库中的这个新副本替换您的 artisan
文件。
添加配置文件和选项
更新 app/config/app.php
配置文件中的 aliases
和 providers
数组。这些数组的更新值可以在此文件中找到。请务必将您的自定义和包服务提供者/别名添加回数组中。
从存储库中添加新的 app/config/remote.php
文件。
在您的 app/config/session.php
文件中添加新的 expire_on_close
配置选项。默认值应为 false
。
在您的 app/config/queue.php
文件中添加新的 failed
配置部分。以下是该部分的默认值:
'failed' => [
'database' => 'mysql', 'table' => 'failed_jobs',
],
(可选) 将 app/config/view.php
文件中的 pagination
配置选项更新为 pagination::slider-3
。
控制器更新
如果 app/controllers/BaseController.php
顶部有一个 use
语句,请将 use Illuminate\Routing\Controllers\Controller;
更改为 use Illuminate\Routing\Controller;
。
密码提醒更新
密码提醒已被彻底改进,以提供更大的灵活性。您可以通过运行 php artisan auth:reminders-controller
Artisan 命令来查看新的存根控制器。您还可以浏览更新的文档并相应地更新您的应用程序。
将您的 app/lang/en/reminders.php
语言文件更新为与此更新文件匹配。
环境检测更新
出于安全原因,URL 域名不再用于检测您的应用程序环境。这些值很容易被伪造,允许攻击者修改请求的环境。您应该将环境检测转换为使用机器主机名(Mac、Linux 和 Windows 上的 hostname
命令)。
更简单的日志文件
Laravel 现在生成一个单一的日志文件:app/storage/logs/laravel.log
。但是,您仍然可以在 app/start/global.php
文件中配置此行为。
移除重定向尾随斜杠
在您的 bootstrap/start.php
文件中,移除对 $app->redirectIfTrailingSlash()
的调用。此方法不再需要,因为此功能现在由框架附带的 .htaccess
文件处理。
接下来,用这个新文件替换您的 Apache .htaccess
文件,该文件处理尾随斜杠。
当前路由访问
当前路由现在通过 Route::current()
访问,而不是 Route::getCurrentRoute()
。
Composer 更新
完成上述更改后,您可以运行 composer update
函数来更新核心应用程序文件!如果您收到类加载错误,请尝试在启用 --no-scripts
选项的情况下运行 update
命令,如下所示:composer update --no-scripts
。
通配符事件监听器
通配符事件监听器不再将事件附加到处理程序函数参数中。如果您需要查找触发的事件,您应该使用 Event::firing()
。