Я использую 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.
Кто-нибудь знает, почему аргумент не будет установлен в сгенерированном кеше?




Из документация у вас может быть:
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 (); Почему это там не учтено?
Я не понимаю. Если вы хотите использовать эту службу в другом, вам необходимо добавить зависимость в конструктор других служб.
да это сделано в 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'
извини, я не знаю как его отформатировать
Сейчас я ввожу на заводе сервисный контейнер и получаю его прямо оттуда .... Это работает, но похоже, что это не работает с заводской комбинацией.
В 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, там есть документы, которые я использую.
Привет, документация! = Соглашение. Я бы поискал код на Github в пакетах Symfony +: github.com/symfony/symfony/… Я использую Symfony в течение 5 лет, делаю пакеты, приложения над ним, но я никогда не видел использования «аргументов» явно в конфигурациях Yaml.
Танки за вашу помощь
Пожалуйста! Если вы переносите большие куски кода (более 5 часов работы) из Silex в Symfony, вы можете использовать Rector для этого (github.com/rectorphp/rector)
Подсказка: кеш очищен.