我无法弄明如何在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可能存在同样的问题,但已关闭,所以我想现在应该修复
答案 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";
}
}