将symfony3.4与bundle扩展名一起升级到symfony4 flex

时间:2018-04-19 17:35:08

标签: symfony dependency-injection upgrade symfony4

我在symfony 3.4中有一个项目,然后我尝试升级到symfony 4 / flex。 问题是在我的代码中有3个包TBAdminBundle,TBPlatformBundle和TBSecurityBundle。

对于每个捆绑包,还有Extension类例。

    class TBPlatformExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new PlatformConfiguration();
        $config = $this->processConfiguration($configuration, $configs);

    $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('services.yml');

    if (!in_array(strtolower($config['db_driver']), array('custom', 'mongodb', 'orm'))) {
        throw new \InvalidArgumentException(sprintf('Invalid db driver "%s".', $config['db_driver']));
    }

    if ('custom' !== $config['db_driver']) {
        $loader->load(sprintf('%s.yml', $config['db_driver']));
        $def = new Definition('Doctrine\ORM\EntityManager', array('%tb_notification.model_manager_name%'));
        $def->setPublic(false);

        if (method_exists($def, 'setFactory')) {
            $def->setFactory(array(new Reference('doctrine'), 'getManager'));
        } else {
            // To be removed when dependency on Symfony DependencyInjection is bumped to 2.6
            $def->setFactoryService('doctrine');
            $def->setFactoryMethod('getManager');
        }

        $container->setDefinition('tb_notification.entity_manager', $def);
    }

    foreach (array('form', 'command', 'events') as $basename) {
        $loader->load(sprintf('%s.yml', $basename));
    }

    $container->setParameter('tb_notification.model_manager_name', $config['model_manager_name']);

    $container->setParameter('tb_notification.form.notification.type', $config['form']['notification']['type']);
    $container->setParameter('tb_notification.form.notification.name', $config['form']['notification']['name']);

    $container->setParameter('tb_trip.form.trip.type', $config['form']['trip']['type']);
    $container->setParameter('tb_trip.form.trip.name', $config['form']['trip']['name']);

    $container->setParameter(
        'tb_notification.form.delete_notification.type',
        $config['form']['delete_notification']['type']
    );
    $container->setParameter(
        'tb_notification.form.delete_notification.name',
        $config['form']['delete_notification']['name']
    );

    $container->setParameter('tb_trip.form.trip.update_trip.type', $config['form']['update_trip']['type']);
    $container->setParameter('tb_trip.form.trip.update_trip.name', $config['form']['update_trip']['name']);

    $container->setParameter('tb_action.form.action.type', $config['form']['action']['type']);
    $container->setParameter('tb_action.form.action.name', $config['form']['action']['name']);

    $container->setParameter('tb_place.form.place.type', $config['form']['place']['type']);
    $container->setParameter('tb_place.form.place.name', $config['form']['place']['name']);

    $container->setParameter('tb_action_privacy.form.action.type', $config['form']['privacy']['type']);
    $container->setParameter('tb_action_privacy.form.action.name', $config['form']['privacy']['name']);

    $container->setParameter('tb_notification.model.notification.class', $config['class']['model']['notification']);
    $container->setParameter('tb_trip.model.trip.class', $config['class']['model']['trip']);
    $container->setParameter('tb_like.model.like.class', $config['class']['model']['like']);
    $container->setParameter('tb_helpful.model.helpful.class', $config['class']['model']['helpful']);
    $container->setParameter('tb_action.model.action.class', $config['class']['model']['action']);
    $container->setParameter('tb_budget.model.class', $config['class']['model']['budget']);
    $container->setParameter('tb_action.model.action_privacy_policy.class', $config['class']['model']['privacy']);
    $container->setParameter('tb_rating.model.rating.class', $config['class']['model']['vote']);
    $container->setParameter('tb_place.model.place.class', $config['class']['model']['place']);
    $container->setParameter('tb_destination.model.destination.class', $config['class']['model']['destination']);

    // parameters for hydrating object with doctrine
    $container->setParameter('tb_action.hydrate.action', $config['hydrate']['action']);
    $container->setParameter('tb_google.key', $config['google']['key']);
    $container->setParameter('compare_text.default_percent', $config['compare']['text']);

    $container->setAlias('tb_trip.manager.trip', $config['service']['manager']['trip']);
    $container->setAlias('tb_like.manager.post', $config['service']['manager']['like']);
    $container->setAlias('tb_helpful.manager.post', $config['service']['manager']['helpful']);
    $container->setAlias('tb_budget_manager', $config['service']['manager']['budget']);
    $container->setAlias('tb_place_manager', $config['service']['manager']['place']);
    $container->setAlias('tb_destination_manager', $config['service']['manager']['destination']);
    $container->setAlias('tb_compare_string', 'similar_text.manager');
    $container->setAlias('foursquare.manager', 'foursquare.manager.default');
    $container->setAlias('tb_action.form_factory', $config['service']['form_factory']['action']);
    $container->setAlias('tb_place.form_factory', $config['service']['form_factory']['place']);
    $container->setAlias('tb_action_privacy.form_factory', $config['service']['form_factory']['privacy']);
    $container->setAlias(
        'tb_notification.form_factory.notification',
        $config['service']['form_factory']['notification']
    );
    $container->setAlias('tb_trip.form_factory', $config['service']['form_factory']['trip']);
    $container->setAlias(
        'tb_notification.form_factory.notification_delete',
        $config['service']['form_factory']['delete_notification']
    );


    $container->setAlias('tb_action.customer_repository', 'tb_action.customer_repository_default');
    $container->setAlias('tb_notification.customer_repository', 'tb_notification.customer_repository_default');
    $container->setAlias('tb_trip.customer_repository', 'tb_trip.customer_repository_default');
}

}

根据文件

"在4.0之前的Symfony版本中,建议使用捆绑包组织您自己的应用程序代码。不再推荐使用此选项,只应使用捆绑包在多个应用程序之间共享代码和功能。"

我知道这对symfony4 / flex来说已经不可能了 如何重写此选项以匹配flex配置?

感谢

2 个答案:

答案 0 :(得分:1)

我的建议是逐步迁移您的捆绑包。

1.将捆绑包​​放在SF4应用程序的src中,如下所示:

src/ 
   Bundle/ 
       TBAdminBundle 
       TBPlatformBundle 
       TBSecurityBundle 
   Command    
   Controller     
   Entity
    ...

2.使用Composer PSR-4自动加载它们(composer.json)

"autoload" : {
    "psr-4" : {
        "App\\" : "src/",
        "TBAdminBundle\\" : "src/Bundle/TBAdminBundle/",
        "TBPlatformBundle\\" : "src/Bundle/TBPlatformBundle/",
        "TBSecurityBundle\\" : "src/Bundle/TBSecurityBundle/",
        ...

3.从App Services autoload(config / services.yaml)

中排除它们
App\:
    resource: '../src/*'
    # you can exclude directories or files
    # but if a service is unused, it's removed anyway
    exclude: '../src/{Entity,Migrations,Repository,Bundle}'

4.验证新安装/配置

虽然SF4对于核心应用程序应用程序来说是捆绑较少,但它支持bundle ...只需检查您是否从这些捆绑包中解析所有已弃用的函数

5.开始逐步迁移捆绑代码:

提示:

  • 修改您的配置/参数以使用ENV和services.yaml参数 因此,您可以将大多数配置变量/参数传输到应用程序级别并轻松共享它们......

  • 为了简单和易于维护,您可以将所有服务定义从Extention类移到services.yaml中。

  • 您将随着时间的推移对捆绑代码进行脱脂,并获得新SF4服务可用性和方向的经验。

答案 1 :(得分:0)

该说明告诉您它不再是推荐,但并不意味着您应该完全重构代码。如果您已将代码打包为捆绑包,则应仅删除已弃用的代码。一般来说,只有在跨项目可重用的情况下才能将代码打包在捆绑包中。