2016-11-29 9 views
3

Попытка заставить мой контроллер Symfony2 запросить API с поддержкой API. Необходимо сохранить cookie, полученный по первому запросу API, чтобы использовать его во втором запросе.Symfony2 Guzzle store 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())); 
    } 


} 

Пробовал установить клиент в качестве публичной переменного в классе, и как контроллер по умолчанию выше в сессии (сериализованном). И, кажется, не работает, здесь ошибка появляется на ГЭТ() в 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 ??

Спасибо,

+0

переменную '$ session' не initialyzated в' метод progressAction' – Matteo

ответ

0

в методе progressAction вы пропустите взять сессию с contanier. Попробуйте добавить строку $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, более старый как-то не обработал файлы cookie должным образом. Вот также хороший пример использования последнего Guzzle с файлами cookie: http://docs.guzzlephp.org/en/latest/quickstart.html#cookies –

0

Наилучшая практика для того, чтобы создать общую службу, содержащую экземпляр Client и использовать его с обоих действий. Вместо того, чтобы хранить клиента в сеансе, вы можете хранить файлы cookie.

Symfony имеет хорошую страницу DOc о том, как создавать сервисы: http://symfony.com/doc/current/service_container.html

+1

Большое спасибо !!! После долгих раздумий обновил Guzzle до последней версии (http://docs.guzzlephp.org/en/latest/quickstart.html#cookies) и использовал подход Джека. Мне также нравится ваш подход, будет использовать его в будущем .... Желаю, чтобы я мог выбрать два ответа как правильно –