Symfony 4.2.3
Récemment mis à jour à partir de la version 3.4 à 4.2.3 et obtenu mon projet fonctionnel, mais lors de la définition automatique d'autoconfigure dans Services.YAML sur true, je recevrai ce message d'erreur:
Cannot autowire service "App\EventListener\RedirectToLocaleActiveListener": argument "$localeActive" of method "__construct()" has no type-hint, you should configure its value explicitly.
Mes services.YAML
parameters:
locale: de
locale_active: de
app_locales: de|en
uploads_directory_name: uploads
uploads_profile_directory_name: profiles
uploads_directory: '%kernel.root_dir%/../public/%uploads_directory_name%'
profile_directory: '%kernel.root_dir%/../public/%uploads_directory_name%/%uploads_profile_directory_name%'
google_recaptcha_site_key: '%env(GOOGLE_RECAPTCHA_SITE_KEY)%'
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
App\Controller\:
resource: ../src/Controller
tags:
- controller.service_arguments
locales:
class: App\Util\Locales
arguments:
- '%locale_active%'
- '%app_locales%'
- '@session'
app.locale:
class: App\EventListener\LocaleListener
tags:
- {name: kernel.event_subscriber}
app.redirect_to_locale_active:
class: App\EventListener\RedirectToLocaleActiveListener
arguments:
- '@router'
- '%locale_active%'
tags:
- {name: kernel.event_subscriber}
mon redirectTolocaleActentiner.php
<?php
namespace App\EventListener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* Class RedirectToLocaleActiveListener
* When a user enters to the homepage without the parameter locale,
* the subscriber redirects the user to the main locale.
*
* @package App\EventListener
*/
class RedirectToLocaleActiveListener implements EventSubscriberInterface
{
/**
* @var UrlGeneratorInterface
*/
private $urlGenerator;
/**
* @var string
*/
private $localeActive;
/**
* @param UrlGeneratorInterface $urlGenerator
* @param $localeActive
*/
public function __construct(UrlGeneratorInterface $urlGenerator, $localeActive)
{
$this->urlGenerator = $urlGenerator;
$this->localeActive = $localeActive;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
/**
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if ('/' == $request->getPathInfo()) {
$route = $this->urlGenerator->generate('app_index', ['_locale' => $this->localeActive]);
$response = new RedirectResponse($route);
$event->setResponse($response);
}
}
}
ce que j'ai essayé :
résultat :
Cannot autowire service "App\EventListener\RedirectToLocaleActiveListener": argument "$localeActive" of method "__construct()" is type-hinted "string", you should configure its value explicitly.
les arguments de type scalaire ne peuvent pas être auto-câblés. Vous devez les câbler manuellement.
Vous pouvez essayer de câbler l'argument explicitement dans la définition de service:
App\EventListener\RedirectToLocaleActiveListener
arguments:
$urlGenerator: '@router'
$localeActive: '%locale_active%'
tags:
- {name: kernel.event_subscriber}
Documentation: https://symfony.com/doc/current/service_container.html#Mantual-wiring-Arguments
Ou vous pouvez utiliser la fonction de liaison de service locale pour lier un paramètre à un argument scalaire:
services:
_defaults:
bind:
$localeActive: '%locale_active%'
Documentation: https://symfony.com/blog/new-in-symfony-3-4-local-service-binding
Si votre nom de service n'est pas égal à la FQCN, telle que:
app.ext.telegram_bot_api:
class: 'App\Ext\TelegramBot\Bot'
et quelque part votre utilisation de la résolution de services automatiques comme celle-ci:
# 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/{Entity,Document,Migrations,Tests,Kernel.php}'
vous devez créer des alias entre votre nom de service et FQCN comme celui-ci:
'App\Ext\TelegramBot\Bot': '@app.ext.telegram_bot_api'
votre résolution de services automatiques devrait donc savoir sur votre configuration supplémentaire de service.