Внедрение зависимостей для контроллера пакета - PullRequest
0 голосов
/ 30 мая 2019

У меня есть простой работающий SecurityController, который я хотел бы превратить в пакет, чтобы я мог обмениваться базовыми функциями аутентификации на нескольких базовых веб-сайтах, которые я создаю. Все работает как нужно, пока я не попытаюсь превратить свой код в пакет.

Я создал свой класс комплекта, файл Resources / config / routing.xml для объявления моих маршрутов входа в систему и выхода из системы, имею шаблон в Resources / views / Security / login.html.twig, но следующий класс выдает ошибку .

<!-- Controller/SecurityController.php -->
<?php

namespace JustinVoelker\EssentialSecurityBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;

class SecurityController extends AbstractController
{
    private $authenticationUtils;

    public function __construct(AuthenticationUtils $authenticationUtils)
    {
        $this->authenticationUtils = $authenticationUtils;
    }

    public function loginAction()
    {
        $error = $this->authenticationUtils->getLastAuthenticationError();

        return $this->render('@EssentialSecurity/Security/login.html.twig', [
            'error' => $error,
        ]);
    }

    ... Comments and additional functions removed for simplicity

}

Я получаю ошибку при переходе на страницу входа: Controller "JustinVoelker\EssentialSecurityBundle\Controller\SecurityController" has required constructor arguments and does not exist in the container. Did you forget to define such a service?

Следуя нескольким различным примерам / учебникам, я попытался создать файл services.xml и загрузить его через DependencyInjection / EssentialSecurityExtension.php, пытаясь сделать AuthenticationUtils доступным для моего конструктора, но, похоже, это ничего не меняет.

<!-- DependencyInjection/EssentialSecurityExtension.php -->
<?php

namespace JustinVoelker\EssentialSecurityBundle\DependencyInjection;

use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;

class EssentialSecurityExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new XmlFileLoader(
            $container,
            new FileLocator(__DIR__.'/../Resources/config')
        );
        $loader->load('services.xml');
    }
}
<!-- Resources/config/services.xml -->
<?xml version="1.0" encoding="UTF-8" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    <services>
        <service id="essential_security.controller"
                 class="JustinVoelker\EssentialSecurityBundle\Controller\SecurityController">
            <argument type="service" id="security.authentication_utils"/>
        </service>
    </services>
</container>

Чего мне не хватает, что позволяет мне использовать внедрение зависимостей внутри пакета, как я мог до перемещения этого кода в пакет?

Если я просто удаляю любую ссылку на AuthenticationUtils (частное свойство, весь конструктор и его использование внутри loginAction), отображаемую страницей, хотя она не будет работать должным образом без той последней ошибки аутентификации, для которой я использую AuthenticationUtils в первое место.

Дополнительное замечание: если я вручную добавлю JustinVoelker\EssentialSecurityBundle\Controller\SecurityController: ~ в основной файл config / services.xml своих приложений, ошибка контроллера исчезнет, ​​поэтому ясно, что что-то в моем пакете отсутствует, чтобы это работало.

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

РЕДАКТИРОВАТЬ 2019-05-30 Включая часть моего оригинального routing.xml

<route id="essential_security_login" path="/login">
    <default key="_controller">EssentialSecurityBundle:Security:login</default>
</route>

1 Ответ

1 голос
/ 30 мая 2019

Похоже, в вашей маршрутизации вы используете JustinVoelker\EssentialSecurityBundle\Controller\SecurityController, но имя вашей службы essential_security.controller Вы должны либо изменить определение вашей маршрутизации или службы

Вы можете добавить псевдоним

<!-- Resources/config/services.xml -->
<service id="JustinVoelker\EssentialSecurityBundle\Controller\SecurityController" alias="essential_security.controller"/>

<service id="essential_security.controller" class="JustinVoelker\EssentialSecurityBundle\Controller\SecurityController">
    <argument type="service" id="security.authentication_utils"/>
    <tag name="controller.service_arguments"/>
</service>

или просто переименуйте его (обратите внимание, что вы можете опустить class параметр)

<!-- Resources/config/services.xml -->
<service id="JustinVoelker\EssentialSecurityBundle\Controller\SecurityController">
    <argument type="service" id="security.authentication_utils"/>
    <tag name="controller.service_arguments"/>
</service>

или в маршрутизации:

route_name:
    path:     /path
    controller: JustinVoelker\EssentialSecurityBundle\Controller\SecurityController::loginAction
route_name:
    path:     /path
    controller: essential_security.controller::loginAction

зависит от вашего имени службы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...