每隔幾年,Symfony 都會(huì)發(fā)布一個(gè)新的主版本(第一個(gè)數(shù)字改變)。這些版本是最棘手的升級,因?yàn)樗鼈冊试S包含向后兼容的中斷。然而,Symfony 試圖使這個(gè)升級過程盡可能的平穩(wěn)。
這意味著您可以在主版本發(fā)布之前更新您的代碼。這被稱為使您的代碼未來兼容(future compatible)。
這里有三個(gè)步驟升級一個(gè)主版本:
在一個(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" />
默認(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
如果您的代碼不是過時(shí)的,您可以通過 Composer 使用修改 composer.json 的方法更新 Symfony 庫:
{
"...": "...",
"require": {
"symfony/symfony": "3.0.*",
},
"...": "...",
}
下一步,用 Composer 下載新版本的庫:
$ composer update symfony/symfony
如果您得到了一個(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 庫升級到含有后向兼容中斷改變的版本。
現(xiàn)在您有一個(gè)很好的機(jī)會(huì)!然而,由于后向兼容層并不總是可能的,新的主版本可能包含新的向后兼容中斷。確保您閱讀 Symfony 中的 UPGRADE-X.0.md(其中 X 是新版本號),并查看您需要注意的向后兼容中斷。