【问题标题】:How to read a Cookie using Symfony 2?如何使用 Symfony 2 读取 Cookie?
【发布时间】:2013-07-22 15:27:46
【问题描述】:

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

为了避免与登录细节混淆,我希望 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:错误:调用未定义的方法 Symfony\Component\HttpFoundation\HeaderBag::getCookies() 在 DefaultController.php 第 713 行

我该怎么做才能让它工作?

编辑
Cheesemacfly 建议更换:

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

只有这个:

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

我收到以下回复:

数组([PHPSESSID] => gptbmh61mfkqn6p86d3suhnt13)

编辑 2
我一直在查看 CakePHP 用于生成 Cookie 的代码,但它没有为 cookie 提供域。我现在已经修复它,使域为.domain.org,这样子域也可以访问它。

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

【问题讨论】:

  • 不带参数调用$request->headers->getCookies()怎么办?
  • 我得到同样的错误@cheesemacfly,我会相应地更改问题先生。
  • 使用$this->getRequest()->cookies->all()怎么样?还是$this->getRequest()->cookies->get('CakeCookie[passport]')
  • 修改了我的答案。您的第二个建议只是空白。我已经检查了 Firebug 并且 Cookie 是在旧应用程序中设置的。
  • 这两个应用程序分别在哪里(什么域/路径)?

标签: cakephp symfony cookies


【解决方案1】:

我在朋友的帮助下想通了。

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

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

然后我检查了 Symfony2,没有更改之前编辑的代码,然后 Symfony2 可以获取 cookie。

感谢大家的帮助!

【讨论】:

    【解决方案2】:

    在每次请求期间,Symfony2 默认会在 Twig 和 PHP 模板引擎中设置一个全局模板变量 app。 app 变量是一个 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 中:echo $app->getRequest()->getMethod() 在树枝中:{{ app.user.username }} 但是对于会话对象: 在树枝中:{{ app.session.varname }} PHP中://不知道,你知道怎么调用吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2011-12-25
      • 2010-11-24
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多