Symfony 4.1 - для одиночной службы вручную требуется _defaults: public: true - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть следующий файл services.yaml: # Этот файл является точкой входа для настройки ваших собственных сервисов.# Файлы в подкаталоге packages / настраивают ваши зависимости.

# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    locale: 'en'

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones

    App\Service\Processor\TestClauses:
        public: true


    App\Service\Processor\Factory:
        arguments:
          - 'App\Service\Processor\TestClauses'
          -
            - 'MilkProductionProcessor'

т.е.Я рад, что все подключено автоматически, но этот сервис требует ввода в качестве массива.

Это не сработает, если я не сделаю все сервисы общедоступными.Мое понимание документации https://symfony.com/doc/4.1/service_container.html#public-versus-private-services заключается в том, что мне просто нужно сделать службы общедоступными, которые я хочу внедрить вручную

«Корневая служба» внедряется в команду.Когда я запускаю эту команду:

1) С помощью services.yaml я получаю

[WARNING] Some commands could not be registered:                               

In Factory.php line 15:

  Argument 1 passed to App\Service\Processor\Factory::__construct() must impl  
  ement interface App\Service\Processor\TestClausesInterface, string given, c  
  alled in /home/jochen/projects/freshagenda/symfony/var/cache/dev/Container7  
  4x3zkp/getProcessFilesCommandService.php on line 16                          




  There are no commands defined in the "app" namespace.  

  Did you mean this?                                     
      doctrine:mapping       

2) Когда я выполняю службы: _defaults: public true

itдвижется вперед

1 Ответ

0 голосов
/ 10 декабря 2018
App\ServiceThatNeedsArrayAsInput:
    arguments:
       $array: ...

Все остальное может быть подключено и настроено автоматически.В конструкторе ServiceThatNeedsArrayAsInput вы должны получить это $array от аргументов - отличие от более ранних версий заключается в том, что вы явно указываете, к какой переменной вы хотите привязать аргумент, определенный в services.yml

// ServiceThatNeedsArrayAsInput.php 
public function __construct(array $array) {} // Only array from arguments
public function __construct(array $array, AutowiredService $service) {} // Just add it here and DI will autoinject it, no need to change services.yml 

Ваш пример

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

App\Service\Processor\Factory:
    arguments:
      $array: ['MilkProductionProcessor']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...