Я написал небольшой пакет информационных бюллетеней для нескольких сайтов, на которых я размещаю / разрабатываю. Информационный бюллетень выбирает получателей из источника информационного бюллетеня, который отличается от проекта к проекту. Это может быть файл csv, может быть база данных, ...
Итак, в моем контроллере я подумал о написании NewsletterQueueImportModel()
, который вызывается при нажатии кнопки «импорт».
...
$import = new NewsletterQueueImportModel();
$subscribers = $import->getSubscribers($this->getDoctrine());
...
Однако этот файл по-прежнему поставляется с моим комплектом и в папке поставщика. Поэтому мне нужно изменять этот файл для каждого проекта.
use AppBundle
вместо use NewsletterBundle
- недостатки: все проекты должны называться AppBundle, и я считаю, что это плохой дизайнЯ думал о регистрации службы или чего-то в этом роде, но я действительно не знаю, как это сделать лучше всего. Итак, как лучше всего создать файл, от которого зависит пакет, но который отличается от проекта к проекту?
Что ж, я делал нечто подобное, но с представлениями.
Итак, у меня было 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']);
}
}
Я не уверен, что это подойдет вашей ситуации, но мне кажется, что это наиболее удобный способ управления вещами в пакетах, который зависит от проектов.
Также вы можете попробовать создать один базовый класс в пакете (который содержит вещи, которые будут одинаковыми для всех проектов (для импорта))
А затем расширить его в сторону сайта?
Привет, я думаю, что первое решение - это немного излишне. Расширяющиеся решения кажутся более плавными, но это не решает того, что NewsletterBundle зависит от «AppBundle», который должен называться AppBundle во всех проектах. В настоящее время я ищу, существует ли файл в проекте. Если это так, я вызываю его через
$import = new \AppBundle\Model\NewsletterQueueImportModel();
, если нет, я использую запасной вариант. Это обходной путь, но на самом деле он не решает его.