在 bootstrap/autoload.php
文件中, 把 $compiledPath
变量更新为:
$compiledPath = DIR.'/../vendor/compiled.php';
推荐的升级方式是建立一个全新的 Laravel 5.0
项目,然后复制您在 4.2
的文件到此新的应用程序,这将包含控制器、路由、Eloquent 模型、Artisan 命令(Asset)、资源和关于此应用程序的其他特定文件。
最开始,安装新的 Laravel 5 应用程序到新的本地目录下,我们将详细探讨迁移各部分的过程。
别忘了将任何附加于 Composer 的依赖组件加入 5.0 应用程序内,包含第三方代码(例如 SDKs)。
部分组件也许不兼容刚发布的 Laravel 5 版本,请向组件管理者确认该组件支持 Laravel 5 的版本,当您在 Composer 内加入任何组件,请执行 composer update
。
默认情况下,Laravel 4 没有在应用程序的源码中使用命名空间,所以,举例来说,所有的 Eloquent 模型和控制器仅存在“全局”的命名空间下,为了更快速的迁移,Laravel 5 也允许您可以将这些类别一样保留在“全局”的命名空间。
复制新的 .env.example
文件到 .env
,在 5.0
这相当于原本的 .env.php
。像是您的 APP_ENV
和 APP_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.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 保护。若想关闭他们,或是在指定在特定路由开启,请移除 App\Http\Kernel
中 middleware
数组内的这一行:
如果您想在其他地方使用它,加入这一行到 $routeMiddleware
:
'csrf' => 'App\Http\Middleware\VerifyCsrfToken',
现在,您可于路由内使用 ['middleware' => 'csrf']
即可个别添加中间件到路由/控制器。了解更多关于中间件,请见完整文档。
你可以建立新的 app/Models
目录来放置所有 Eloquent 模型。并且同样的,在 composer.json
将此目录添加到 classmap
内。
在模型内加入 SoftDeletingTrait
来使用Illuminate\Database\Eloquent\SoftDeletes
.
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\RemindableTrait
和 Illuminate\Auth\UserTrait
Laravel Cashier 的 trait 和接口名称已作修改。trait 请改用 Laravel\Cashier\Billable
取代 BillableTrait
。接口请改用 Laravel\Cashier\Contracts\Billable
取代 Larave\Cashier\BillableInterface
。不需要修改任何方法。
将所有的命令从旧的 app/commands
目录移到新的app/Console/Commands
目录。接下来,把 app/Console/Commands
目录添加到 composer.json
的 classmap
中。
然后,复制 Artisan 命令列表从 start/artisan.php
到 app/Console/Kernel.php
文件的 command
数组内。
如果在您的数据库内已经有 users 表,请移除 Laravel 5 内置的两个迁移文件。
将所有的迁移文件从旧的 app/database/migrations
目录复制到新的 database/migrations
。所有的数据填充文件也要从 app/database/seeds
复制到 database/seeds
。
若您在 start/global.php
有绑定任何 IoC,请将它们复制到 app/Providers/AppServiceProvider.php
内的 register
方法,您可能需要引入 App
facade。
你可以选择将这些绑定,依照类型拆分到不同的服务提供者中。
将所有的视图从旧的 app/views
复制到新的resources/views
目录内。
从安全的角度考虑,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 辅助函数,您将会看到以下错误 class 'Form' not found
或 class 'Html' not found
。Form 类以及 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()
).
Laravel 5.0 使用 "pda/pheanstalk": "~3.0"
取代原本的 "pda/pheanstalk": "~2.1"
。
Remote 组件已不再使用。
工作区组件已不再使用。
Laravel 4.2 需要 PHP 5.4.0 以上。
增加一个新的 cipher
选项在你的 app/config/app.php
设置文件中。其选项值应为 MCRYPT_RIJNDAEL_256
。
'cipher' => MCRYPT_RIJNDAEL_256
该设置可用于设置所使用的 Laravel 加密工具的默认加密方法。
附注: 在 Laravel 4.2,默认加密方法为
MCRYPT_RIJNDAEL_128
(AES),被认为是最安全的加密。必须将加密改回MCRYPT_RIJNDAEL_256
来解密在 Laravel <= 4.1 下加密的 cookies/values
如果你在模型下有使用软删除,现在 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 queue 驱动,你将需要增加一个新的 encrypt
选项到你的 queue 设置文件中:
'encrypt' => true
Laravel 4.1.29 对于所有的数据库驱动加强了 column quoting 的部分。当你的模型中没有使用 fillable
属性,他保护你的应用程序不会受到 mass assignment 漏洞影响。如果你在模型中使用 fillable
属性来防范 mass assignment,你的应用程序将不会有漏洞。如果你使用 guarded
且在“更新”或“保存”类型的函式中,传递了末端用户控制的数组,那你应该立即升级到
4.1.29
以避免 mass assignment 的风险。
升级到 Laravel 4.1.29,只要 composer update
即可。在这个发行版本中没有重大的更新。
Laravel 4.1.26 采用了针对“记得我”cookies 的安全性更新。在此更新之前,如果一个记得我的 cookies 被恶意用户劫持,该 cookie 将还可以生存很长一段时间,即使真实用户重设密码或者注销亦同。
此更动需要在你的 users
(或者类似的) 的数据表中增加一个额外的 remember_token
字段。在更新之后,当用户每次登录你的应用程序将会有一个全新的 token 将会被指派。这个 token 也会在用户注销应用程序后被更新。这个更新的影响为:如果一个“记得我”的 cookie 被劫持,只要用户注销应用程序将会废除该 cookie。
首先,增加一个新的字段,可空值、属性为 VARCHAR(100)、TEXT 或同类型的字段 remember_token
到你的 users
数据表中。
然后,如果你使用 Eloquent 认证驱动,依照下面更新你的 User
类别的三个方法:
public function getRememberToken()
{
return $this->remember_token;
}
public function setRememberToken($value)
{
$this->remember_token = $value;
}
public function getRememberTokenName()
{
return 'remember_token';
}
附注: 所有现存的“记得我”sessions 在此更新后将会失效,所以应用程序的所有用户将会被迫重新登录。
两个新的方法被加入到 Illuminate\Auth\UserProviderInterface
接口。范例实现方式可以在默认驱动中找到:
public function retrieveByToken($identifier, $token);
public function updateRememberToken(UserInterface $user, $token);
Illuminate\Auth\UserInterface
也加了三个新方法描述在“升级路径”。
升级你的应用程序至 Laravel 4.1,将 composer.json
里的 laravel/framework
版本更改至 4.1.*
。
将你的 public/index.php
置换成 这个 repository 的干净版本。
同样的,将你的 artisan
置换成 这个 repository 的干净版本。
更新你在设置文件 app/config/app.php
里的 aliases
和 providers
数组。而更新的选项值可以在 这个文件 中找到。请确定将你后来加入自定和组件所需的 providers / aliases 加回数组中。
从 这个 repository 增加 app/config/remote.php
文件。
在你的 app/config/session.php
增加新的选项 expire_on_close
。而默认值为 false
。
在你的 app/config/queue.php
文件里添加 failed
设置区块。以下为区块的默认值:
'failed' => array(
'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;
。
密码提醒功能已经大幅修正拥有更大的弹性。你可以执行 Artisan 指令 php artisan auth:reminders-controller
来检查新的存根控制器。你也可以浏览 更新文件 然后相应的更新你的应用程序。
更新你的 app/lang/en/reminders.php
语系文件来符合 这个新版文件。
为了安全因素,不再使用网域网址来侦测辨别应用程序的环境。因为这些直很容易被伪造欺骗,继而让攻击者透过请求来达到变更环境。所以你必须改为使用机器的 hostname(在 Mac & Ubuntu 下执行 hostname
出来的值)
(译按:的确原有方式有安全性考量,但对于现行 VirtualHost 大量使用下,反而这样改会造成不便)
Laravel 目前只会产生单一的日志文件:app/storage/logs/laravel.log
。然而,你还是可以透过设置你的 app/start/global.php
文件来更改他的行为。
在你的 bootstrap/start.php
文件中,移除调用 $app->redirectIfTrailingSlash()
。这个方法已不再需要了,因为之后将会改以框架内的 .htaccess
来处理。
然后,用 新版 替换掉你 Apache 中的 .htaccess
文件,来处理结尾的斜线问题。
取得目前路由的方法由 Route::getCurrentRoute()
改为 Route::current()
。
一旦你完成以上的更新,你可以执行 composer update
来更新应用程序的核心文件。如果有 class load 错误,请在 update
之后加上 --no-scripts
,如:composer update --no-scripts
。
万用字符事件监听者不再添加事件为参数到你的处理函数。如果你需要寻找你触发的事件你应该用 Event::firing()
.