鍍金池/ 教程/ PHP/ 升級(jí)向?qū)?/span>
Laravel Cashier
Eloquent ORM
HTTP 響應(yīng)
發(fā)行說(shuō)明
擴(kuò)展包開(kāi)發(fā)
HTTP 控制器
事件
擴(kuò)展框架
Contracts
開(kāi)發(fā)
配置
表單驗(yàn)證
錯(cuò)誤與日志
Hashing
貢獻(xiàn)指南
郵件
Session
遷移與數(shù)據(jù)填充
查詢構(gòu)造器
Redis
升級(jí)向?qū)?/span>
概覽
緩存
服務(wù)提供者
Envoy 任務(wù)執(zhí)行器
隊(duì)列
單元測(cè)試
服務(wù)容器
文件系統(tǒng) / 云存儲(chǔ)
認(rèn)證
請(qǐng)求的生命周期
加密
模板
視圖 (View)
Laravel Homestead
Laravel 安裝指南
介紹
Command Bus
分頁(yè)
輔助方法
應(yīng)用程序結(jié)構(gòu)
HTTP 路由
HTTP 請(qǐng)求
基本用法
本地化
HTTP 中間件
結(jié)構(gòu)生成器
Facades
Laravel Elixir

升級(jí)向?qū)?/h1>

升級(jí)到 5.0.16

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

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

從 4.2 升級(jí)到 5.0

全新安裝,然后遷移

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

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

Composer 依賴與組件

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

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

命名空間

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

設(shè)置文件

遷移環(huán)境變量

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

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

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

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

設(shè)置文件

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

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

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

路由

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

控制器

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

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

路由過(guò)濾器

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

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

Laravel 5 并沒(méi)有將過(guò)濾器移除,您一樣可以使用 beforeafter 綁定和使用您自定義的過(guò)濾器。

全局 CSRF

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

'App\Http\Middleware\VerifyCsrfToken',

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

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

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

Eloquent 模型

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

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

Eloquent 緩存

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

會(huì)員認(rèn)證模型

要使用 Laravel 5 的會(huì)員認(rèn)證系統(tǒng),請(qǐng)遵循以下指引來(lái)升級(jí)您的 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\RemindableTrait 和 Illuminate\Auth\UserTrait

Cashier 的用戶需要的修改

Laravel Cashier 的 trait 和接口名稱已作修改。trait 請(qǐng)改用 Laravel\Cashier\Billable 取代 BillableTrait。接口請(qǐng)改用 Laravel\Cashier\Contracts\Billable 取代 Larave\Cashier\BillableInterface 。不需要修改任何方法。

Artisan 命令

將所有的命令從舊的 app/commands 目錄移到新的app/Console/Commands 目錄。接下來(lái),把 app/Console/Commands 目錄添加到 composer.jsonclassmap 中。

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

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

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

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

全局 IoC 綁定

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

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

視圖

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

Blade 標(biāo)簽修改

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

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

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

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

多語(yǔ)言配置文件

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

公開(kāi)目錄

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

測(cè)試

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

各式各樣的文件

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

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

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

如果您使用表單或 HTML 輔助函數(shù),您將會(huì)看到以下錯(cuò)誤 class 'Form' not foundclass 'Html' not found 。Form 類以及 HTML 輔助函數(shù)在 Laravel 5.0 中已經(jīng)廢棄了;不過(guò),這里有一些替代方法,比如基于社區(qū)驅(qū)動(dòng)的,由 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 來(lái)取得非 Facade 版本的 Laravel 緩存,請(qǐng)改用 Illuminate\Contracts\Cache\Repository 注入。

分頁(yè)

請(qǐng)將所有的 $paginator->links()$paginator->render() 取代。

Beanstalk 隊(duì)列

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

Remote

Remote 組件已不再使用。

工作區(qū)

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

從 4.1 升級(jí)到 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 來(lái)解密在 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;
}

你一樣必須手動(dòng)增加 deleted_at 字段到你的 dates 屬性中:

class User extends Eloquent {
    use SoftDeletingTrait;

    protected $dates = ['deleted_at'];
}

而所有軟刪除的 API 使用方式維持相同。

附注: SoftDeletingTrait 無(wú)法在基本模型下被使用。他只能在一個(gè)實(shí)際模型類別中使用。

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

如果你直接使用 Illuminate\View\EnvironmentIlluminate\Pagination\Environment 類別,請(qǐng)更新你的代碼將其改為參照 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ū)動(dòng),你將需要增加一個(gè)新的 encrypt 選項(xiàng)到你的 queue 設(shè)置文件中:

'encrypt' => true

從 4.1.x 升級(jí)到 4.1.29

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

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

從 4.1.25 升級(jí)到 4.1.26

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

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

升級(jí)路徑

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

然后,如果你使用 Eloquent 認(rèn)證驅(qū)動(dòng),依照下面更新你的 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 在此更新后將會(huì)失效,所以應(yīng)用程序的所有用戶將會(huì)被迫重新登錄。

組件管理者

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

public function retrieveByToken($identifier, $token);

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

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

從 4.0 升級(jí)到 4.1

升級(jí)你的 Composer 依賴性

升級(jí)你的應(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ù)組,請(qǐng)確定將你后來(lái)加入自定和組件所需的 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 語(yǔ)句在最上面,將 use Illuminate\Routing\Controllers\Controller; 改為 use Illuminate\Routing\Controller;。

更新密碼提醒

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

更新你的 app/lang/en/reminders.php 語(yǔ)系文件來(lái)符合。

更新環(huán)境偵測(cè)

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

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

更簡(jiǎn)單的日志文件

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

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

在你的 bootstrap/start.php 文件中,移除調(diào)用 $app->redirectIfTrailingSlash()。這個(gè)方法已不再需要了,因?yàn)橹髮?huì)改以框架內(nèi)的 .htaccess 來(lái)處理。

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

取得目前路由

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

Composer 更新

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

萬(wàn)用字符事件監(jiān)聽(tīng)者

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

上一篇:HTTP 控制器下一篇:表單驗(yàn)證