Php 登录成功后重定向+;锡莱克斯

Php 登录成功后重定向+;锡莱克斯,php,symfony,cookies,login,silex,Php,Symfony,Cookies,Login,Silex,我想做的是检查某人登录时是否有饼干。当它们出现时,我想将它们重定向到$cookie\u data/dashboard 因为在我的服务器上选择语言时,会设置cookie。因此,我想将它们重定向到$language/dashboard 我现在有: $app['security.authentication.success_handler.secured_area'] = $app->share(function() use ($app) { $request = $app['reque

我想做的是检查某人登录时是否有饼干。当它们出现时,我想将它们重定向到
$cookie\u data/dashboard

因为在我的服务器上选择语言时,会设置cookie。因此,我想将它们重定向到
$language/dashboard

我现在有:

$app['security.authentication.success_handler.secured_area'] = $app->share(function() use ($app) {
    $request = $app['request'];
    $cookies = $request->cookies;
    if($cookies->has("language"))
    {
        return $app->redirect('/nl/dashboard');
    }
});
但这给了我错误:

Warning: array_map(): An error occurred while invoking the map callback in /Applications/MAMP/htdocs/pst/vendor/silex/silex/src/Silex/Provider/SecurityServiceProvider.php on line 264

Fatal error: Uncaught exception 'RuntimeException' with message 'Accessed request service outside of request scope. Try moving that call to a before handler or controller.' in /Applications/MAMP/htdocs/pst/vendor/silex/silex/src/Silex/Application.php:141 Stack trace: #0 /Applications/MAMP/htdocs/pst/vendor/pimple/pimple/lib/Pimple.php(83): Silex\Application->Silex\{closure}(Object(Silex\Application)) #1 /Applications/MAMP/htdocs/pst/app/bootstrap.php(67): Pimple->offsetGet('request') #2 /Applications/MAMP/htdocs/pst/vendor/pimple/pimple/lib/Pimple.php(126): {closure}(Object(Silex\Application)) #3 /Applications/MAMP/htdocs/pst/vendor/pimple/pimple/lib/Pimple.php(83): Pimple::{closure}(Object(Silex\Application)) #4 /Applications/MAMP/htdocs/pst/vendor/silex/silex/src/Silex/Provider/SecurityServiceProvider.php(409): Pimple->offsetGet('security.authen...') #5 /Applications/MAMP/htdocs/pst/vendor/pimple/pimple/lib/Pimple.php(126): Silex\Provider\SecurityServiceProvider->Silex\Provider\{closure}(Object(Silex\Application)) #6 /A in /Applications/MAMP/htdocs/pst/vendor/silex/silex/src/Silex/Application.php on line 141

我如何才能做到这一点,或者最佳做法是什么?

我不确定这是否正确,但我相信您必须返回另一个实例的对象,有关详细信息,请参阅(特别是igorw的答案)

另一个选项是拦截dispatcher的AUTHENTICATION_SUCCESS事件,我尝试了以下操作:

$app['dispatcher']->addListener(AuthenticationEvents::AUTHENTICATION_SUCCESS
        , function($authEvent) use ($app) {
    $request = $app['request'];
    $cookieKeys = $request->cookies->keys();
    $app['monolog']->addInfo('Available cookies are: ' . implode(', ', $cookieKeys));
    return $app->redirect('SOME_URL_HERE');
});
在日志中,我成功地看到了cookies,没有任何错误,但是重定向也不起作用!在检查日志(MONOLOG)后,我发现在尝试访问我的安全区域时,以下路由被调用,即
/admin

  • http://localhost:8888/silex-skeleton/web/index_dev.php/login
    GET(重定向到登录表单)
  • http://localhost:8888/silex-skeleton/web/index\u dev.php/admin/login\u check
    POST(身份验证)
  • http://localhost:8888/silex-skeleton/web/index_dev.php/admin
    GET(重定向回最初请求的url)
  • 在中间
    /login\u check
    请求上调用身份验证事件,返回不同的值似乎不会对总体结果产生任何影响,至少我没有做到这一点。我想知道的是,为什么不在路由处理程序函数中重定向???结果是一样的,至少如果我正确理解了这个问题。例如,将代码放入安全区域的处理程序中,如:

    $app->get('/dashboard', function() use ($app) {
        $request = $app['request'];
        $cookies = $request->cookies;
        if($cookies->has("language"))
        {
            return $app->redirect('/nl/dashboard');
        }
        return new Response(.....)
    });