在 bootstrap/autoload.php
文件中, 把 $compiledPath
變量更新為:
$compiledPath = DIR.'/../vendor/compiled.php';
推薦的升級方式是建立一個(gè)全新的 Laravel 5.0
項(xiàng)目,然后復(fù)制您在 4.2
的文件到此新的應(yīng)用程序,這將包含控制器、路由、Eloquent 模型、Artisan 命令(Asset)、資源和關(guān)于此應(yīng)用程序的其他特定文件。
最開始,安裝新的 Laravel 5 應(yīng)用程序到新的本地目錄下,我們將詳細(xì)探討遷移各部分的過程。
別忘了將任何附加于 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 也允許您可以將這些類別一樣保留在「全局」的命名空間。
復(fù)制新的 .env.example
文件到 .env
,在 5.0
這相當(dāng)于原本的 .env.php
。像是您的 APP_ENV
和 APP_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>
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.json
的 classmap
,接下來,您可以從 app/Http/Controllers/Controller.php
基礎(chǔ)抽象類中移除命名空間,并確認(rèn)遷移過來的控制器要繼承這個(gè)基礎(chǔ)類。
在 app/Providers/RouteServiceProvider.php
文件中,將 namespace
屬性設(shè)置為 null
。
將過濾器綁定從原來的 app/filters.php
復(fù)制到 app/Providers/RouteServiceProvider.php
的 boot()
方法中,并在 app/Providers/RouteServiceProvider.php
加入 use Illuminate\Support\Facades\Route;
來繼續(xù)使用 Route
Facade。
您不需要移動任何 Laravel 4.0 默認(rèn)的過濾器,像是 auth
和 csrf
。他們已經(jīng)內(nèi)置,只是換作以中間件形式出現(xiàn)。那些在路由或控制器內(nèi)有參照到舊有的過濾器 (例如 ['before' => 'auth']
) 請修改參照到新的中間件 (例如 ['middleware' => 'auth'].
)
Laravel 5 并沒有將過濾器移除,您一樣可以使用 before
和 after
綁定和使用您自定義的過濾器。
默認(rèn)情況下,所有路由都會使用CSRF 保護(hù)。若想關(guān)閉他們,或是在指定在特定路由開啟,請移除 App\Http\Kernel
中 middleware
數(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 不再提供 remember
方法來緩存查詢?,F(xiàn)在你需要手動使用 Cache::remember
方法快速緩存。了解更多關(guā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\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
中。
然后,復(fù)制 Artisan 命令列表從 start/artisan.php
到 app/Console/Kernel.php
文件的 command
數(shù)組內(nèi)。
如果在您的數(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
。
若您在 start/global.php
有綁定任何 IoC,請將它們復(fù)制到 app/Providers/AppServiceProvider.php
內(nèi)的 register
方法,您可能需要引入 App
facade。
你可以選擇將這些綁定,依照類型拆分到不同的服務(wù)提供者中。
將所有的視圖從舊的 app/views
復(fù)制到新的resources/views
目錄內(nèi)。
從安全的角度考慮,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ù),您將會看到以下錯(cuò)誤 class 'Form' not found
或 class '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()
).
Laravel 5.0 使用 "pda/pheanstalk": "~3.0"
取代原本的 "pda/pheanstalk": "~2.1"
。
Remote 組件已不再使用。
工作區(qū)組件已不再使用。
Laravel 4.2 需要 PHP 5.4.0 以上。
增加一個(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)在 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í)際模型類別中使用。
如果你直接使用 Illuminate\View\Environment
或 Illuminate\Pagination\Environment
類別,請更新你的代碼將其改為參照 Illuminate\View\Factory
和 Illuminate\Pagination\Factory
。改名后的這兩個(gè)類別更可以代表他們的功能。
如果你擴(kuò)展了 Illuminate\Pagination\Presenter
類別,抽象方法 getPageLinkWrapper
參數(shù)表變成要加上 rel
參數(shù):
abstract public function getPageLinkWrapper($url, $page, $rel = null);
如果你使用 Iron.io queue 驅(qū)動,你將需要增加一個(gè)新的 encrypt
選項(xiàng)到你的 queue 設(shè)置文件中:
'encrypt' => true
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ā)行版本中沒有重大的更新。
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è)新方法描述在「升級路徑」。
升級你的應(yīng)用程序至 Laravel 4.1,將 composer.json
里的 laravel/framework
版本更改至 4.1.*
。
將你的 public/index.php
置換成 這個(gè) repository 的干凈版本。
同樣的,將你的 artisan
置換成 這個(gè) repository 的干凈版本。
更新你在設(shè)置文件 app/config/app.php
里的 aliases
和 providers
數(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
。
如果 app/controllers/BaseController.php
有 use
語句在最上面,將 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è)新版文件。
為了安全因素,不再使用網(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
文件來更改他的行為。
在你的 bootstrap/start.php
文件中,移除調(diào)用 $app->redirectIfTrailingSlash()
。這個(gè)方法已不再需要了,因?yàn)橹髮囊钥蚣軆?nèi)的 .htaccess
來處理。
然后,用 新版 替換掉你 Apache 中的 .htaccess
文件,來處理結(jié)尾的斜線問題。
取得目前路由的方法由 Route::getCurrentRoute()
改為 Route::current()
。
一旦你完成以上的更新,你可以執(zhí)行 composer update
來更新應(yīng)用程序的核心文件。如果有 class load 錯(cuò)誤,請?jiān)?update
之后加上 --no-scripts
,如:composer update --no-scripts
。
萬用字符事件監(jiān)聽者不再添加事件為參數(shù)到你的處理函數(shù)。如果你需要尋找你觸發(fā)的事件你應(yīng)該用 Event::firing()
.
更多建議: