codecamp

从 4.2 升级到 5.0

全新安装,然后迁移

推荐的升级方式是建立一个全新的 Laravel 5.0 项目,然后复制您在 4.2 的文件到此新的应用程序,这将包含控制器、路由、Eloquent 模型、Artisan 命令(Asset)、资源和关于此应用程序的其他特定文件。

最开始,安装新的 Laravel 5 应用程序到新的本地目录下,我们将详细探讨迁移各部分的过程。

Composer 依赖与组件

别忘了将任何附加于 Composer 的依赖组件加入 5.0 应用程序内,包含第三方代码(例如 SDKs)。

部分组件也许不兼容刚发布的 Laravel 5 版本,请向组件管理者确认该组件支持 Laravel 5 的版本,当您在 Composer 内加入任何组件,请执行 composer update

命名空间

默认情况下,Laravel 4 没有在应用程序的源码中使用命名空间,所以,举例来说,所有的 Eloquent 模型和控制器仅存在「全局」的命名空间下,为了更快速的迁移,Laravel 5 也允许您可以将这些类别一样保留在「全局」的命名空间。

设置文件

迁移环境变量

复制新的 .env.example 文件到 .env,在 5.0 这相当于原本的 .env.php。像是您的 APP_ENVAPP_KEY (您的加密钥匙)、数据库认证和您的缓存驱动与 session 驱动。

此外,复制原先自定义的 .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 文件内增加 key 值,同时也要对应增加到 .env.example 文件中,这将可以帮助团队成员修改他们的 .env 文件。

路由

复制原本的 routes.php 文件到 app/Http/routes.php

控制器

下一步,请将所有的控制器复制到 app/Http/Controllers 目录,既然在本指南中我们不打算迁移到完整的命名空间,请将 app/Http/Controllers 添加到 composer.jsonclassmap,接下来,您可以从 app/Http/Controllers/Controller.php 基础抽象类中移除命名空间,并确认迁移过来的控制器要继承这个基础类。

app/Providers/RouteServiceProvider.php 文件中,将 namespace 属性设置为 null

路由过滤器

将过滤器绑定从原来的 app/filters.php 复制到 app/Providers/RouteServiceProvider.phpboot() 方法中,并在 app/Providers/RouteServiceProvider.php 加入 use Illuminate\Support\Facades\Route; 来继续使用 Route Facade

您不需要移动任何 Laravel 4.0 默认的过滤器,像是 authcsrf 。他们已经内置,只是换作以中间件形式出现。那些在路由或控制器内有参照到旧有的过滤器 (例如 ['before' => 'auth']) 请修改参照到新的中间件 (例如 ['middleware' => 'auth'].)

Laravel 5 并没有将过滤器移除,您一样可以使用 beforeafter 绑定和使用您自定义的过滤器。

全局 CSRF

默认情况下,所有路由都会使用CSRF 保护。若想关闭他们,或是在指定在特定路由开启,请移除 App\Http\Kernelmiddleware 数组内的这一行:

'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 方法快速缓存。了解更多关于缓存,请见完整文档。

会员认证模型

要使用 Laravel 5 的会员认证系统,请遵循以下指引来升级您的 User 模型:

从 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;

如果你引入了上面的 traits,从 use 区块和类声明中移除 Illuminate\Auth\Reminders\RemindableTraitIlluminate\Auth\UserTrait

Cashier 的用户需要的修改

Laravel Cashier 的 trait 和接口名称已作修改。trait 请改用 Laravel\Cashier\Billable 取代 BillableTrait。接口请改用 Laravel\Cashier\Contracts\Billable 取代 Larave\Cashier\BillableInterface 。不需要修改任何方法。

Artisan 命令

将所有的命令从旧的 app/commands 目录移到新的 app/Console/Commands 目录。接下来,把 app/Console/Commands 目录添加到 composer.jsonclassmap 中。

然后,复制 Artisan 命令列表从 start/artisan.phpapp/Console/Kernel.php 文件的 command 数组内。

数据库迁移和数据填充

如果在您的数据库内已经有 users 表,请移除 Laravel 5 内置的两个迁移文件。

将所有的迁移文件从旧的 app/database/migrations 目录复制到新的 database/migrations 。所有的数据填充文件也要从 app/database/seeds 复制到 database/seeds

全局 IoC 绑定

若您在 start/global.php 有绑定任何 IoC,请将它们复制到 app/Providers/AppServiceProvider.php 内的 register 方法,您可能需要引入 App facade。

你可以选择将这些绑定,依照类型拆分到不同的服务提供者中。

视图

将所有的视图从旧的 app/views 复制到新的 resources/views 目录内。

Blade 标签修改

从安全的角度考虑,Laravel 5.0 会过滤所有输出,不论您使用 {{ }}{{{ }}} 标签。您可以使用 {!! !!} 新的标签来取消输出过滤。请务必 确定 输出内容是安全地才使用 {!! !!} 标签。

不过,如果您 仍然必须 使用旧的 Blade 语法,请在 AppServiceProvider@register 开头加入以下内容:

\Blade::setRawTags('{{', '}}');
\Blade::setContentTags('{{{', '}}}');
\Blade::setEscapedContentTags('{{{', '}}}');

但是轻易不要这样做,这可能使您的应用进程更加容易受到 XSS 攻击,并且用 {{-- 来注释代码将不再起作用。

多语言配置文件

将所有的多语言配置文件从旧的 app/lang 目录复制到新的resources/lang 目录。

公开目录

将 4.2 版公共目录内的资源复制到新应用程序内的public 目录。并确认保留 5.0 版的 index.php 文件。

测试

将所有的测试文件从旧的 app/tests 复制到 tests 目录。

各式各样的文件

复制项目内其他各式各样的文件,例如:.scrutinizer.yml, bower.json 以及其他类似工具的设置文件。

您可以将 Sass,Less 或 CoffeeScript 移动到任何您想放置的地方。 resources/assets 目录是一个不错的默认位置。

表单和 HTML 辅助函数

如果您使用表单或 HTML 辅助函数,您将会看到以下错误 class 'Form' not foundclass 'Html' not foundForm 类以及 HTML 辅助函数在 Laravel 5.0 中已经废弃了;不过,这里有一些替代方法,比如基于社区驱动的,由 Laravel Collective 维护。

比如,你可以在 composer.json 文件中的 require 区块增加 "laravelcollective/html": "~5.0"。

您也需要添加表单和 HTML 的 facades 以及服务提供者。 编辑 config/app.php 文件,添加此行到 'providers' 数组内:

'Collective\Html\HtmlServiceProvider',

接着,添加以下到 'aliases' 数组内:

'Form' => 'Collective\Html\FormFacade',
'Html' => 'Collective\Html\HtmlFacade',

缓存管理员

如果您的程序注入 Illuminate\Cache\CacheManager 来取得非 Facade 版本的 Laravel 缓存,请改用 Illuminate\Contracts\Cache\Repository 注入。

分页

请将所有的 $paginator->links()$paginator->render() 取代。

Replace any calls to $paginator->getFrom() and $paginator->getTo() with $paginator->firstItem() and $paginator->lastItem() respectively.

Remove the "get" prefix from calls to $paginator->getPerPage(), $paginator->getCurrentPage(), $paginator->getLastPage() and $paginator->getTotal() (e.g. $paginator->perPage()).

Beanstalk 队列

Laravel 5.0 使用 "pda/pheanstalk": "~3.0" 取代原本的 "pda/pheanstalk": "~2.1"

Remote

Remote 组件已不再使用。

工作区

工作区组件已不再使用。

升级到 5.0.16
从 4.1 升级到 4.2
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

环境配置

系统服务

哈希

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }