Идентификатор Silex SecurityServiceProvider throws «security.authentication_providers» не определен. '

Я не могу понять, как использовать 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"; } }