Symfony Bundle需要一个每个项目不同的文件

时间:2018-05-02 12:34:06

标签: symfony bundle

我为我托管/开发的多个网站撰写了一个小型简报包。该通讯从不同项目的新闻通讯源中获取收件人。可能是一个csv文件,可能是一个数据库,......

所以在我的控制器中,我想到写一个NewsletterQueueImportModel(),当按下按钮时调用它{#1;导入"。

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

但是,此文件仍随我的包一起提供,并在vendor文件夹中。所以我需要在每个项目的基础上更改此文件。

  1. 覆盖文件,但是如何?我不认为这是可能的。
  2. 从简报包本身删除文件,并参考AppBundle / NewsletterQueueImportModel(例如use AppBundle而不是use NewsletterBundle - 缺点:所有项目都需要命名为AppBundle,我觉得它设计很差
  3. 我考虑过注册服务或类似的东西,但我真的不知道最好的方法。那么创建一个捆绑包所依赖的文件的最佳方法是什么?但是项目与项目的区别是什么?

1 个答案:

答案 0 :(得分:1)

好吧,我一直在做类似但有意见的事情。

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

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

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中创建一个基类(包含对所有项目都相同的内容(用于导入))

然后在站点端扩展它?