2016-11-29 51 views
3

試圖讓我的Symfony2控制器向支持的API發出請求。需要存儲在第一個API請求時收到的cookie,以便在第二個請求中使用它。Symfony2咕咕店存儲請求的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())); 
    } 


} 

試圖在會話(串行化)來設定客戶端作爲DefaultController類的公共變量和如上述。雙方似乎都沒有工作,這裏的progressAction

[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" 

如何從verifyurlActionOK訪問$客戶端progressAction的get()錯誤出現?

感謝,

+0

的'$ session'變量沒有在'progressAction'方法initialyzated – Matteo

回答

0

。請嘗試將線$session = $this->get('session')

作爲例子:

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

我建議你在會話存儲CookieJar對象(它實現序列化,並且可以存儲在會話),而不是客戶端對象實例。作爲例子:

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

希望這有助於

+0

謝謝!必須升級到最新的Guzzle,舊的不知何故沒有妥善處理餅乾。這裏也是一個很好的例子,如何使用最新的Guzzle和cookies:http://docs.guzzlephp.org/en/latest/quickstart.html#cookies –

0

爲最好的做法是創建一個包含Client實例的共享服務,並從兩個操作使用它。而不是在會話中存儲客戶端,您可以存儲Cookie。

Symfony的有關於如何創建服務良好的文檔頁面:在你錯過從contanier採取屆progressAction方法http://symfony.com/doc/current/service_container.html

+1

非常感謝!經過漫長的討論,將Guzzle升級到最新版本(http://docs.guzzlephp.org/en/latest/quickstart.html#cookies)並使用了Jack的方法。我也喜歡你的方法,將來會用到它....希望我可以選擇兩個正確的答案 –