Почему мой контроллер не может видеть добавленную мной службу?

#php #symfony #service #symfony4

#php #symfony #Обслуживание #symfony4

Вопрос:

У меня возникли трудности с добавлением службы / помощника в мой контроллер. Насколько я знаю, начиная с нового Symfony4, он должен автоматически подключать службу, но все равно что-то идет не так. Ошибка, которую я получаю, это:

Исключение InvalidArgumentException

Не удается определить аргумент контроллера для «App Controller KibbleController::index()»: аргумент $ dinoHelper указывает на тип несуществующего класса или интерфейса: «App Service DinoHelper».

Я пытался добавить службу внутри контроллера, используя новый DinoHelper, но с минимальным эффектом.

src/Controller /KibbleController

 namespace AppController;

use AppEntitySimpleKibble;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentFormExtensionCoreTypeSubmitType;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAnnotationRoute;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentFormExtensionCoreTypeTextType;
use SymfonyComponentHttpFoundationException;
use AppServiceDinoHelper;

class KibbleController extends AbstractController
{
    /**
     * @Route "/"
     * @param Request $request
     * @param DinoHelper $dinoHelper
     * @return Response
     */
    public function index(Request $request, DinoHelper $dinoHelper)
    {
        $form = $this->createFormBuilder()
            ->add('Dino', TextType::class)
            ->add('submit', SubmitType::class, ['label' => 'Submit'])
            ->getForm();

        $form->handleRequest($request);

        if ($form->isSubmitted() amp;amp; $form->isValid()) {
            $data = $form->getData();

            $dinoHelper->getKibbleEntity($data['Dino']);
  

src/Service/DinoHelper.php

 <?php

namespace AppService;

use AppEntityDodo;
use AppEntityDilo;
use AppEntityRaptor;

class DinoHelper
{

    public function getKibbleEntity(string $name)
    {
        switch ($name)
        {
            case 'Dodo' :
                $dinoEntity = new Dodo();
                break;
            case 'Dilo' :
                $dinoEntity = new Dilo();
                break;
            case 'Raptor' :
                $dinoEntity = new Raptor();
                break;
        }
        return isset($dinoEntity) ? $dinoEntity : null;

    }
}
  

services.yaml

 # This file is the entry point to configure your own services.
# Files in the packages/ subdirectory configure your dependencies.

# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    locale: 'en'

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    AppController:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones
  

Комментарии:

1. Пожалуйста, покажите ваш services.yml файл

2. Забыл об этом. Добавил ее.

3. Вы могли бы изменить resource: '../src/Controller' на resource: '../src/Controller/*' , чтобы регистрировать контроллеры как службы с соответствующим тегом

4. @Chrzanek Я пробовал, но это не повлияло на это исключение.

5. как происходит автозагрузка ваших классов? Ваш composer настроен на автозагрузку и сброшен?