Symfony Bundle, которому нужен файл, который отличается для каждого проекта - PullRequest
0 голосов
/ 02 мая 2018

Я написал небольшой пакет рассылки для нескольких сайтов, для которых я размещаю / разрабатываю. Информационный бюллетень выбирает получателей из источника информационного бюллетеня, который отличается от проекта к проекту. Может быть CSV-файл, может быть база данных, ...

Итак, в моем контроллере я думал о написании NewsletterQueueImportModel(), который вызывается при нажатии кнопки «импорт».

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

Однако этот файл все еще поставляется с моим комплектом и в папке vendor. Поэтому мне нужно изменить этот файл для каждого проекта.

  1. Переопределить файл, но как? Я не думаю, что это возможно.
  2. Удалите файл из самого пакета новостных рассылок и обратитесь к AppBundle / NewsletterQueueImportModel (например, use AppBundle вместо use NewsletterBundle - недостатки: все проекты должны называться AppBundle, и я считаю, что это плохой дизайн

Я думал о регистрации службы или о чем-то в этом роде, но я действительно не знаю, как это сделать. Итак, каков наилучший способ создания файла, от которого зависит комплект, но который отличается от проекта к проекту?

1 Ответ

0 голосов
/ 02 мая 2018

Ну, я делал что-то похожее, но с представлениями.

Итак, у меня было 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;
    }
}

Extension

  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']);
        }
    }

Я не уверен, подойдет ли это вашей ситуации, но для меня это кажется наиболее удобным способом управления вещами в пакетах, который зависит от проектов.

Также вы можете попытаться сделать один базовый класс в комплекте (который содержит вещи, которые будут одинаковыми для всех проектов (для импорта))

А затем расширить его в сторону сайта?

...