使用{_locale}在SecurityServiceProvider中使用Silex防火墙

时间:2013-07-22 17:07:16

标签: security internationalization routes silex

当我配置Silex SecurityServiceProvider以使用{_locale} param时,login.check_path会返回LogicException,如下所示:

  

LogicException :控制器必须返回响应(给定null)。您是否忘记在控制器中的某处添加返回语句?

以下是我的设置:

$app->register(new Silex\Provider\SecurityServiceProvider, [
    'security.firewalls' => [
        'login' => [
            'pattern' => '^/{_locale}/login',
            'security' => false,
        ],
        'games' => [
            'pattern' => '^/{_locale}/modules/',
            'form' => [
                'login_path' => '/{_locale}/login',
                'check_path' => '/{_locale}/modules/login_check',
            ],
            'logout' => [
                'logout_path' => '/{_locale}/modules/logout',
            ],
            ...
        ],
        ...
    ],
]);

login_path并且防火墙处理似乎工作正常,但无法完成登录过程。 怎么了?

我还问你,login_pathcheck_pathlogout_path的正确路由名称是什么,以便用于Twig {{ path() }}方法,因为我无法弄明白到{_locale}出席。

谢谢。

1 个答案:

答案 0 :(得分:1)

今天遇到同样的问题:)并找到了这个解决方案:

default_target_pathalways_use_default_target_path添加到您的security.firewalls表单配置。

'form' => array(
    'login_path' => '/',
    'check_path' => 'login_check',
    'default_target_path' => '/' . $app['locale'],
    'always_use_default_target_path' => true
),

修改

因此使用$app['locale']效果不佳。

最好使用$app['session']->get('locale')并在before中间件

中将语言环境设置为会话
$app->before(function (Request $request) use ($app) {
    $app['session']->set('locale', $app['locale']);
    ....
});

也许有人通过重载事件监听器来获得更好的解决方案。但我认为这是一个快速的解决方案。