2013-07-22 25 views
0

我正在为我工​​作的公司使用的Web应用程序构建替代品。它是使用CakePHP 1.3构建的,我使用Symfony 2从头开始重写它。这两个系统将并排运行,各种功能将传输到Symfony 2并从旧的CakePHP应用程序中移除。如何使用Symfony 2读取Cookie?

为了避免与登录细节混淆,我希望CakePHP处理用户登录事物,直到我可以完全关闭CakePHP并依赖Symfony 2的安全性。与此同时,CakePHP应用程序生成一个包含用户ID的cookie。我想用Symfony的这个cookie作为基本的安全形式。

但是,我无法让Symfony读取或加载已创建的cookie。这里是我的代码:

public function securitytestAction() 
{ 

    $request = $this->getRequest($_COOKIE); 
    $cookie = $request->headers->getCookies('CakeCookie[passport]'); 

    print_r($cookie); 

    return $this->render('InstructorBundle:Default:test.html.twig'); 
} 

使用Firebug,CakePHP在登录过程中生成的Cookie名为'CakeCookie [passport]'。它也没有加密。

我得到的错误是这样的:

FatalErrorException: Error: Call to undefined method Symfony\Component\HttpFoundation\HeaderBag::getCookies() in DefaultController.php line 713

我能做得到这个工作?

编辑
Cheesemacfly曾建议更换:

$request = $this->getRequest($_COOKIE); 
$cookie = $request->headers->getCookies(); 

通过如此:

$request = $this->getRequest()->cookies->all(); 

我得到如下回应:

Array ([PHPSESSID] => gptbmh61mfkqn6p86d3suhnt13)

编辑2
我一直在寻找CakePHP用来生成Cookie的代码,它没有给出cookie的域名。我现在已经修复了这个问题,以便域名是.domain.org,这样子域名也可以访问它。

现在,当我使用Firebug访问Symfony2应用程序时,我可以看到Cookie与其他两个CakePHP会话cookie(我不需要)一起列出。即使在查看子域new.domain.org时,3个CakePHP域也都使用www.domain.org,而Symfony2使用的一个cookie显示域名为new.domain.org .Symfony2虽然仍然拒绝加载我想要的Cookie。

+0

如果你不带参数调用'$ request-> headers-> getCookies()'会怎么样? – cheesemacfly

+0

我得到同样的错误@cheesemacfly,我会相应地改变问题先生。 – mickburkejnr

+0

如何使用'$ this-> getRequest() - > cookies-> all()'?或'$ this-> getRequest() - > cookies-> get('CakeCookie [passport]')'? – cheesemacfly

回答

1

我想通了一位朋友的帮助。

本质上,在CakePHP中设置的cookie不包含路径。为了解决这个问题,我添加了下面的PHP代码:

$value = $someone['User']['id']; 
setcookie("passport", $value, time()+1200, "/", ".domain.org"); 

我再检查Symfony2中,在不改变从以前的编辑代码,然后Symfony2中可以拿起饼干。

谢谢大家的帮助!

0

在每次请求期间,Symfony2默认会在Twig和PHP模板引擎中设置全局模板变量应用程序。该应用程序变量是GlobalVariables实例,它将让您使用自动某些应用特定的变量:

app.security - The security context. 
app.user - The current user object. 
app.request - The request object. 
app.session - The session object. 
app.environment - The current environment (dev, prod, etc). 
app.debug - True if in debug mode. False otherwise. 

例子: 在树枝:{{app.request.method}} 在PHP:回声$ APP-> getRequest() - > getMethod()在twig中:{{app.user.username}} 但对于会话对象: 在twig中:{{app.session.varname}} 在PHP中://我不知道,你知道怎么称呼它吗?