升级主要版本(例如5.4.0到6.0.0)

编辑本页

升级主要版本(例如5.4.0到6.0.0)

每两年,Symfony会发布一个新欧宝娱乐app下载地址的主要版本(第一个版本号会改变)。这些版本的升级是最棘手的,因为它们被允许破坏向后兼容性。然而,Symfon欧宝娱乐app下载地址y使这个升级过程尽可能顺利。

这意味着您可以在主要版本实际发布之前更新大部分代码。这叫做编写代码未来的兼容

升级主要版本有以下几个步骤:

  1. 让您的代码免于弃用
  2. 通过Composer更新到新的主版本
  3. 更新代码以使用新版本

1)让你的代码免于弃用

在主要版本的生命周期中,会添加新特性,改变方法签名和公共API使用。然而,小版本不应包含任何向后不兼容的更改。要做到这一点,“旧的”(例如函数,类等)代码仍然可以工作,但被标记为弃用,表示将来会删除/更改,并建议您停止使用。

当主要版本发布时(例如6.0.0),所有已弃用的特性和功能都将被删除。所以,只要你已经更新了你的代码,停止使用这些过时的功能在前一个版本的主要(例如。5.4 . *),你应该可以毫无问题地升级。这意味着你应该首先升级到最新的小版本(例如5.4)以便你能看到所有的用法。

为了帮助您找到已弃用的特性,每当您最终使用了已弃用的特性时,都会触发通知。中访问应用程序时开发环境在浏览器中,这些通知显示在web开发工具栏中:

最终,您应该致力于停止使用已弃用的功能。有时,警告可能会告诉您需要更改哪些内容。

但其他时候,警告可能不清楚:某个地方的设置可能会导致更深的类触发警告。在这种情况下,Symfony欧宝娱乐app下载地址尽力给出一个明确的信息,但您可能需要进一步研究该警告。

有时,警告可能来自您正在使用的第三方库或包。如果这是真的,那么很有可能已经更新了那些已弃用的内容。在这种情况下,升级库来修复它们。

一旦所有弃用警告消失,您就可以更有信心地升级了。

PHPUnit中的弃用

当您使用PHPUnit运行测试时,不会显示弃用通知。为了帮助您,Symfony提供了PH欧宝娱乐app下载地址PUnit桥接。这个桥将在测试报告的末尾向您展示所有弃用通知的漂亮摘要。

你所需要做的就是安装PHPUnit桥接:

1
创建symfony/phpunit-bridg欧宝娱乐app下载地址e

现在,你可以开始修复通知:

12 3 4 5 6 7 8 9 10 11 12 13 14
执行"composer require——dev symfony/phpunit-bridge"命令后使用欧宝娱乐app下载地址/ bin / phpunit)…OK(10个测试,20个断言)剩余的弃用通知(6)“请求”服务已弃用并将被删除3.0.添加一个类型提示欧宝娱乐app下载地址Symfony\Component\HttpFoundation\请求到你的控制器参数来检索请求:6x 3xPageAdminTest::testPageShow from 欧宝娱乐app下载地址Symfony\Cmf\SimpleCmsBundle\Tests\WebTest\Admin 2x来自Symfony\Cmf\SimpleCmsBundle\Tes欧宝娱乐app下载地址ts\WebTest\Admin 1x的PageAdminTest: testPageList来自Symfony\Cmf\SimpleCmsBundle\Tes欧宝娱乐app下载地址ts\WebTest\Admin的PageAdminTest: testPageEdit

一旦你把它们都修好了,命令就以0(成功)你就完成了!

谨慎

您可能会看到许多关于不兼容的本机返回类型的反对意见。看到添加本地返回类型获取修复这些弃用的指导。

有时,你不能修复所有的弃用(例如,某些东西在5.4中已弃用,而你仍然需要支持5.3)。在这些情况下,您仍然可以使用桥来修复尽可能多的弃用,然后允许更多的弃用使您的测试再次通过。方法可以做到这一点欧宝娱乐app下载地址SYMFONY_DEPRECATIONS_HELPERenv变量:

1 2 3 4 5 6 7 8
<!——phpunit.xml.dist——><phpunit)><!——……--><php><env的名字“欧宝娱乐app下载地址SYMFONY_DEPRECATIONS_HELPER”价值“马克斯(总)= 999999”/>php>phpunit)>

您还可以执行如下命令:

1
欧宝娱乐app下载地址SYMFONY_DEPRECATIONS_HELPER=max[total]=999999 php ./bin/phpunit

2)通过Composer更新到新的主要版本

一旦代码不再弃用,您就可以通过Composer通过修改您的代码来更新Symfony库欧宝娱乐app下载地址composer.json文件和更改所有库开始欧宝娱乐app下载地址symfony /到新的主版本:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
{"…": "…","require": {- "欧宝娱乐app下载地址symfony/cache": "5.4.*",+“s欧宝娱乐app下载地址ymfony/cache”:“6.0.*”,- "欧宝娱乐app下载地址symfony/config": "5.4.*",+“s欧宝娱乐app下载地址ymfony/config”:“6.0.*”,"sy欧宝娱乐app下载地址mfony/console": "5.4.*",+“s欧宝娱乐app下载地址ymfony/console”:“6.0.*”,"...:“…”,“…”:“一些库从symfony开始/遵循他们自己的版本控制方案。欧宝娱乐app下载地址你不需要更新这些版本:你可以在任何你想要的时候独立升级它们","symfony/ monoo -bundle": "^3.5",}, "…"欧宝娱乐app下载地址: "…",}

在你的底部composer.json文件,在额外的block中可以找到Symfony版本的数据设置。欧宝娱乐app下载地址一定要升级这个。例如,将其更新为6.0 . *升级至Symfony 6.0欧宝娱乐app下载地址:

1 2 3 4 5 6 7
"extra": {"s欧宝娱乐app下载地址ymfony": {"allow-contrib": false,"require": "5.4.*"+ "require": "6.0.*"}}

接下来,使用Composer下载新版本的库:

1
作曲家更新“欧宝娱乐app下载地址symfony / *”

依赖错误

如果您得到一个依赖项错误,这可能意味着您还需要升级作为Symfony库依赖项的其他库。欧宝娱乐app下载地址要允许这样做,请通过——with-all-dependencies国旗:

1
作曲家更新“欧宝娱乐app下载地址symfony / *”——with-all-dependencies

这个更新欧宝娱乐app下载地址symfony / *而且所有这些包所依赖的包。通过使用严格的版本约束composer.json,您可以控制每个库升级到什么版本。

如果还是不行,你的composer.json文件可能会为不兼容新Symfony版本的库指定一个版本。欧宝娱乐app下载地址在这种情况下,将该库更新到中较新的版本composer.json也许能解决问题。

或者,您可能会遇到更深层次的问题,即不同的库依赖于其他库的冲突版本。检查要调试的错误消息。

另一个可能发生的问题是,项目依赖项可以安装在本地计算机上,但不能安装在远程服务器上。这通常发生在每台机器上的PHP版本不同的情况下。解决方案是添加平台配置选项到您的“composer”。json文件来定义依赖关系所允许的最高PHP版本(设置为服务器的PHP版本)。

升级其他软件包

您可能还想升级其余的库。如果你做得很好版本约束composer.json,你可以通过运行:

1
作曲家更新

谨慎

小心,如果你有一些不具体的版本约束在你的composer.json(如。dev-master),这可能会将一些非symfony库升级到包含破坏向后兼容性更欧宝娱乐app下载地址改的新版本。

3)更新食谱

的更新版本随着时间的推移-特别是当您升级到一个库的新版本时配方可能有空。这些更新通常是次要的——例如在配置文件中添加新的注释——但是让您的文件与recipes保持同步是个好主意。

欧宝娱乐app下载地址Symfony Flex提供了几个命令来帮助您升级食谱。在开始之前,请确保提交您正在进行的任何不相关的更改:

1.18

食谱:更新命令在Symfony Flex 1.18中引入。欧宝娱乐app下载地址

1 2 3 4 5 6 7 8 9 10 11
#选择一个过时的食谱来更新作曲家食谱:更新#更新一个特定的食谱编写器配方:更新symfony/framewor欧宝娱乐app下载地址k-bundle#查看所有已安装的食谱列表,其中有可用的更新作曲家的食谱#查看有关特定食谱的详细信息Composer recipes 欧宝娱乐app下载地址symfony/framework-bundle

食谱:更新Command很聪明:它会查看安装时的配方与最新版本之间的差异。然后它会创建一个补丁并应用到你的应用程序中。如果有任何冲突,你可以像正常一样解决它们git像往常一样冲突和承诺。

4)更新你的代码以适应新版本

在一些罕见的情况下,下一个主要版本五月包含向后兼容性中断。确保你读了UPGRADE-X.0.md(其中X是新的主版本)包含在Symfony存储库中,用于您需要注意的任何BC中断。欧宝娱乐app下载地址

升级到Symfony 6:欧宝娱乐app下载地址添加本机返回类型

欧宝娱乐app下载地址Symfony 6将为(几乎所有)方法提供原生PHP返回类型。

在PHP中,如果父类有返回类型声明,那么任何实现或覆盖该方法的类也必须有返回类型。但是,您可以在父类添加返回类型之前添加返回类型。这意味着在升级到Symfony 6.0之前,向类中添加原生PHP返回类型非常重要。欧宝娱乐app下载地址否则,您将得到不兼容的声明错误。

当启用调试模式时(通常在开发和测试环境中),Symfony将为每个不兼容的方法声明触发弃用。欧宝娱乐app下载地址例如,用户界面:将getRoles ()方法将具有数组返回类型在Symfony 6。欧宝娱乐app下载地址在Sy欧宝娱乐app下载地址mfony 5.4中,您将收到关于此的弃用通知,并且必须将返回类型声明添加到您的将getRoles ()方法。

为了帮助您实现这一点,Symfony提欧宝娱乐app下载地址供了一个脚本,可以为您自动添加这些返回类型。确保您安装了欧宝娱乐app下载地址symfony /欢心组件。安装后,使用Composer生成一个完整的类映射,并运行脚本遍历类映射并修复任何不兼容的方法:

1 2 3 4 5 6 7
#确保"exclude-from-classmap"没有在你的"composer.json"中被填充。然后转储自动装填机:# "-o"很重要!这迫使Composer找到所有的类Composer dump-autoload -o#修补所有不兼容的方法声明/供应商/ bin / patch-type-declarations

提示

这个特性并不局限于Symfony包。欧宝娱乐app下载地址它还将帮助您添加类型,并为项目中的其他依赖项做好准备。

属性可以修改此脚本的行为欧宝娱乐app下载地址SYMFONY_PATCH_TYPE_DECLARATIONS这个env变量的值是url编码的(例如。param1 = value1¶m2 = value2),可使用以下参数:

启用固定返回类型,该值必须是以下类型之一:

  • 2添加所有可能的返回类型(默认值,建议应用程序使用);
  • 1仅向测试、最终、内部或私有方法添加返回类型;
  • phpdoc只添加@return文档块注释到不兼容的方法,或者# (\ ReturnTypeWillChange)如果它是由PHP引擎触发。
php
PHP的目标版本。7.1不生成“对象”类型(在7.2中引入)。默认为运行脚本时使用的PHP版本。
的用法
设置为0禁用弃用。类声明返回类型时,当子类错过返回类型时,会出现弃用通知@return注释(默认为1).

如果有应忽略的特定文件,则可以设置欧宝娱乐app下载地址SYMFONY_PATCH_TYPE_EXCLUDE将环境变量转换为正则表达式。这个正则表达式将被匹配到类的完整路径,每个匹配的路径将被忽略(例如。欧宝娱乐app下载地址SYMFONY_PATCH_TYPE_EXCLUDE = " /测试\ /设备\ / /”).在供应商/目录总是被忽略。

提示

脚本不关心代码样式。运行您的代码样式修复器,或者PHP CS Fixerphpdoc_trim_consecutive_blank_line_separationno_superfluous_phpdoc_tags而且ordered_imports规则,在修补类型之后。

开源包和包在添加返回类型时需要更加谨慎,因为添加返回类型会迫使所有扩展类的用户也添加返回类型。推荐的方法是采用两步流程:

  1. 首先,创建一个小版本(即没有向后兼容性问题),在其中添加可以安全地引入和添加的类型@returnPHPDoc到所有其他方法:

    1 2 3 4 5 6
    #为所有内部、final、test和私有方法添加类型声明。#更新"php"参数,以匹配最低要求的php版本欧宝娱乐app下载地址SYMFONY_PATCH_TYPE_DECLARATIONS =“力= 1 php = 7.4”/供应商/ bin / patch-type-declarations#将PHPDoc添加到剩余的public和protected方法中欧宝娱乐app下载地址SYMFONY_PATCH_TYPE_DECLARATIONS =“力= phpdoc&php = 7.4”/供应商/ bin / patch-type-declarations

    运行脚本后,检查类并添加更多类@returnPHPDoc,它们不见了。弃用和补丁脚本完全基于PHPDoc信息工作。此版本的用户将收到弃用通知,通知他们将您的包中缺少的返回类型添加到他们的代码中。

    如果您不需要任何PHPDoc,并且您的所有方法声明都已经与Symfony兼容,那么您可以放心地允许欧宝娱乐app下载地址^ 6.0用于Symfon欧宝娱乐app下载地址y依赖项。否则,您必须继续(2)。

  2. 创建一个新的主要版本(例如:向后兼容性中断),在这里您可以向所有方法添加类型:

    1 2
    #更新"php"参数,以匹配最低要求的php版本欧宝娱乐app下载地址SYMFONY_PATCH_TYPE_DECLARATIONS =“力= 2 php = 7.4”/供应商/ bin / patch-type-declarations

    现在,你可以放心了^ 6.0用于Symfon欧宝娱乐app下载地址y依赖项。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 6.2支持通过苏禄人
欧宝娱乐app下载地址Symfony 6.2支持通过Les-Tilleuls.coop