【问题标题】:Symfony2 Guzzle store cookie for requestSymfony2 Guzzle 存储请求的 cookie
【发布时间】:2016-11-30 22:01:46
【问题描述】:

试图让我的 Symfony2 控制器向支持的 API 发出请求。需要存储在第一个 API 请求时收到的 cookie,以便在第二个请求中使用它。

这是我的控制器代码:

use Guzzle\Http\Client;

use Guzzle\Plugin\Cookie\CookiePlugin;
use Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar;


class DefaultController extends Controller
{

   public function verifyurlActionOK(Request $request)
   {


   $cookiePlugin = new CookiePlugin(new ArrayCookieJar());

   $client = new Client();

   $this->get('session')->set('client', $client);

   $client->addSubscriber($cookiePlugin);
   $request = $client->get('https://address/scanit?url='.$scantarget);
   $response = $request->send();
   }

   public function progressAction(Request $request)
   {
   $cli = $session->get('client');

   $crequest = $cli->get('https://address/progress');
   $response = $crequest->send();


   return $this->render('AppBundle:Default:progress.html.twig',
                        array(
                        'response'  => $cresponse->getBody()));
   }


}

尝试将 Client 设置为 DefaultController 类中的公共变量,以及上面的 Session(序列化)。两者似乎都不起作用,这里错误出现在progressAction中的get()上

[2016-11-29 16:22:46] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Debug\Exception\FatalErrorException: "Error: Call to a member function get() on a non-object"

如何在progressAction中从verifyurlActionOK访问$client??

谢谢,

【问题讨论】:

  • $session 变量未在 progressAction 方法中初始化

标签: symfony guzzle guzzle6


【解决方案1】:

在 progressAction 方法中,您错过了从容器中获取会话的机会。尝试添加行$session = $this->get('session')

例如:

public function progressAction(Request $request)
   {
   $session = $this->get('session')
   $cli = $session->get('client');

我建议您在会话中存储 CookieJar 对象(它实现可序列化并且可以存储在会话中)而不是 Client 对象实例。例如:

public function verifyurlActionOK(Request $request)
{

    $cookieJar = $this->get('session')->get('cookie-jar', new ArrayCookieJar());
    $cookiePlugin = new CookiePlugin($cookieJar);

    $client = new Client();

    $client->addSubscriber($cookiePlugin);
    $request = $client->get('https://address/scanit?url='.$scantarget);
    $response = $request->send();
    $this->get('session')->set('cookie-jar', $cookieJar);

}

public function progressAction(Request $request)
{
    $cookieJar = $this->get('session')->get('cookie-jar');
    $cookiePlugin = new CookiePlugin($cookieJar);

    $cli = new Client();

    $cli->addSubscriber($cookiePlugin);

    $crequest = $cli->get('https://address/progress');
    $response = $crequest->send();


    return $this->render('AppBundle:Default:progress.html.twig',
        array(
            'response'  => $cresponse->getBody()));
}

希望有帮助

【讨论】:

【解决方案2】:

最佳实践是创建一个包含Client 实例的共享服务,并在两个操作中使用它。您可以存储 cookie,而不是将客户端存储在会话中。

Symfony 有一个关于如何创建服务的很好的文档页面:http://symfony.com/doc/current/service_container.html

【讨论】:

猜你喜欢
  • 2014-10-09
  • 1970-01-01
  • 2012-03-28
  • 2020-05-17
  • 2019-03-12
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多