Аргумент Symfony 4 не имеет подсказки типа, вы должны явно указать его значение - PullRequest
0 голосов
/ 22 февраля 2019

Symfony 4.2.3

Недавно обновлен с версии 3.4 до 4.2.3, и мой проект заработал, но когда для параметра autoconfigure в services.yaml установлено значение true, я получу следующее сообщение об ошибке:

Cannot autowire service "App\EventListener\RedirectToLocaleActiveListener": argument "$localeActive" of method "__construct()" has no type-hint, you should configure its value explicitly.

My 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}

My RedirectToLocaleActiveListener.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);
        }
    }
}

Что я имеюпробовал:

  1. добавление 'строки' к $ localActive в __construct из RedirectToLocaleActiveListener

Результат:

Cannot autowire service "App\EventListener\RedirectToLocaleActiveListener": argument "$localeActive" of method "__construct()" is type-hinted "string", you should configure its value explicitly.

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Если имя вашей службы не равно fqcn, например:

    app.ext.telegram_bot_api:
      class: 'App\Ext\TelegramBot\Bot'

и где-то вы используете автоматическое разрешение служб, например:

    # 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}'

, вы должны создать псевдоним междуимя службы и fqcn, например:

'App\Ext\TelegramBot\Bot': '@app.ext.telegram_bot_api'

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

0 голосов
/ 27 февраля 2019

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

Вы можете попробовать явно связать аргумент в определении службы:

App\EventListener\RedirectToLocaleActiveListener
    arguments:
        $urlGenerator: '@router'
        $localeActive: '%locale_active%'
    tags:
        - {name: kernel.event_subscriber}

Документация: https://symfony.com/doc/current/service_container.html#manually-wiring-arguments

Или вы можете использовать функцию привязки локальной службы дляпривязать параметр к скалярному аргументу:

services:
    _defaults:
        bind:
            $localeActive: '%locale_active%'

Документация: https://symfony.com/blog/new-in-symfony-3-4-local-service-binding

...