/**
  * @param \Symfony\Component\HttpFoundation\Request $request
  * @throws \RuntimeException
  * @throws \InvalidArgumentException if cannot manage the Request
  * @return \Symfony\Component\HttpFoundation\Response|SamlSpInfo|null
  */
 public function manage(Request $request)
 {
     if (!$this->supports($request)) {
         throw new \InvalidArgumentException('Unsupported request');
     }
     $logoutRequest = $this->receiveRequest($request);
     $serviceInfo = $this->getServiceInfo($logoutRequest);
     $this->validateLogoutRequest($serviceInfo, $logoutRequest);
     $arrStates = $this->getSSOState($serviceInfo, $logoutRequest->getNameID()->getValue(), $logoutRequest->getSessionIndex());
     $this->deleteSSOState($arrStates);
     $logoutResponse = new LogoutResponse();
     $logoutResponse->setID(Helper::generateID());
     $logoutResponse->setIssuer($serviceInfo->getSpProvider()->getEntityDescriptor()->getEntityID());
     $logoutResponse->setInResponseTo($logoutRequest->getID());
     $arrSLO = $serviceInfo->getIdpProvider()->getEntityDescriptor()->getFirstIdpSsoDescriptor()->findSingleLogoutServices();
     /** @var  $slo SingleLogoutService */
     $slo = array_pop($arrSLO);
     $logoutResponse->setDestination($slo->getLocation());
     $status = new Status();
     $status->setSuccess();
     $logoutResponse->setStatus($status);
     $context = new SerializationContext();
     $logoutResponse->getXml($context->getDocument(), $context);
     $xml = $context->getDocument()->saveXML();
     return new Response($xml, 200, array('Content-Type' => 'application/xml'));
 }
 /**
  * @param \Symfony\Component\HttpFoundation\Request $request
  * @throws \RuntimeException
  * @throws \InvalidArgumentException if cannot manage the Request
  * @return \Symfony\Component\HttpFoundation\Response|SamlSpInfo|null
  */
 public function manage(Request $request)
 {
     if (!$this->supports($request)) {
         throw new \InvalidArgumentException('Unsupported request');
     }
     $logoutRequest = $this->receiveRequest($request);
     $serviceInfo = $this->getServiceInfo($logoutRequest, $request);
     $this->validateLogoutRequest($serviceInfo, $logoutRequest);
     $arrStates = $this->getSSOState($serviceInfo, $logoutRequest->getNameID()->getValue(), $logoutRequest->getSessionIndex());
     $this->deleteSSOState($arrStates);
     $logoutResponse = new LogoutResponse();
     $logoutResponse->setID(Helper::generateID());
     $logoutResponse->setIssuer($serviceInfo->getSpProvider()->getEntityDescriptor()->getEntityID());
     $logoutResponse->setInResponseTo($logoutRequest->getID());
     $logoutResponse->setRelayState($logoutRequest->getRelayState());
     $arrSLO = $serviceInfo->getIdpProvider()->getEntityDescriptor()->getFirstIdpSsoDescriptor()->findSingleLogoutServices();
     /** @var  $slo SingleLogoutService */
     $slo = array_pop($arrSLO);
     $logoutResponse->setDestination($slo->getLocation());
     $status = new Status();
     $status->setSuccess();
     $logoutResponse->setStatus($status);
     // Log the user out
     $request->getSession()->invalidate();
     $this->securityContext->setToken(null);
     // Return the response to SLO Service
     $bindingType = $serviceInfo->getSpMetaProvider()->getSpMeta()->getResponseBinding();
     if ($bindingType) {
         $detector = new BindingDetector();
         $binding = $detector->instantiate($bindingType);
     } else {
         $binding = new HttpRedirect();
     }
     $bindingResponse = $binding->send($logoutResponse);
     if ($bindingResponse instanceof PostResponse) {
         return new Response($bindingResponse->render());
     } else {
         if ($bindingResponse instanceof RedirectResponse) {
             return new RedirectResponse($bindingResponse->getDestination());
         } else {
             $context = new SerializationContext();
             $logoutResponse->getXml($context->getDocument(), $context);
             $xml = $context->getDocument()->saveXML();
             return new Response($xml, 200, array('Content-Type' => 'application/xml'));
         }
     }
 }