Symfony4 - 参数太少,无法运行 App\Manager\ImageManager::__construct



我想在我的 services.yaml 中为我的 ImageManager 获取一个参数.php但它不起作用,我无法解决此错误。

这是错误:

类型错误:参数太少,无法正常工作 App\Manager\ImageManager::__construct(), 0 在第 14 行传入 C:\wamp64\www\SymfonyAPI\var\cache\dev\ContainerZxFSS5S\getImageManagerService.php

服务.yaml

parameters:
images_directory: '%kernel.project_dir%/public/uploads/images/'
...
services:
_defaults:
autowire: false
autoconfigure: false
public: true
AppManagerImageManager:
arguments:
$targetDir: '%images_directory%'

如果对于自动连线和自动配置,我输入 true,我有此错误:

运行时异常 无法自动连线服务"App\Manager\ImageManager":方法"__construct()"的参数"$targetDir"的类型为"App\Manager\targetDir",但找不到此类。

图像管理器.php

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

全方位服务.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
AppManagerImageManager:
arguments:
$targetDir: '%images_directory%'
AppEventListenerImageUploadListener:
tags:
- { name: doctrine.event_listener, event: prePersist }
- { name: doctrine.event_listener, event: preUpdate } 
App:
resource: '../src/*'
exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
AppController:
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' }

您正在添加一种targetDir类型,并且您的应用程序认为这是某种类,您可以在错误has type "AppManagertargetDir" but this class was not found.中看到,如果您使用的是php 7或不将任何东西作为类型,只需将targetDir替换为string,即使您具有自动连线真/假,它也可以工作,因为:

AppManagerImageManager:
arguments:
$targetDir: '%images_directory%'

通过@kunicmarko20来澄清答案

服务构造函数需要AppManagertargetDir对象作为$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:
AppBundleMyDirectoryObject:
parameters: ['a']
AppBundleMyDirectoryObject:
parameters: ['b']

symfony用作服务定义的最终结果将是。

new AppBundleMyDirectoryObject('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}'
AppController:
resource: '../src/Controller'
tags: ['controller.service_arguments']
#... Your manual service definitions below here.
AppManagerImageManager:
arguments:
$targetDir: '%images_directory%'
AppEventListenerImageUploadListener:
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' }

最新更新