public function publicationResolver(Request $request)
{
/**
* By default try get publication alias from requested http_host
*/
$publication = $request->server->get('HTTP_HOST');
$this->publicationMetadata['source'] = 'request_http_host';
/**
* If in request GET or POST params exists 'publication' use it.
*/
if ($request->query->has('__publication_alias_name') || $request->request->has('__publication_alias_name')) {
$publication = $request->get('__publication_alias_name');
$this->publicationMetadata['source'] = 'optional_parameter';
}
$cacheKey = $this->cacheService->getCacheKey(array('resolver', $publication, $this->publicationMetadata['source']), 'publication');
$alias = array();
if ($this->cacheService->contains($cacheKey)) {
$alias = $this->cacheService->fetch($cacheKey);
} else {
$qb = $this->em->getRepository('Newscoop\\Entity\\Aliases')->createQueryBuilder('a');
$qb->select('a.id as aliasId', 'p.id as publicationId', 'a.name as alias', 'p.name as publicationName', 'l.id as languageId', 'l.code as languageCode')->leftJoin('a.publication', 'p')->leftJoin('p.language', 'l')->where('a.name = :name')->setParameter('name', $publication);
$alias = $qb->getQuery()->getArrayResult();
$this->cacheService->save($cacheKey, $alias);
}
if (empty($alias)) {
return null;
}
$this->publicationMetadata['alias'] = array('name' => $alias[0]['alias'], 'publication_id' => $alias[0]['publicationId']);
$this->publicationMetadata['publication'] = array('name' => $alias[0]['publicationName'], 'id_default_language' => $alias[0]['languageId'], 'code_default_language' => $alias[0]['languageCode']);
/**
* Save publication metadata to into Request attributes.
*/
$request->attributes->set('_newscoop_publication_metadata', $this->publicationMetadata);
$aliasObject = $this->em->getReference('Newscoop\\Entity\\Aliases', $alias[0]['aliasId']);
$publicationObject = $this->em->getReference('Newscoop\\Entity\\Publication', $alias[0]['publicationId']);
$this->setPublicationAlias($aliasObject);
$this->setPublication($publicationObject);
return $publicationObject;
}