我想做的是检查有人登录时是否有cookie。如果有,我想将它们重定向到$cookie_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
我如何才能完成这项工作或最佳做法?
答案 0 :(得分:3)
我不确定这是否正确,但我相信您必须返回另一个实例的对象,请参阅this question了解详情(尤其是igorw的答案)
另一种选择是拦截调度程序的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');
});
在日志中我成功看到了cookie,没有任何错误,但重定向也不起作用!在检查了日志(MONOLOG)后,我看到在尝试访问/admin
的安全区域时调用了以下路由:
http://localhost:8888/silex-skeleton/web/index_dev.php/login
获取(重定向到登录表单)http://localhost:8888/silex-skeleton/web/index_dev.php/admin/login_check
发布(验证)http://localhost:8888/silex-skeleton/web/index_dev.php/admin
获取(重定向回原来请求的网址)在中间/login_check
请求上调用身份验证事件,并且返回不同的值似乎对整体结果没有任何影响,至少我没有设法做到这一点。我想知道为什么你不重定向你的ROUTE HANDLER功能???结果将是相同的,至少如果我正确地理解了这个问题。例如,将您的代码放在安全区域的处理程序中,例如:
$app->get('/dashboard', function() use ($app) {
$request = $app['request'];
$cookies = $request->cookies;
if($cookies->has("language"))
{
return $app->redirect('/nl/dashboard');
}
return new Response(.....)
});