Symfony 3.3 — Аргумент Services.yml (ResponseFactory) — параметр, передаваемый в виде строки вместо объекта

Ошибка

Здравствуйте, я получаю следующую ошибку:

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 объект, а не строка).

Services.yml Вход

В 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 вопроса:

  1. Что я делаю неправильно? (Я предполагаю, что это то, как я ссылаюсь на вещи в services.yml).
  2. Что делает символ @? Делая предположение, я думаю, что он говорит коду создать экземпляр объекта класса, на который ссылаются, а не просто использовать строку. Это верно?

1

Решение

За Symfony 3.3+

Похоже, вы пытаетесь передать интерфейсы. Вместо этого следует использовать конкретный экземпляр.

Вы пробовали автопроводку с псевдонимом?

# services.yml

services:
ApiExceptionBundle\YourResponseFactory: ~
ApiExceptionBundle\Component\Factory\ResponseFactoryInterface:
alias: ApiExceptionBundle\YourResponseFactory

ApiExceptionBundle\EventListener\ApiExceptionSubscriber:
autowire: true

С автообнаружением PSR-4

Или вы можете использовать Автообнаружение PSR-4:

# services.yml

services:
_defaults:
autowire: true

ApiExceptionBundle\: ~
resource: ../ # path to ApiExceptionBundle directory

ApiExceptionBundle\Component\Factory\ResponseFactoryInterface:
alias: ApiExceptionBundle\YourResponseFactory

Symfony 3.4+

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

# services.yml

services:
_defaults:
autowire: true

ApiExceptionBundle\: ~
resource: ../ # path to ApiExceptionBundle directory
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]