Symfony4 - слишком мало аргументов для функции App \ Manager \ ImageManager :: __ construct (), 0 передано и ровно 1 ожидается

Я пытаюсь получить аргумент в моем services.yaml для моего ImageManager.php, но он не работает, и я не могу решить эту ошибку.

вот ошибка:

Ошибка типа: слишком мало аргументов для функции App \ Manager \ ImageManager :: __ construct (), 0 передано в C: \ wamp64 \ www \ SymfonyAPI \ var \ cache \ dev \ ContainerZxFSS5S \ getImageManagerService.php в строке 14 и ожидается ровно 1

services.yaml

parameters:
    images_directory: '%kernel.project_dir%/public/uploads/images/'
...

services:
    _defaults:
        autowire: false
        autoconfigure: false
        public: true

App\Manager\ImageManager:
    arguments:
        $targetDir: '%images_directory%'

если для автонастройки и автоконфигурации я верю, что у меня есть эта ошибка:

RuntimeException Не удается выполнить автоматическое подключение службы «App \ Manager \ ImageManager»: аргумент «$ targetDir» метода «__construct ()» имеет тип «App \ Manager \ targetDir», но этот класс не найден.

ImageManager.php

private $targetDir;

public function __construct(targetDir $targetDir) 
{
    $this->targetDir = $targetDir;
}

Полный services.yml

parameters:
    liip_imagine.mozjpeg.binary: /mozjpeg/cjpeg.exe
    images_directory: '%kernel.project_dir%/public/uploads/images/'
    mozjpg_directory: '%kernel.project_dir%/mozjpg'
    locale: 'en'

services:
    _defaults:
        autowire: false
        autoconfigure: false
        public: true

App\Manager\ImageManager:
    arguments:
        $targetDir: '%images_directory%'

App\EventListener\ImageUploadListener:
    tags:
        - { name: doctrine.event_listener, event: prePersist }
        - { name: doctrine.event_listener, event: preUpdate } 

App\:
    resource: '../src/*'
    exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'

App\Controller\:
    resource: '../src/Controller'
    tags: ['controller.service_arguments']

app.post_processor.my_custom_post_processor:
    class: '%kernel.project_dir%/src/Controller/ImageController.php'
    tags:
        - { name: 'liip_imagine.filter.post_processor', post_processor: 'mozjpeg' }

person Morgan Millet    schedule 24.02.2018    source источник
comment
Не понимаю как, но я просто клонирую свой проект, который был на github, и все работает. Простите, что заставил вас зря потратить время, в любом случае спасибо.   -  person Morgan Millet    schedule 24.02.2018


Ответы (2)


Вы добавляете тип targetDir, и ваше приложение думает, что это какой-то класс, и вы можете видеть, что в вашей ошибке has type "App\Manager\targetDir" but this class was not found. просто замените targetDir на string, если вы используете php 7, или ничего не помещайте в качестве типа, и он будет работать, даже если у вас autowire true / false из-за:

App\Manager\ImageManager:
    arguments:
        $targetDir: '%images_directory%'
person kunicmarko20    schedule 24.02.2018

Чтобы уточнить ответ @ kunicmarko20

Конструктору службы требуется объект App\Manager\targetDir в качестве аргумента $targetDir, но вы предоставляете своей службе строку в качестве аргумента $targetDir.

Вам необходимо изменить конструктор службы, чтобы он выглядел как один из следующих.

PHP 7.x

public function __construct(string $targetDir)

PHP 5.x

public function __construct($targetDir) 

Обновление с изменениями конфигурации

Вторая проблема заключается в том, что в вашем каталоге классов обслуживания включено прототипирование. Это заставляет Symfony переопределить ваше ручное определение службы с помощью определения службы-прототипа.

Итак, что происходит, когда ваше ручное определение службы создается, а затем переопределяется автоматически настроенным определением.

Определение прототипа:

App\:
    resource: '../src/*'
    exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'

Поскольку он находится ниже вашего ручного определения сервиса, Symfony использует его вместо вашего ручного определения.

Например, если я напишу

services:
   AppBundle\MyDirectory\Object:
      parameters: ['a']

   AppBundle\MyDirectory\Object:
      parameters: ['b']

Конечным результатом того, что symfony использует в качестве определения службы, будет.

new AppBundle\MyDirectory\Object('b');

Вам следует изменить свой services.yml на следующее:

parameters:
    liip_imagine.mozjpeg.binary: /mozjpeg/cjpeg.exe
    images_directory: '%kernel.project_dir%/public/uploads/images/'
    mozjpg_directory: '%kernel.project_dir%/mozjpg'
    locale: 'en'

services:
    _defaults:
        autowire: false
        autoconfigure: false
        public: true

    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'

    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    #... Your manual service definitions below here.

    App\Manager\ImageManager:
        arguments:
            $targetDir: '%images_directory%'

    App\EventListener\ImageUploadListener:
        tags:
            - { name: doctrine.event_listener, event: prePersist }
            - { name: doctrine.event_listener, event: preUpdate } 

    app.post_processor.my_custom_post_processor:
        class: '%kernel.project_dir%/src/Controller/ImageController.php'
        tags:
            - { name: 'liip_imagine.filter.post_processor', post_processor: 'mozjpeg' }
person Will B.    schedule 24.02.2018
comment
Спасибо за ответ, но это ничего не меняет, у меня всегда одна и та же ошибка. (У меня php 7.x) - person Morgan Millet; 24.02.2018
comment
@MorganMillet Убедитесь, что вы очищаете кеш Symfony. - person Will B.; 24.02.2018
comment
@MorganMillet, как вы получаете услугу или что вы делаете, чтобы создать указанное сообщение об ошибке? - person Will B.; 24.02.2018
comment
Я вызвал службу из функции в своем контроллере: $ imageManager = $ this- ›container-› get (ImageManager :: class); Я использую Postman, потому что разрабатываю REST API, поэтому, например, я отправляю запрос POST на этот URL: 127.0.0.1: 8000 / images (Мое приложение работает без этой ошибки) Проблема должна исходить из файла services.yaml, но мой код точно такой же, как в документе: symfony.com/doc/current/ - person Morgan Millet; 24.02.2018
comment
Единственное, о чем я могу думать, это то, что у вас может быть настроено прототипирование для ресурса, в котором содержится ваш класс обслуживания, который переопределяет ваше ручное определение службы. Это могло бы объяснить, почему предоставленные аргументы равны 0 и почему autowire попытался предоставить его. Можете ли вы опубликовать свои services.yml и services_dev.yml и скрыть конфиденциальные значения (например, пароли и адреса электронной почты)? - person Will B.; 24.02.2018
comment
@MorganMillet обновил ответ с изменениями конфигурации. - person Will B.; 24.02.2018