Symfony2 Guzzle 存储请求的 cookie

Symfony2 Guzzle store cookie for request

正在尝试让我的 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 class 中的 public 变量,并在会话(序列化)中设置为上述变量。两者似乎都不起作用,这里错误出现在 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?

谢谢,

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

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

在 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()));
}

希望对您有所帮助