我为我托管/开发的多个网站撰写了一个小型简报包。该通讯从不同项目的新闻通讯源中获取收件人。可能是一个csv文件,可能是一个数据库,......
所以在我的控制器中,我想到写一个NewsletterQueueImportModel()
,当按下按钮时调用它{#1;导入"。
...
$import = new NewsletterQueueImportModel();
$subscribers = $import->getSubscribers($this->getDoctrine());
...
但是,此文件仍随我的包一起提供,并在vendor文件夹中。所以我需要在每个项目的基础上更改此文件。
use AppBundle
而不是use NewsletterBundle
- 缺点:所有项目都需要命名为AppBundle,我觉得它设计很差我考虑过注册服务或类似的东西,但我真的不知道最好的方法。那么创建一个捆绑包所依赖的文件的最佳方法是什么?但是项目与项目的区别是什么?
答案 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中创建一个基类(包含对所有项目都相同的内容(用于导入))
然后在站点端扩展它?