升級向?qū)?/h1>

2018-12-17 10:38 更新

升級到 5.0.16

bootstrap/autoload.php 文件中, 把 $compiledPath 變量更新為:

$compiledPath = DIR.'/../vendor/compiled.php';

           

從 4.2 升級到 5.0

全新安裝,然后遷移

推薦的升級方式是建立一個(gè)全新的 Laravel 5.0 項(xiàng)目,然后復(fù)制您在 4.2 的文件到此新的應(yīng)用程序,這將包含控制器、路由、Eloquent 模型、Artisan 命令(Asset)、資源和關(guān)于此應(yīng)用程序的其他特定文件。

最開始,安裝新的 Laravel 5 應(yīng)用程序到新的本地目錄下,我們將詳細(xì)探討遷移各部分的過程。

Composer 依賴與組件

別忘了將任何附加于 Composer 的依賴組件加入 5.0 應(yīng)用程序內(nèi),包含第三方代碼(例如 SDKs)。

部分組件也許不兼容剛發(fā)布的 Laravel 5 版本,請向組件管理者確認(rèn)該組件支持 Laravel 5 的版本,當(dāng)您在 Composer 內(nèi)加入任何組件,請執(zhí)行 composer update。

命名空間

默認(rèn)情況下,Laravel 4 沒有在應(yīng)用程序的源碼中使用命名空間,所以,舉例來說,所有的 Eloquent 模型和控制器僅存在「全局」的命名空間下,為了更快速的遷移,Laravel 5 也允許您可以將這些類別一樣保留在「全局」的命名空間。

設(shè)置文件

遷移環(huán)境變量

復(fù)制新的 .env.example 文件到 .env,在 5.0 這相當(dāng)于原本的 .env.php。像是您的 APP_ENVAPP_KEY (您的加密鑰匙)、數(shù)據(jù)庫認(rèn)證和您的緩存驅(qū)動與 session 驅(qū)動。

此外,復(fù)制原先自定義的 .env.php 文件,并修改為 .env (本機(jī)環(huán)境的真實(shí)設(shè)置值) 和 .env.example (給其他團(tuán)隊(duì)成員的示例)。

更多關(guān)于環(huán)境設(shè)置值,請見完整文檔。

注意: 在部署 Laravel 5 應(yīng)用程序之前,您需要在正式主機(jī)上放置 .env 文件并設(shè)置適當(dāng)?shù)闹怠?/p>

設(shè)置文件

Laravel 5.0 不再使用 app/config/{environmentName}/ 目錄結(jié)構(gòu)來提供對應(yīng)該環(huán)境的設(shè)置文件,取而代之的是,將環(huán)境對應(yīng)的設(shè)置值復(fù)制到 .env,然后在設(shè)置文件使用 env('key', 'default value') 來訪問,您可以在 config/database.php 文件內(nèi)看到相關(guān)范例。

將設(shè)置文件放在 config/ 目錄下,來表示所有環(huán)境共用的設(shè)置文件,或是在文件內(nèi)使用 env() 來取得對應(yīng)該環(huán)境的設(shè)置值。

請記住,若您在 .env 文件內(nèi)增加 key 值,同時(shí)也要對應(yīng)增加到 .env.example 文件中,這將可以幫助團(tuán)隊(duì)成員修改他們的 .env 文件。

路由

復(fù)制原本的 routes.php 文件到 app/Http/routes.php。

控制器

下一步,請將所有的控制器復(fù)制到 app/Http/Controllers 目錄,既然在本指南中我們不打算遷移到完整的命名空間,請將 app/Http/Controllers 添加到 composer.jsonclassmap,接下來,您可以從 app/Http/Controllers/Controller.php 基礎(chǔ)抽象類中移除命名空間,并確認(rèn)遷移過來的控制器要繼承這個(gè)基礎(chǔ)類。

app/Providers/RouteServiceProvider.php 文件中,將 namespace 屬性設(shè)置為 null。

路由過濾器

將過濾器綁定從原來的 app/filters.php 復(fù)制到 app/Providers/RouteServiceProvider.phpboot() 方法中,并在 app/Providers/RouteServiceProvider.php 加入 use Illuminate\Support\Facades\Route; 來繼續(xù)使用 Route                Facade。

您不需要移動任何 Laravel 4.0 默認(rèn)的過濾器,像是 authcsrf 。他們已經(jīng)內(nèi)置,只是換作以中間件形式出現(xiàn)。那些在路由或控制器內(nèi)有參照到舊有的過濾器 (例如 ['before' => 'auth']) 請修改參照到新的中間件 (例如 ['middleware' => 'auth'].)

Laravel 5 并沒有將過濾器移除,您一樣可以使用 beforeafter 綁定和使用您自定義的過濾器。

全局 CSRF

默認(rèn)情況下,所有路由都會使用CSRF 保護(hù)。若想關(guān)閉他們,或是在指定在特定路由開啟,請移除 App\Http\Kernelmiddleware 數(shù)組內(nèi)的這一行:

如果您想在其他地方使用它,加入這一行到 $routeMiddleware:

'csrf' => 'App\Http\Middleware\VerifyCsrfToken',

           

現(xiàn)在,您可于路由內(nèi)使用 ['middleware' => 'csrf'] 即可個(gè)別添加中間件到路由/控制器。了解更多關(guān)于中間件,請見完整文檔。

你可以建立新的 app/Models 目錄來放置所有 Eloquent 模型。并且同樣的,在 composer.json 將此目錄添加到 classmap 內(nèi)。

在模型內(nèi)加入 SoftDeletingTrait 來使用Illuminate\Database\Eloquent\SoftDeletes.

Eloquent 緩存

Eloquent 不再提供 remember 方法來緩存查詢?,F(xiàn)在你需要手動使用 Cache::remember 方法快速緩存。了解更多關(guān)于緩存,請見完整文檔。

會員認(rèn)證模型

要使用 Laravel 5 的會員認(rèn)證系統(tǒng),請遵循以下指引來升級您的 User 模型:

use 區(qū)塊刪除以下內(nèi)容:            

use Illuminate\Auth\UserInterface;use Illuminate\Auth\Reminders\RemindableInterface;

           

添加以下內(nèi)容到 use 區(qū)塊:            

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 接口。            

實(shí)現(xiàn)以下接口:            

implements AuthenticatableContract, CanResetPasswordContract

           

在類中聲明引入以下 traits:            

use Authenticatable, CanResetPassword;

           

如果你引入了上面的 traits,從 use 區(qū)塊和類聲明中移除 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 中。

然后,復(fù)制 Artisan 命令列表從 start/artisan.phpapp/Console/Kernel.php 文件的 command 數(shù)組內(nèi)。

數(shù)據(jù)庫遷移和數(shù)據(jù)填充

如果在您的數(shù)據(jù)庫內(nèi)已經(jīng)有 users 表,請移除 Laravel 5 內(nèi)置的兩個(gè)遷移文件。

將所有的遷移文件從舊的 app/database/migrations 目錄復(fù)制到新的 database/migrations 。所有的數(shù)據(jù)填充文件也要從 app/database/seeds 復(fù)制到 database/seeds

全局 IoC 綁定

若您在 start/global.php 有綁定任何 IoC,請將它們復(fù)制到 app/Providers/AppServiceProvider.php 內(nèi)的 register 方法,您可能需要引入 App facade。

你可以選擇將這些綁定,依照類型拆分到不同的服務(wù)提供者中。

視圖

將所有的視圖從舊的 app/views 復(fù)制到新的resources/views 目錄內(nèi)。

Blade 標(biāo)簽修改

從安全的角度考慮,Laravel 5.0 會過濾所有輸出,不論您使用 {{ }}{{{ }}} 標(biāo)簽。您可以使用 {!! !!} 新的標(biāo)簽來取消輸出過濾。請務(wù)必 確定 輸出內(nèi)容是安全地才使用 {!! !!} 標(biāo)簽。

不過,如果您 仍然必須 使用舊的 Blade 語法,請?jiān)?AppServiceProvider@register 開頭加入以下內(nèi)容:

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

           

但是輕易不要這樣做,這可能使您的應(yīng)用進(jìn)程更加容易受到 XSS 攻擊,并且用 {{-- 來注釋代碼將不再起作用。

多語言配置文件

將所有的多語言配置文件從舊的 app/lang 目錄復(fù)制到新的resources/lang 目錄。

公開目錄

4.2 版公共目錄內(nèi)的資源復(fù)制到新應(yīng)用程序內(nèi)的public 目錄。并確認(rèn)保留 5.0 版的 index.php 文件。

測試

將所有的測試文件從舊的 app/tests 復(fù)制到 tests 目錄。

各式各樣的文件

復(fù)制項(xiàng)目內(nèi)其他各式各樣的文件,例如:.scrutinizer.yml, bower.json 以及其他類似工具的設(shè)置文件。

您可以將 Sass,Less 或 CoffeeScript 移動到任何您想放置的地方。 resources/assets 目錄是一個(gè)不錯(cuò)的默認(rèn)位置。

表單和 HTML 輔助函數(shù)

如果您使用表單或 HTML 輔助函數(shù),您將會看到以下錯(cuò)誤 class 'Form' not foundclass 'Html' not found 。Form 類以及 HTML 輔助函數(shù)在 Laravel 5.0 中已經(jīng)廢棄了;不過,這里有一些替代方法,比如基于社區(qū)驅(qū)動的,由 Laravel Collective                維護(hù)。

比如,你可以在 composer.json 文件中的 require 區(qū)塊增加 "laravelcollective/html": "~5.0"。

您也需要添加表單和 HTML 的 facades 以及服務(wù)提供者。 編輯 config/app.php 文件,添加此行到 'providers' 數(shù)組內(nèi):

'Collective\Html\HtmlServiceProvider',

           

接著,添加以下到 'aliases' 數(shù)組內(nèi):

'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 隊(duì)列

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

Remote

Remote 組件已不再使用。

工作區(qū)

工作區(qū)組件已不再使用。

           

從 4.1 升級到 4.2

PHP 5.4+

Laravel 4.2 需要 PHP 5.4.0 以上。

默認(rèn)加密

增加一個(gè)新的 cipher 選項(xiàng)在你的 app/config/app.php 設(shè)置文件中。其選項(xiàng)值應(yīng)為 MCRYPT_RIJNDAEL_256。

'cipher' => MCRYPT_RIJNDAEL_256

           

該設(shè)置可用于設(shè)置所使用的 Laravel 加密工具的默認(rèn)加密方法。

附注: 在 Laravel 4.2,默認(rèn)加密方法為MCRYPT_RIJNDAEL_128 (AES),被認(rèn)為是最安全的加密。必須將加密改回MCRYPT_RIJNDAEL_256 來解密在 Laravel <= 4.1 下加密的 cookies/values

軟刪除模型現(xiàn)在改使用特性

如果你在模型下有使用軟刪除,現(xiàn)在 softDeletes 的屬性已經(jīng)被移除。你現(xiàn)在要使用 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 無法在基本模型下被使用。他只能在一個(gè)實(shí)際模型類別中使用。

視圖 / 分頁 / 環(huán)境 類別改名

如果你直接使用 Illuminate\View\EnvironmentIlluminate\Pagination\Environment 類別,請更新你的代碼將其改為參照 Illuminate\View\FactoryIlluminate\Pagination\Factory。改名后的這兩個(gè)類別更可以代表他們的功能。

Additional Parameter On Pagination Presenter

如果你擴(kuò)展了 Illuminate\Pagination\Presenter 類別,抽象方法 getPageLinkWrapper 參數(shù)表變成要加上 rel 參數(shù):

abstract public function getPageLinkWrapper($url, $page, $rel = null);

           

Iron.Io Queue 加密

如果你使用 Iron.io queue 驅(qū)動,你將需要增加一個(gè)新的 encrypt 選項(xiàng)到你的 queue 設(shè)置文件中:

'encrypt' => true

           

           

從 4.1.x 升級到 4.1.29

Laravel 4.1.29 對于所有的數(shù)據(jù)庫驅(qū)動加強(qiáng)了 column quoting 的部分。當(dāng)你的模型中沒有使用 fillable 屬性,他保護(hù)你的應(yīng)用程序不會受到 mass assignment 漏洞影響。如果你在模型中使用 fillable 屬性來防范 mass assignment,你的應(yīng)用程序?qū)⒉粫新┒础H绻闶褂?guarded 且在「更新」或「保存」類型的函式中,傳遞了末端用戶控制的數(shù)組,那你應(yīng)該立即升級到                4.1.29 以避免 mass assignment 的風(fēng)險(xiǎn)。

升級到 Laravel 4.1.29,只要 composer update 即可。在這個(gè)發(fā)行版本中沒有重大的更新。

           

從 4.1.25 升級到 4.1.26

Laravel 4.1.26 采用了針對「記得我」cookies 的安全性更新。在此更新之前,如果一個(gè)記得我的 cookies 被惡意用戶劫持,該 cookie 將還可以生存很長一段時(shí)間,即使真實(shí)用戶重設(shè)密碼或者注銷亦同。

此更動需要在你的 users (或者類似的) 的數(shù)據(jù)表中增加一個(gè)額外的 remember_token 字段。在更新之后,當(dāng)用戶每次登錄你的應(yīng)用程序?qū)幸粋€(gè)全新的 token 將會被指派。這個(gè) token 也會在用戶注銷應(yīng)用程序后被更新。這個(gè)更新的影響為:如果一個(gè)「記得我」的 cookie 被劫持,只要用戶注銷應(yīng)用程序?qū)U除該 cookie。

升級路徑

首先,增加一個(gè)新的字段,可空值、屬性為 VARCHAR(100)、TEXT 或同類型的字段 remember_token 到你的 users 數(shù)據(jù)表中。

然后,如果你使用 Eloquent 認(rèn)證驅(qū)動,依照下面更新你的 User 類別的三個(gè)方法:

public function getRememberToken(){
    return $this->remember_token;}public function setRememberToken($value){
    $this->remember_token = $value;}public function getRememberTokenName(){
    return 'remember_token';}

           

附注: 所有現(xiàn)存的「記得我」sessions 在此更新后將會失效,所以應(yīng)用程序的所有用戶將會被迫重新登錄。

組件管理者

兩個(gè)新的方法被加入到 Illuminate\Auth\UserProviderInterface 接口。范例實(shí)現(xiàn)方式可以在默認(rèn)驅(qū)動中找到:

public function retrieveByToken($identifier, $token);public function updateRememberToken(UserInterface $user, $token);

           

Illuminate\Auth\UserInterface 也加了三個(gè)新方法描述在「升級路徑」。

           

從 4.0 升級到 4.1

升級你的 Composer 依賴性

升級你的應(yīng)用程序至 Laravel 4.1,將 composer.json 里的 laravel/framework 版本更改至 4.1.*。

文件置換

將你的 public/index.php 置換成 這個(gè) repository 的干凈版本

同樣的,將你的 artisan 置換成 這個(gè) repository 的干凈版本。

添加設(shè)置文件及選項(xiàng)

更新你在設(shè)置文件 app/config/app.php 里的 aliasesproviders 數(shù)組。而更新的選項(xiàng)值可以在 這個(gè)文件 中找到。請確定將你后來加入自定和組件所需的 providers / aliases 加回?cái)?shù)組中。

這個(gè) repository 增加 app/config/remote.php 文件。

在你的 app/config/session.php 增加新的選項(xiàng) expire_on_close。而默認(rèn)值為 false

在你的 app/config/queue.php 文件里添加 failed 設(shè)置區(qū)塊。以下為區(qū)塊的默認(rèn)值:

'failed' => array(
    'database' => 'mysql', 'table' => 'failed_jobs',),

           

(非必要) 在你的 app/config/view.php 里,將 pagination 設(shè)置選項(xiàng)更新為 pagination::slider-3

更新控制器(Controllers)

如果 app/controllers/BaseController.phpuse 語句在最上面,將 use Illuminate\Routing\Controllers\Controller; 改為 use Illuminate\Routing\Controller;

更新密碼提醒

密碼提醒功能已經(jīng)大幅修正擁有更大的彈性。你可以執(zhí)行 Artisan 指令 php artisan auth:reminders-controller 來檢查新的存根控制器。你也可以瀏覽 更新文件 然后相應(yīng)的更新你的應(yīng)用程序。

更新你的 app/lang/en/reminders.php 語系文件來符合 這個(gè)新版文件

更新環(huán)境偵測

為了安全因素,不再使用網(wǎng)域網(wǎng)址來偵測辨別應(yīng)用程序的環(huán)境。因?yàn)檫@些直很容易被偽造欺騙,繼而讓攻擊者透過請求來達(dá)到變更環(huán)境。所以你必須改為使用機(jī)器的 hostname(在 Mac & Ubuntu 下執(zhí)行 hostname 出來的值)

(譯按:的確原有方式有安全性考量,但對于現(xiàn)行 VirtualHost 大量使用下,反而這樣改會造成不便)

更簡單的日志文件

Laravel 目前只會產(chǎn)生單一的日志文件:app/storage/logs/laravel.log。然而,你還是可以透過設(shè)置你的 app/start/global.php 文件來更改他的行為。

刪除重定向結(jié)尾的斜線

在你的 bootstrap/start.php 文件中,移除調(diào)用 $app->redirectIfTrailingSlash()。這個(gè)方法已不再需要了,因?yàn)橹髮囊钥蚣軆?nèi)的 .htaccess 來處理。

然后,用 新版 替換掉你 Apache 中的 .htaccess 文件,來處理結(jié)尾的斜線問題。

取得目前路由

取得目前路由的方法由 Route::getCurrentRoute() 改為 Route::current()。

Composer 更新

一旦你完成以上的更新,你可以執(zhí)行 composer update 來更新應(yīng)用程序的核心文件。如果有 class load 錯(cuò)誤,請?jiān)?update 之后加上 --no-scripts,如:composer update --no-scripts。

萬用字符事件監(jiān)聽者

萬用字符事件監(jiān)聽者不再添加事件為參數(shù)到你的處理函數(shù)。如果你需要尋找你觸發(fā)的事件你應(yīng)該用 Event::firing().


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號