我想在我的 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' }