在 bootstrap/autoload.php
文件中, 把 $compiledPath
變量更新為:
$compiledPath = DIR.'/../vendor/compiled.php';
推薦的升級方式是建立一個全新的 Laravel 5.0
項目,然后復制您在 4.2
的文件到此新的應用程序,這將包含控制器、路由、Eloquent 模型、Artisan 命令(Asset)、資源和關于此應用程序的其他特定文件。
最開始,安裝新的 Laravel 5 應用程序到新的本地目錄下,我們將詳細探討遷移各部分的過程。
別忘了將任何附加于 Composer 的依賴組件加入 5.0 應用程序內,包含第三方代碼(例如 SDKs)。
部分組件也許不兼容剛發(fā)布的 Laravel 5 版本,請向組件管理者確認該組件支持 Laravel 5 的版本,當您在 Composer 內加入任何組件,請執(zhí)行 composer update
。
默認情況下,Laravel 4 沒有在應用程序的源碼中使用命名空間,所以,舉例來說,所有的 Eloquent 模型和控制器僅存在「全局」的命名空間下,為了更快速的遷移,Laravel 5 也允許您可以將這些類別一樣保留在「全局」的命名空間。
復制新的 .env.example
文件到 .env
,在 5.0
這相當于原本的 .env.php
。像是您的 APP_ENV
和 APP_KEY
(您的加密鑰匙)、數(shù)據(jù)庫認證和您的緩存驅動與 session 驅動。
此外,復制原先自定義的 .env.php
文件,并修改為 .env
(本機環(huán)境的真實設置值) 和 .env.example
(給其他團隊成員的示例)。
更多關于環(huán)境設置值,請見完整文檔。
注意: 在部署 Laravel 5 應用程序之前,您需要在正式主機上放置
.env
文件并設置適當?shù)闹怠?/p>
Laravel 5.0 不再使用 app/config/{environmentName}/
目錄結構來提供對應該環(huán)境的設置文件,取而代之的是,將環(huán)境對應的設置值復制到 .env
,然后在設置文件使用 env('key', 'default value')
來訪問,您可以在 config/database.php
文件內看到相關范例。
將設置文件放在 config/
目錄下,來表示所有環(huán)境共用的設置文件,或是在文件內使用 env()
來取得對應該環(huán)境的設置值。
請記住,若您在 .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;
來繼續(xù)使用 Route
Facade。
您不需要移動任何 Laravel 4.0 默認的過濾器,像是 auth
和 csrf
。他們已經(jīng)內置,只是換作以中間件形式出現(xiàn)。那些在路由或控制器內有參照到舊有的過濾器 (例如 ['before' => 'auth']
) 請修改參照到新的中間件 (例如 ['middleware' => 'auth'].
)
Laravel 5 并沒有將過濾器移除,您一樣可以使用 before
和 after
綁定和使用您自定義的過濾器。
默認情況下,所有路由都會使用CSRF 保護。若想關閉他們,或是在指定在特定路由開啟,請移除 App\Http\Kernel
中 middleware
數(shù)組內的這一行:
如果您想在其他地方使用它,加入這一行到 $routeMiddleware
:
'csrf' => 'App\Http\Middleware\VerifyCsrfToken',
現(xiàn)在,您可于路由內使用 ['middleware' => 'csrf']
即可個別添加中間件到路由/控制器。了解更多關于中間件,請見完整文檔。
你可以建立新的 app/Models
目錄來放置所有 Eloquent 模型。并且同樣的,在 composer.json
將此目錄添加到 classmap
內。
在模型內加入 SoftDeletingTrait
來使用Illuminate\Database\Eloquent\SoftDeletes
.
Eloquent 不再提供 remember
方法來緩存查詢?,F(xiàn)在你需要手動使用 Cache::remember
方法快速緩存。了解更多關于緩存,請見完整文檔。
要使用 Laravel 5 的會員認證系統(tǒng),請遵循以下指引來升級您的 User
模型:
從 use
區(qū)塊刪除以下內容:
use Illuminate\Auth\UserInterface;use Illuminate\Auth\Reminders\RemindableInterface;
添加以下內容到 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 接口。
實現(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
中。
然后,復制 Artisan 命令列表從 start/artisan.php
到 app/Console/Kernel.php
文件的 command
數(shù)組內。
如果在您的數(shù)據(jù)庫內已經(jīng)有 users 表,請移除 Laravel 5 內置的兩個遷移文件。
將所有的遷移文件從舊的 app/database/migrations
目錄復制到新的 database/migrations
。所有的數(shù)據(jù)填充文件也要從 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 輔助函數(shù),您將會看到以下錯誤 class 'Form' not found
或 class 'Html' not found
。Form 類以及 HTML 輔助函數(shù)在 Laravel 5.0 中已經(jīng)廢棄了;不過,這里有一些替代方法,比如基于社區(qū)驅動的,由 Laravel Collective 維護。
比如,你可以在 composer.json
文件中的 require
區(qū)塊增加 "laravelcollective/html": "~5.0"
。
您也需要添加表單和 HTML 的 facades 以及服務提供者。 編輯 config/app.php
文件,添加此行到 'providers' 數(shù)組內:
'Collective\Html\HtmlServiceProvider',
接著,添加以下到 'aliases' 數(shù)組內:
'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 以上。
增加一個新的 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
如果你在模型下有使用軟刪除,現(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
無法在基本模型下被使用。他只能在一個實際模型類別中使用。
如果你直接使用 Illuminate\View\Environment
或 Illuminate\Pagination\Environment
類別,請更新你的代碼將其改為參照 Illuminate\View\Factory
和 Illuminate\Pagination\Factory
。改名后的這兩個類別更可以代表他們的功能。
如果你擴展了 Illuminate\Pagination\Presenter
類別,抽象方法 getPageLinkWrapper
參數(shù)表變成要加上 rel
參數(shù):
abstract public function getPageLinkWrapper($url, $page, $rel = null);
如果你使用 Iron.io queue 驅動,你將需要增加一個新的 encrypt
選項到你的 queue 設置文件中:
'encrypt' => true
Laravel 4.1.29 對于所有的數(shù)據(jù)庫驅動加強了 column quoting 的部分。當你的模型中沒有使用 fillable
屬性,他保護你的應用程序不會受到 mass assignment 漏洞影響。如果你在模型中使用 fillable
屬性來防范 mass assignment,你的應用程序將不會有漏洞。如果你使用 guarded
且在「更新」或「保存」類型的函式中,傳遞了末端用戶控制的數(shù)組,那你應該立即升級到 4.1.29
以避免 mass assignment 的風險。
升級到 Laravel 4.1.29,只要 composer update
即可。在這個發(fā)行版本中沒有重大的更新。
Laravel 4.1.26 采用了針對「記得我」cookies 的安全性更新。在此更新之前,如果一個記得我的 cookies 被惡意用戶劫持,該 cookie 將還可以生存很長一段時間,即使真實用戶重設密碼或者注銷亦同。
此更動需要在你的 users
(或者類似的) 的數(shù)據(jù)表中增加一個額外的 remember_token
字段。在更新之后,當用戶每次登錄你的應用程序將會有一個全新的 token 將會被指派。這個 token 也會在用戶注銷應用程序后被更新。這個更新的影響為:如果一個「記得我」的 cookie 被劫持,只要用戶注銷應用程序將會廢除該 cookie。
首先,增加一個新的字段,可空值、屬性為 VARCHAR(100)、TEXT 或同類型的字段 remember_token
到你的 users
數(shù)據(jù)表中。
然后,如果你使用 Eloquent 認證驅動,依照下面更新你的 User
類別的三個方法:
public function getRememberToken(){ return $this->remember_token;}public function setRememberToken($value){ $this->remember_token = $value;}public function getRememberTokenName(){ return 'remember_token';}
附注: 所有現(xiàn)存的「記得我」sessions 在此更新后將會失效,所以應用程序的所有用戶將會被迫重新登錄。
兩個新的方法被加入到 Illuminate\Auth\UserProviderInterface
接口。范例實現(xiàn)方式可以在默認驅動中找到:
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
數(shù)組。而更新的選項值可以在 這個文件 中找到。請確定將你后來加入自定和組件所需的 providers / aliases 加回數(shù)組中。
從 這個 repository 增加 app/config/remote.php
文件。
在你的 app/config/session.php
增加新的選項 expire_on_close
。而默認值為 false
。
在你的 app/config/queue.php
文件里添加 failed
設置區(qū)塊。以下為區(qū)塊的默認值:
'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;
。
密碼提醒功能已經(jīng)大幅修正擁有更大的彈性。你可以執(zhí)行 Artisan 指令 php artisan auth:reminders-controller
來檢查新的存根控制器。你也可以瀏覽 更新文件 然后相應的更新你的應用程序。
更新你的 app/lang/en/reminders.php
語系文件來符合 這個新版文件。
為了安全因素,不再使用網(wǎng)域網(wǎng)址來偵測辨別應用程序的環(huán)境。因為這些直很容易被偽造欺騙,繼而讓攻擊者透過請求來達到變更環(huán)境。所以你必須改為使用機器的 hostname(在 Mac & Ubuntu 下執(zhí)行 hostname
出來的值)
(譯按:的確原有方式有安全性考量,但對于現(xiàn)行 VirtualHost 大量使用下,反而這樣改會造成不便)
Laravel 目前只會產(chǎn)生單一的日志文件:app/storage/logs/laravel.log
。然而,你還是可以透過設置你的 app/start/global.php
文件來更改他的行為。
在你的 bootstrap/start.php
文件中,移除調用 $app->redirectIfTrailingSlash()
。這個方法已不再需要了,因為之后將會改以框架內的 .htaccess
來處理。
然后,用 新版 替換掉你 Apache 中的 .htaccess
文件,來處理結尾的斜線問題。
取得目前路由的方法由 Route::getCurrentRoute()
改為 Route::current()
。
一旦你完成以上的更新,你可以執(zhí)行 composer update
來更新應用程序的核心文件。如果有 class load 錯誤,請在 update
之后加上 --no-scripts
,如:composer update --no-scripts
。
萬用字符事件監(jiān)聽者不再添加事件為參數(shù)到你的處理函數(shù)。如果你需要尋找你觸發(fā)的事件你應該用 Event::firing()
.
更多建議: