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