【问题标题】:Symfony Bundle that needs a file that differs per projectSymfony Bundle 需要每个项目不同的文件
【发布时间】:2018-05-02 12:34:05
【问题描述】:

我已经为我托管/开发的多个网站编写了一个小型通讯包。时事通讯从不同项目的时事通讯源中获取收件人。可以是 csv 文件,也可以是数据库,...

所以在我的控制器中,我考虑编写一个NewsletterQueueImportModel(),它在点击“导入”按钮时被调用。

...
$import = new NewsletterQueueImportModel();
$subscribers = $import->getSubscribers($this->getDoctrine());
...

但是,此文件仍随我的捆绑包和供应商文件夹一起提供。所以我需要根据每个项目更改这个文件。

  1. 覆盖文件,但如何?我认为这是不可能的。
  2. 从时事通讯包本身中删除文件并参考 AppBundle/NewsletterQueueImportModel(例如 use AppBundle 而不是 use NewsletterBundle - 缺点:所有项目都需要命名为 AppBundle,我觉得它的设计很糟糕

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

【问题讨论】:

    标签: symfony bundle


    【解决方案1】:

    嗯,我一直在做类似的事情,但有观点。

    所以我在一个捆绑包上运行了 2 个站点 - 在一个站点中,我需要查看一些我在其他站点中不需要的部分。

    我设法通过配置做到了这一点。

    1) 在您的每个站点 - app/config/config.yml 中,您可以定义参数。就我而言,它类似于

    reviews_admin:
        views:
            table_favorite_block: true
            table_brand_view: true
            table_image_view: true
    

    2) 然后在捆绑包中,您必须创建名为 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 中创建一个基类(其中包含所有项目(对于导入)都相同的内容)

    然后在站点端扩展它?

    【讨论】:

    • 嗨,我认为第一个解决方案有点矫枉过正。扩展的解决方案似乎更流畅,但它并没有解决 NewsletterBundle 依赖于“AppBundle”,它必须在所有项目中命名为 AppBundle。目前我正在查看项目中是否存在文件。如果是,我通过$import = new \AppBundle\Model\NewsletterQueueImportModel(); 调用它,如果不是,我使用后备。这是一种解决方法,但并不能很好地解决它。
    猜你喜欢
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多