鍍金池/ 教程/ PHP/ 升級一個(gè)主版本
如何以非繼承方式自定義方法
如何創(chuàng)建事件監(jiān)聽器
如何以非繼承方式擴(kuò)展一個(gè)類
如何記錄消息到不同的文件
如何掌握并創(chuàng)建新的環(huán)境
如何使用 Doctrine DBAL
"XXX is deprecated" E-USER-DEPRECATED 的警告是什么意思?
在登錄表單中使用 CSRF 保護(hù)
如何注冊自定義 DQL 函數(shù)
如何為表單類配置空數(shù)據(jù)
如何嵌入集合表單
如何創(chuàng)建自定義認(rèn)證提供者
如何使用 Apache Router
如何組織配置文件
部署在 Microsoft Azure 云
如何在路由參數(shù)中允許"/"字符
如何在安全,路由,服務(wù)和驗(yàn)證中使用表達(dá)式
如何對顯示控制臺信息配置 Monolog
如何為一個(gè) Bundle 創(chuàng)建友好的配置
如何改變默認(rèn)的目標(biāo)路徑行為
如何在運(yùn)行測試之前自定義引導(dǎo)過程
如何從路由向控制器傳輸額外的信息
如何從數(shù)據(jù)庫(實(shí)體提供者)讀取安全用戶
如何從 Controller 調(diào)用一個(gè)命令
如何創(chuàng)建自定義表單密碼驗(yàn)證器
如何使用內(nèi)建的 PHP Web 服務(wù)器
如何在功能測試中用 Token 模擬認(rèn)證
配置 Session 文件的保存目錄
理解前端控制器、內(nèi)核及環(huán)境如何協(xié)同工作
如何實(shí)現(xiàn)一個(gè)簡單的注冊表單
如何使用 Doctrine 擴(kuò)展:Timestampable, Sluggable, Translatable 等等
如何使用多個(gè)實(shí)體管理器和連接
如何自定義表單渲染
如何安裝第三方 Bundles
使用預(yù)認(rèn)證安全防火墻
如何簡化多個(gè) Bundle 的配置
會(huì)話代理實(shí)例
安裝 Composer
如何冒充一個(gè)用戶
如何注冊一個(gè)新的請求格式和 MIME 類型
如何在功能測試中使用分析器
如何在服務(wù)容器內(nèi)設(shè)置外部參數(shù)
如何重寫 Symfony 默認(rèn)的目錄結(jié)構(gòu)
如何在一個(gè) Symfony 控制器中創(chuàng)建一個(gè) SOAP 的 Web 服務(wù)
如何使用序列化
部署在 Platform.sh
升級一個(gè)副版本
如何寫一個(gè)自定義的 Twig 擴(kuò)展
如何在 SubVersion 中創(chuàng)建并保存一個(gè) Symfony 項(xiàng)目
使用 PHP 庫聯(lián)合,編譯和最小化 Web 資產(chǎn)
如何創(chuàng)建一個(gè)自定義的數(shù)據(jù)收集器
如何使用和注冊命名空間路徑
如何使用 Monolog 記錄日志
如何建立一個(gè)傳統(tǒng)的登錄表單
如何強(qiáng)制路由總是使用 HTTPS 或者 HTTP
如何在模板中使用 PHP 而不是 Twig
如何動(dòng)態(tài)選擇密碼加密算法
避免匿名用戶開始 Session 會(huì)話
如何測試 Doctrine 倉庫
如何在功能測試中測試一封電子郵件被發(fā)送
Symfony2 與 Symfony1 的區(qū)別
使用結(jié)尾反斜線重定向 URL
(configuration)如何在數(shù)據(jù)庫中使用 PdoSessionHandler 存儲(chǔ) Sessions
如何使用匹配器有條件地啟用分析器
部署在 Heroku 云
如何不用自定義控制器配置重定向
如何在 Bundle 內(nèi)部加載服務(wù)配置
如何處理不同的錯(cuò)誤級別
如何在應(yīng)用中保護(hù)服務(wù)和方法
如何對表單單元測試
如何把命令定義為服務(wù)
如何配置 Monolog 從日志中排除 404 錯(cuò)誤
如何使用控制臺
如何測試與數(shù)據(jù)庫交互的代碼
如何在路由中使用除了 GET 和 POST 的 HTTP 方法
如何使用云服務(wù)發(fā)送電子郵件
如何創(chuàng)建一個(gè)控制臺命令
在遺留的應(yīng)用上使用 Symfony Session
如何使用高級的訪問控制列表
如何不用一個(gè)自定義的控制器渲染一個(gè)模板
如何重寫部分 Bundle
升級一個(gè)主版本
安全訪問控制是如何工作的
如何使用 Bundle 的繼承來重寫部分 Bundle
如何使用 Voter 檢查用戶權(quán)限
如何為多個(gè) Doctrine 的實(shí)現(xiàn)提供模型類
如何使用作用域
如何部署一個(gè) Symfony 應(yīng)用
如何用 "inherit-data" 減少代碼冗余
如何注冊事件監(jiān)聽器和訂閱
使用 Bower 安裝 Symfony
如何創(chuàng)建一個(gè)自定義路由加載器
如何創(chuàng)建一個(gè)自定義的驗(yàn)證限制
在獨(dú)立注入類中使用參數(shù)
如何使用 Assetic 和 Twig Functions 進(jìn)行圖像優(yōu)化
如何利用表單事件動(dòng)態(tài)修改表單
如何在過濾器的前后設(shè)置事件分發(fā)器
如何在 Bundle 中使用 Compiler Passes
緩存包含 CSRF 保護(hù)表單的頁面
如何注入變量到所有的模板(如全局變量)
如何創(chuàng)建一個(gè)自定義表單域類型
如何限定防火墻使其只允許通過指定請求
如何把 Controller 定義為服務(wù)
如何使用 Gmail 發(fā)送郵件
升級一個(gè)補(bǔ)丁版本
如何創(chuàng)建一個(gè)表單類型擴(kuò)展
如何對不同的 URL 強(qiáng)制使用 HTTPS 或者 HTTP
如何使用 Varnish 加速我的 Web 站點(diǎn)
如何定義虛擬類和接口之間的關(guān)系
如何自定義登錄表單
如何測試多個(gè)客戶端的交互
PSR-7 Bridge
如何使用 YUI Compressor 裁剪 Javascripts 和 Stylesheets
在用戶的 Session 中使用局部 "Sticky"
如何定制錯(cuò)誤頁
如何從已存在的數(shù)據(jù)庫中生成實(shí)體
如何用 Doctrine 上傳文件
可復(fù)用 Bundles 的最佳實(shí)踐
如何發(fā)送一封電子郵件
如何將 Assetic Filter 應(yīng)用到具體的文件擴(kuò)展名上
切換分析器存儲(chǔ)
如何上傳文件
限制 Session 元數(shù)據(jù)的寫入
如何使用多用戶提供者
如何使用數(shù)據(jù)轉(zhuǎn)換
配置一個(gè) Web 服務(wù)器
如何編程訪問分析器數(shù)據(jù)
如何在路由中使用服務(wù)容器參數(shù)
如何在控制臺生成 URL 和發(fā)送郵件
如何將你的開發(fā)環(huán)境優(yōu)化為調(diào)試環(huán)境
如何在控制臺命令中啟用日志
如何在功能測試中模擬 HTTP 認(rèn)證
如何使用 API 驗(yàn)證用戶
如何移除 AcmeDemoBundle
控制臺命令
如何配置 Symfony 使其工作在負(fù)載均衡和反轉(zhuǎn)代理
如何添加“記住我”登錄功能
如何使用 Assetic 進(jìn)行資產(chǎn)管理
如何限定防火墻使其接受指定主機(jī)
如何使用訪問控制列表(ACLs)
如何裁剪 CSS/JS 文件(使用 UglifyJS 和 UglifyCSS)
如何緩存電子郵件
如何使用 submit() 函數(shù)處理表單提交
如何在 Git 中創(chuàng)建并保存一個(gè) Symfony 項(xiàng)目
如何創(chuàng)建自定義用戶提供者
如何對電子郵件錯(cuò)誤配置 Monolog
如何在開發(fā)時(shí)使用電子郵件

升級一個(gè)主版本

每隔幾年,Symfony 都會(huì)發(fā)布一個(gè)新的主版本(第一個(gè)數(shù)字改變)。這些版本是最棘手的升級,因?yàn)樗鼈冊试S包含向后兼容的中斷。然而,Symfony 試圖使這個(gè)升級過程盡可能的平穩(wěn)。

這意味著您可以在主版本發(fā)布之前更新您的代碼。這被稱為使您的代碼未來兼容(future compatible)。

這里有三個(gè)步驟升級一個(gè)主版本:

  1. 使您的代碼不是過時(shí)的;
  2. 通過 Composer 更新新的主版本
  3. 更新您的代碼,使之在新的版本中工作

1)使您的代碼不是過時(shí)的

在一個(gè)主版本的生命周期中,新的特性被添加,方法簽名和公共 API 的用法改變。但是,副版本不應(yīng)該包含任何向后兼容的更改。要做到這一點(diǎn),“老的”(例如,函數(shù),類,等等)的代碼仍然工作,但被標(biāo)記為過時(shí),表明它將在未來刪除/改變,您應(yīng)該停止使用它。

當(dāng)主版本(例如 3.0.0)發(fā)布,所有的過時(shí)的特性和功能都會(huì)被去除。所以,只要您將代碼中的主版本之前的最后一個(gè)版本(例如 2.8.*)中過時(shí)的特性都停用,您應(yīng)該能沒有問題地升級。

為了幫助您完成這個(gè),最后一個(gè)發(fā)布的副版本將會(huì)觸發(fā)過期提醒。例如,2.7 和 2.8 版本觸發(fā)過期提醒。當(dāng)在瀏覽器的開發(fā)環(huán)境上訪問您的應(yīng)用程序時(shí),這些提醒會(huì)在 web 開發(fā)工具欄顯示:

http://wiki.jikexueyuan.com/project/symfony-cookbook/images/deprecations-in-profiler.png" alt="1" />

PHPUnit 中的過時(shí)部分

默認(rèn)情況下,PHPUnit 會(huì)像處理真正的錯(cuò)誤一樣處理過時(shí)提醒。這意味著所有的任務(wù)都被終止,因?yàn)樗褂昧讼蚝蠹嫒輰樱˙C layer)。

為了確保這樣的情況不會(huì)發(fā)生,您可以安裝 PHPUnit bridge:

$ composer require symfony/phpunit-bridge

現(xiàn)在,您的任務(wù)像通常一樣執(zhí)行,一個(gè)漂亮的過期提醒總結(jié)顯示在測試報(bào)告末尾。

$ phpunit
...

OK (10 tests, 20 assertions)

Remaining deprecation notices (6)

The "request" service is deprecated and will be removed in 3.0. Add a typehint for
Symfony\Component\HttpFoundation\Request to your controller parameters to retrieve the
request instead: 6x
    3x in PageAdminTest::testPageShow from Symfony\Cmf\SimpleCmsBundle\Tests\WebTest\Admin
    2x in PageAdminTest::testPageList from Symfony\Cmf\SimpleCmsBundle\Tests\WebTest\Admin
    1x in PageAdminTest::testPageEdit from Symfony\Cmf\SimpleCmsBundle\Tests\WebTest\Admin

2)通過 Composer 更新新的主版本

如果您的代碼不是過時(shí)的,您可以通過 Composer 使用修改 composer.json 的方法更新 Symfony 庫:

{
    "...": "...",

    "require": {
        "symfony/symfony": "3.0.*",
    },
    "...": "...",
}

下一步,用 Composer 下載新版本的庫:

$ composer update symfony/symfony

依賴錯(cuò)誤

如果您得到了一個(gè)依賴的錯(cuò)誤,它可能只是意味著您需要升級其他 Symfony 的依賴。在這種情況下,嘗試以下命令:

$ composer update symfony/symfony --with-dependencies

這個(gè)命令升級 symfony/symfony 和它依賴的所有包(packages),其中包含一些其他的包。通過使用 composer.json 里的嚴(yán)格版本限制(tight version constraints),您可以控制每個(gè)庫升級到哪個(gè)版本。

如果這仍不管用,您的 composer.json 文件可能指定了某個(gè)庫的一個(gè)版本,這個(gè)庫與新版本的 Symfony 不兼容。這種情況下,更新 composer.json 中的那個(gè)庫到更新的版本可能能夠解決這個(gè)問題。

或者,您可能會(huì)有更深層的問題,不同的庫依賴于其他庫沖突的版本。檢查錯(cuò)誤信息以調(diào)試。

升級其他包

您可能也想升級剩余的庫。如果您在 composer.json 中對您的版本限制(version constraints)做的很好。您可以執(zhí)行以下代碼來安全地升級:

$ composer update

注意,如果在您的 composer.json (例如 dev-master)中含有非特定的版本限制(version constraints),這可以使一些 non-Symfony 庫升級到含有后向兼容中斷改變的版本。

3)更新您的代碼,使之在新的版本中工作

現(xiàn)在您有一個(gè)很好的機(jī)會(huì)!然而,由于后向兼容層并不總是可能的,新的主版本可能包含新的向后兼容中斷。確保您閱讀 Symfony 中的 UPGRADE-X.0.md(其中 X 是新版本號),并查看您需要注意的向后兼容中斷。