У меня есть простой работающий 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>