grabbee
@grabbee

Нужно ли для абстрактного класса применять интерфейс?

Когда я в бандле делаю Интерфейс, затем делаю абстрактный класс с реализацией и применяю к нему этот интерфейс, а потом создаю дочерний наследуя это абстрактный класс, Симфони ругается, что не может найти кандидата, и просит объявить алиас для этого интерфейса явно.

Но ведь инстанс от абстрактного класса не должен создаваться в принципе. И реализация интерфейса в таком случае только одна. Ошибки же быть не должно было.

---

services.yaml
services:
  _defaults:
    autowire: true  
    autoconfigure: true  

  Vendor\SomeBundle\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Examples,Repository,Message}'

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

  Vendor\SomeBundle\Controller\TokenController:
    autowire: false

Вот. Я отключил для него autowire. Но затем пробую в тестах включить, как описал выше. И оно не работает даже в таком виде
services_test.yaml
services:
  _defaults:
    autowire: true 
    autoconfigure: true 
    public: true
 
  Vendor\SomeBundle\Controller\SomeController:
    autowire: true
    arguments:
      $authenticator: Vendor\SomeBundle\Examples\Authenticator
 
  Vendor\SomeBundle\Examples\Authenticator:
    calls:
      - setIdentityClassName: ...

Cannot autowire service "Vendor\SomeBundle\Controller\SomeController": argument "$authenticator" of method "__construct()" references interface "Vendor\SomeBundle\S
ervices\AuthenticatorInterface" but no such service exists. You should maybe alias this interface to the existing "Vendor\SomeBundle\Examples\Authenticator" service.


Папку с кэшем удаляю и следом команду очистки кэша запускаю.

Начитает работать только после
services_test.yaml
Vendor\SomeBundle\Services\AuthenticatorInterface:
    '@Vendor\SomeBundle\Examples\Authenticator'

При этом только одна реализация интерфейса
interface AuthenticatorInterface {}
abstract class AbstractAuthenticator implements AuthenticatorInterface {}
class Authenticator extends AbstractAuthenticator {}
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 1
Дело не в абстрактном классе. Symfony требует явной регистрации реализаций интерфейсов.

Выглядеть это будет примерно так:
services:
  ...
  App/Interfaces/UserRepositoryInterface:
    alias: App/Repositories/UserRepository


Дока
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы