Здравствуйте, я получаю следующую ошибку:
Type error: Argument 2 passed to ApiExceptionBundle\EventListener\ApiExceptionSubscriber::__construct() must implement interface ApiExceptionBundle\Component\Factory\ResponseFactoryInterface, string given, called in C:\htdocs\projects\myproject\var\cache\dev\appDevDebugProjectContainer.php on line 4293
Как видно из стека вызовов, вторым параметром является строка. (Но на самом деле это должен быть объект, созданный такого типа).
at ApiExceptionSubscriber->__construct(true, 'ApiExceptionBundle\\Component\\Factory\\ResponseFactoryInterface', true, array('/admin/'))
in appDevDebugProjectContainer.php (line 4293)
Абонент находится по адресу MyProject \ SRC \ ApiExceptionBundle \ EventListener \ ApiExceptionSubscriber.php и его определение конструктора следующее:
public function __construct($debug, ResponseFactoryInterface $responseFactory, $enabled = true, $excludedPaths = [])
(Обратите внимание, что он ожидает ResponseFactoryInterface объект, а не строка).
В MyProject / SRC / ApiExceptionBundle / Ресурсы / конфигурации / services.yml, соответствующая запись ниже:
ApiExceptionBundle\EventListener\ApiExceptionSubscriber:
arguments:
$responseFactory: 'ApiExceptionBundle\Component\Factory\ResponseFactoryInterface'
Из исходного примера, который я использую, я вижу, что на самом деле @ условное обозначение в начале $ responseFactory назначение аргумента в services.yml файл.
Исходный код, который я использую в качестве примера, имеет services.yml запись похожа на эту:
$responseFactory: '@ApiExceptionBundle\Component\Factory\ResponseFactoryInterface'
К сожалению, когда я пытаюсь добавить @ условное обозначение в моем коде (как выше), это дает мне эту ошибку:
PHP Fatal error: Uncaught Symfony\Component\DependencyInjection\Exception\RuntimeException: Cannot dump de
finition because of invalid class name ('@ApiExceptionBundle\\Component\\Factory\\ResponseFactory') in C:\h
tdocs\projects\myproject\vendor\symfony\symfony\src\Symfony\Component\DependencyInjection\Dumper\PhpDumper.ph
p:1568
Итак, у меня есть 2 вопроса:
Похоже, вы пытаетесь передать интерфейсы. Вместо этого следует использовать конкретный экземпляр.
Вы пробовали автопроводку с псевдонимом?
# services.yml
services:
ApiExceptionBundle\YourResponseFactory: ~
ApiExceptionBundle\Component\Factory\ResponseFactoryInterface:
alias: ApiExceptionBundle\YourResponseFactory
ApiExceptionBundle\EventListener\ApiExceptionSubscriber:
autowire: true
Или вы можете использовать Автообнаружение PSR-4:
# services.yml
services:
_defaults:
autowire: true
ApiExceptionBundle\: ~
resource: ../ # path to ApiExceptionBundle directory
ApiExceptionBundle\Component\Factory\ResponseFactoryInterface:
alias: ApiExceptionBundle\YourResponseFactory
поскольку Symfony 3.4 Вы можете опустить псевдоним благодаря автоматическому сглаживанию для единый сервис из вашего кода.
# services.yml
services:
_defaults:
autowire: true
ApiExceptionBundle\: ~
resource: ../ # path to ApiExceptionBundle directory
Других решений пока нет …