Я не могу понять, как использовать SecurityServiceProvider
в Silex
. Моя конфигурация:
$app['security.firewalls'] = array( 'admin' => array( 'pattern' => '^/_admin/.+', 'form' => array('login_path' => '/_admin/', 'check_path' => '/_admin/login_check'), 'logout' => array('logout_path' => '/_admin/logout'), 'users' => array( 'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC+GsR...'), ), ), ); $app->register(new Silex\Provider\SecurityServiceProvider());
Это просто бросает:
Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Identifier "security.authentication_providers" is not defined.'
Согласно документации в некоторых случаях, когда вы хотите получить доступ к функциям безопасности за пределами обработки запроса, вам необходимо вызвать $app->boot();
но это не моя ситуация.
Если я вызову $app->boot();
перед $app->register(...)
он не вызывает никаких исключений, но, вероятно, не загружается вообще, потому что тогда при создании формы входа Twig бросает:
Unable to generate a URL for the named route "_admin_login_check" as such route does not exist.
Есть проблема несколько месяцев назад, возможно, с той же проблемой, но она закрыта, поэтому я думаю, она должна быть исправлена сейчас
Я получал такое же исключение при попытке зарегистрировать SecurityServiceProvider
перед TwigServiceProvider
.
Я только что изменил порядок регистрации ( Security after Twig ), и все стало нормально работать:
// Twig service $app->register(new Silex\Provider\TwigServiceProvider(), array( 'twig.path' => sprintf("%s/../views", __DIR__), )); // Security service $app["security.firewalls"] = array(); $app->register(new Silex\Provider\SecurityServiceProvider());
Вам необходимо загрузить свою заявку между регистрацией SecurityServiceProvider
регистрацией TwigServiceProvider
:
// Security service $app["security.firewalls"] = array(); $app->register(new Silex\Provider\SecurityServiceProvider()); // Boot your application $app->boot(); // Twig service $app->register(new Silex\Provider\TwigServiceProvider(), array( 'twig.path' => sprintf("%s/../views", __DIR__), ));
Этот код, как представляется, исправляет вашу проблему, но вы должны хотя бы добавить одного поставщика проверки подлинности.
Я столкнулся с той же проблемой – также с текущей версией silex ~ 2.7.
Наконец, я узнал, что в моем случае компонент «symfony / twig-bridge», интегрированный с помощью композитора, был проблемой. Я объединил этот компонент твинг-моста, чтобы использовать транс- черту в моих шаблонах ветви для перевода (например {{ 'Age'|trans }}
). После удаления веточек из проекта все работало, как ожидалось.
Чтобы использовать trans в моих шаблонах, я внедрил I18nExtension для себя, чтобы использовать синтаксис признаков:
<?php namespace AppBundle\Utils; class I18nExtension extends \Twig_Extension { private $app; /** * Register the extension after registering the TwigServiceProvider by * $app['twig']->addExtension(new AppBundle\Utils\I18nExtension($app)); */ public function __construct(\Silex\Application $app) { $this->app = $app; } /** * Provide an additional simple filter called trans - calling * the translate function specified below. */ public function getFilters() { return array( new \Twig_SimpleFilter('trans', array($this, 'translate')), ); } /** * Translates the given $value using the translator registered in the app. */ public function translate($value) { return $this->app['translator']->trans($value); } /** * Name of the extension. */ public function getName() { return "I18nExtension"; } }