Silex SecurityServiceProvider抛出'Identifier'security.authentication_providers“未定义。”

时间:2013-08-02 17:34:05

标签: php symfony silex

我无法弄明如何在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.

an issue a few months ago可能存在同样的问题,但已关闭,所以我想现在应该修复

3 个答案:

答案 0 :(得分:12)

尝试在SecurityServiceProvider之前注册TwigServiceProvider时,我遇到了同样的异常。

我刚刚更改了注册顺序(安全 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());

答案 1 :(得分:12)

您必须在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__),
));

上面的代码似乎可以解决您的问题,但您必须至少添加一个身份验证提供程序。

答案 2 :(得分:0)

我遇到了同样的问题 - 同时使用当前的silex版本~2.7。

最后我发现,在我的情况下,通过composer集成的“symfony / twig-bridge”组件就是问题所在。我整合了这个twig-bridge组件,在我的twig模板中使用 trans 特征进行翻译(例如{{ 'Age'|trans }})。从项目中删除twig-bridge后,所有工作都按预期工作。

为了在我的模板中使用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";
    }
}