Пакет Symfony, которому нужен файл, который отличается для каждого проекта

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

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

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

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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
28
1

Ответы 1

Что ж, я делал нечто подобное, но с представлениями.

Итак, у меня было 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();, если нет, я использую запасной вариант. Это обходной путь, но на самом деле он не решает его.

ptmr.io 03.05.2018 09:39

Другие вопросы по теме