Symfony Bundle需要的文件因项目而异

Symfony Bundle需要的文件因项目而异,symfony,bundle,Symfony,Bundle,我已经为我主持/开发的多个站点编写了一个小型新闻稿包。新闻稿从不同项目的新闻稿源获取收件人。可能是csv文件,可能是数据库 因此,在我的控制器中,我考虑编写一个newsletteQueueImportModel(),点击“导入”按钮时调用它 但是,此文件仍然与我的捆绑包一起交付,并保存在供应商文件夹中。所以我需要根据每个项目更改此文件 覆盖文件,但如何覆盖?我认为这是不可能的 从新闻稿包本身中删除文件,并参考AppBundle/NewsletteQueueImportModel(例如,使用App

我已经为我主持/开发的多个站点编写了一个小型新闻稿包。新闻稿从不同项目的新闻稿源获取收件人。可能是csv文件,可能是数据库

因此,在我的控制器中,我考虑编写一个
newsletteQueueImportModel()
,点击“导入”按钮时调用它

但是,此文件仍然与我的捆绑包一起交付,并保存在供应商文件夹中。所以我需要根据每个项目更改此文件

  • 覆盖文件,但如何覆盖?我认为这是不可能的
  • 从新闻稿包本身中删除文件,并参考AppBundle/NewsletteQueueImportModel(例如,
    使用AppBundle
    而不是
    使用新闻稿包
    )-缺点:所有项目都需要命名为AppBundle,我觉得这是一个糟糕的设计

  • 我想注册一个服务或类似的东西,但我真的不知道最好的方法。那么,创建一个捆绑包所依赖但因项目而异的文件的最佳方法是什么呢?

    嗯,我一直在做类似的事情,但都是使用视图

    所以我有两个站点在一个捆绑包上运行——在一个站点中,我需要查看其他站点中不需要的部分

    我通过配置成功地做到了这一点

    1) 在每个站点-app/config/config.yml中,您可以定义参数。在我的情况下,是这样的

    reviews_admin:
        views:
            table_favorite_block: true
            table_brand_view: true
            table_image_view: true
    
    2) 然后在bundle中,您必须创建名为DependencyInjection的文件夹,其中包含2个文件。配置和包扩展

        class Configuration implements ConfigurationInterface
    {
        /**
         * {@inheritdoc}
         */
        public function getConfigTreeBuilder()
        {
            $treeBuilder = new TreeBuilder();
            $rootNode = $treeBuilder->root('reviews_admin', 'array');
    
            $rootNode
                ->children()
                ->arrayNode('views')
                ->children()
                ->booleanNode('table_favorite_block')->defaultTrue()->end()
                ->booleanNode('table_brand_view')->defaultTrue()->end()
                ->booleanNode('table_image_view')->defaultTrue()->end()
                ->end()
                ->end()
                ->end();
    
            return $treeBuilder;
        }
    }
    
    延伸

      class ReviewsAdminExtension extends Extension
        {
            /**
             * {@inheritdoc}
             */
            public function load(array $configs, ContainerBuilder $container)
            {
                $configuration = new Configuration();
                $config = $this->processConfiguration($configuration, $configs);
    
                $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
                $loader->load('services.yml');
    
                $container->setParameter('reviews_admin_view', $config['views']);
            }
        }
    
    我不确定这是否适合您的情况,但对我来说,这似乎是一种最方便的方式来管理捆绑包中的东西,这取决于项目

    您还可以尝试在bundle中创建一个基类(其中包含所有项目(对于导入)都相同的内容)


    然后在站点端进行扩展?

    您好,我认为第一个解决方案有点过头了。扩展解决方案看起来更平滑,但它并不能解决bundle依赖于“AppBundle”的问题,该“AppBundle”必须在所有项目中命名为AppBundle。目前我正在查看项目中是否存在文件。如果是,我通过
    $import=new\AppBundle\Model\newsletteQueueImportModel()调用它如果不是,我使用回退。这是一个解决办法,但并不能很好地解决问题。
    
      class ReviewsAdminExtension extends Extension
        {
            /**
             * {@inheritdoc}
             */
            public function load(array $configs, ContainerBuilder $container)
            {
                $configuration = new Configuration();
                $config = $this->processConfiguration($configuration, $configs);
    
                $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
                $loader->load('services.yml');
    
                $container->setParameter('reviews_admin_view', $config['views']);
            }
        }