Symfony 5.1 弃用 RouteCollectionBuilder -> RoutingConfigurator

Posted

技术标签:

【中文标题】Symfony 5.1 弃用 RouteCollectionBuilder -> RoutingConfigurator【英文标题】:Symfony 5.1 Deprecation RouteCollectionBuilder -> RoutingConfigurator 【发布时间】:2020-09-23 15:12:48 【问题描述】:

我正在将 Symfony 项目从 5.0 更新到 5.1 有一个弃用提示说 RouteCollectionBuilder 已弃用,应使用 RoutingConfigurator 代替。

确切的信息是

从 symfony/routing 5.1 开始: "Symfony\Component\Routing\RouteCollectionBuilder" 类是 已弃用,使用 “Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator” 而是。

这应该如何实现? 我应该更改供应商文件夹中的代码吗?

【问题讨论】:

【参考方案1】:

您需要更新Kernel 类以开始使用RoutingConfigurator 而不是RouteCollectionBuilder

您可以通过更新配方 (composer recipes:install symfony/framework-bundle --force) 自动完成。

【讨论】:

请注意,5.1 Kernel.php 也已更改为仅加载 yaml 配置文件。如果您碰巧使用 php 或 xml 配置文件,那么您需要进行一些额外的调整。您还可能会覆盖您可能已经对 Kernel.php 所做的任何更改。另一种方法是创建一个新的 5.1 项目,然后进行一些差异/复制/粘贴。 非常感谢您的回答。到目前为止,我没有更改 Kernel.php,所以没关系,而且我严格使用 yaml 进行配置。然而,配方更新也改变了一些我必须审查的其他文件。不过看起来很有希望:-) ....并提供另一个提示:项目目录方法已从原始内核中消失。这给我带来了问题 我花了 5 分钟才发现 RoutingConfigurator::import() 方法与之前的 RouteCollectionBuilder::import() 方法具有不同的签名。 $prefix 参数不见了 ;-)【参考方案2】:

如果有人在修复此折旧时遇到问题

Since symfony/routing 5.1: The "Symfony\Component\Routing\RouteCollectionBuilder" class is deprecated, use "Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator" instead.

这是我更新的文件src/Kernel.php

<?php

namespace App;

use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;

class Kernel extends BaseKernel

    use MicroKernelTrait;

    protected function configureContainer(ContainerConfigurator $container): void
    
        $container->import('../config/packages/*.yaml');
        $container->import('../config/packages/'.$this->environment.'/*.yaml');

        if (is_file(\dirname(__DIR__).'/config/services.yaml')) 
            $container->import('../config/services.yaml');
            $container->import('../config/services_'.$this->environment.'.yaml');
         elseif (is_file($path = \dirname(__DIR__).'/config/services.php')) 
            (require $path)($container->withPath($path), $this);
        
    

    protected function configureRoutes(RoutingConfigurator $routes): void
    
        $routes->import('../config/routes/'.$this->environment.'/*.yaml');
        $routes->import('../config/routes/*.yaml');

        if (is_file(\dirname(__DIR__).'/config/routes.yaml')) 
            $routes->import('../config/routes.yaml');
         elseif (is_file($path = \dirname(__DIR__).'/config/routes.php')) 
            (require $path)($routes->withPath($path), $this);
        
    

【讨论】:

【参考方案3】:

Symfony 在 GitHub 上有一个演示项目,非常适合检查此类更改,而无需创建新的本地项目。

只需查看reworked Kernel.php 并更新整个内容,而不仅仅是RoutingConfiguration 会导致其他找不到路由的错误。

【讨论】:

以上是关于Symfony 5.1 弃用 RouteCollectionBuilder -> RoutingConfigurator的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2.8:ResourceInterface::isFresh() 自 2.8 起已弃用

在 Symfony 2(.7) 中禁用已弃用的警告

Symfony 4.4 metadata_cache_driver 配置键弃用通知

sonata AdminBlockServiceInterface 弃用,以明确安装 symfony 2.8 + sonata 3.10

如何使用 admin-bundle 处理 Symfony 4 中的 perPageOptions 弃用?

如何解决弃用警告“方法 to_hash 已弃用并将在 Rails 5.1 中删除”