#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 настроен на автозагрузку и сброшен?