Symfony 3.4 не устанавливает аргументы, когда я настраиваю его в конфигурации службы yaml

Я использую Symfony 3.4 и пытаюсь перенести на него приложение Silex. Поэтому я не могу использовать автоматическое подключение Symfony.

Мой service.yml выглядит так

services:
# default configuration for services in *this* file
 _defaults:
 # automatically injects dependencies in your services
  autowire: false
  # automatically registers your services as commands, event subscribers, etc.
  autoconfigure: false
  # this means you cannot fetch services directly from the container via $container->get()
  # if you need to do this, you can override this setting on individual services
  public: false

  audit.persister.base:
   class: MyBundle\Security\Audit\Persister\ChainedEntityTrailPersister
   calls:
    - method: 'addPersister'
      argument:
       - '@audit.persister_elasticsearch'

Скомпилированный класс кеширования выглядит так:

$this->services['audit.persister.base'] = $instance = new \MyBundle\Security\Audit\Persister\ChainedEntityTrailPersister();

$instance->addPersister();

Я получил ошибку:

 Type error: Too few arguments to function MyBundle\Security\Audit\Persister\ChainedEntityTrailPersister::addPersister(), 0 passed in /var/www/html/api/var/cache/local/ContainerAdjsiif/getAudit_Persister_BaseService.php on line 14 and exactly 1 expected

Ошибка правильная. Поскольку создатель кешированного класса не предоставляет аргумент, который я установил в config.

Кто-нибудь знает, почему аргумент не будет установлен в сгенерированном кеше?

Подсказка: кеш очищен.

RalfGe 22.11.2018 10:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
311
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из документация у вас может быть:

  audit.persister.base:
     class: MyBundle\Security\Audit\Persister\ChainedEntityTrailPersister
     calls:
         - method: 'addPersister'
          arguments:
               - '@audit.persister_elasticsearch'

arguments с s на конце.

Спасибо, это помогает, но теперь у меня есть служба, которая нуждается в этой службе так же: $ a = new \ MyBundle \ Security \ Audit \ Persister \ ChainedEntityTrailPersist‌ er (); $ a-> addPersister (); Почему это там не учтено?

RalfGe 22.11.2018 10:45

Я не понимаю. Если вы хотите использовать эту службу в другом, вам необходимо добавить зависимость в конструктор других служб.

G1.3 22.11.2018 10:55

да это сделано в service.yml как orm.event_manager.base: factory: 'MyBundle\ORM\Factory\ORMEventManagerProto:createBase' class: Doctrine\Common\EventManager arguments: - '@orm.audit.handler' - '@orm.audit.changeset_normalizer' - '@validation_manager' - '@annotations.reader' - '@acl_manager' - '@property_accessor' - '@services.propertyExpansion' - '@Doctrine\Common\Cache\ChainCache' - '@audit.persister.base'

RalfGe 22.11.2018 11:06

извини, я не знаю как его отформатировать

RalfGe 22.11.2018 11:09

Сейчас я ввожу на заводе сервисный контейнер и получаю его прямо оттуда .... Это работает, но похоже, что это не работает с заводской комбинацией.

RalfGe 22.11.2018 11:23

В Symfony принято писать вызовы в одну строку:

services:
    audit.persister.base:
        class: MyBundle\Security\Audit\Persister\ChainedEntityTrailPersister
        calls:
            - ['addPersister', ['@audit.persister_elasticsearch']]

Также вы можете использовать PHPStorm с Плагин Symfony для автозаполнения. Благодаря этому вы избавлены от опечаток и в основном пишет за вас :)

Привет, спасибо за повтор. Откуда у вас эта информация о съезде. Когда вы посмотрите в symfony.com/doc/3.4/service_container/calls.html, там есть документы, которые я использую.

RalfGe 26.11.2018 08:48

Привет, документация! = Соглашение. Я бы поискал код на Github в пакетах Symfony +: github.com/symfony/symfony/… Я использую Symfony в течение 5 лет, делаю пакеты, приложения над ним, но я никогда не видел использования «аргументов» явно в конфигурациях Yaml.

Tomas Votruba 26.11.2018 09:55

Танки за вашу помощь

RalfGe 26.11.2018 13:43

Пожалуйста! Если вы переносите большие куски кода (более 5 часов работы) из Silex в Symfony, вы можете использовать Rector для этого (github.com/rectorphp/rector)

Tomas Votruba 26.11.2018 13:58

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