<?php
namespace App\EventSubscriber\Seo;
use Doctrine\ORM\EntityManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class SeoSubscriber implements EventSubscriberInterface
{
private $entityManager;
private $twig;
private $siteName;
/**
* SeoSubscriber constructor.
* @param EntityManager $entityManager
* @param \Twig_Environment $twig
* @param string $siteName
*/
public function __construct(EntityManager $entityManager, \Twig_Environment $twig, string $siteName)
{
$this->entityManager = $entityManager;
$this->twig = $twig;
$this->siteName = $siteName;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
/**
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event): void
{
$request = $event->getRequest();
// Si on est dans l'admin, on sort de la fonction
if (false !== strpos($request->get('_route'), 'admin_') || false !== strpos($request->get('_route'), 'sonata')) {
return;
}
// Si cê n'est pas la requête principale, on sort de la fonction
if (!$event->isMasterRequest() || $request->isXmlHttpRequest()) {
return;
}
// On récupère les infos nécessaires pour identifier la ligne dans la table seo
$entityId = $request->get('id', false);
$entitySlug = $request->get('slug', false);
$entityName = $request->get('seoEntity');
$metasToBind = [
'entityId' => $entityId,
'entityName' => $entityName,
'metaTitle' => $this->siteName,
'metaDescription' => null,
'metaKeyword' => null,
'urlCanonical' => null,
'robotIndex' => 'index',
'robotFollow' => 'follow',
'facebookDescription' => null,
'image' => null,
];
// Noindex sur les pages avec des paramètres dans l'URL
$filtres = $request->query->get('search');
if (!is_null($filtres)) {
$metasToBind['robotIndex'] = 'noindex';
$metasToBind['robotFollow'] = 'nofollow';
}
if (empty($entityName)) {
$this->twig->addGlobal('metas', $metasToBind);
return;
}
$metasToBind['entityId'] = $entityId;
$metasToBind['entityName'] = $entityName;
// On récupère les données SEO
if (false !== $entityId) {
$params = ['id' => $entityId];
} elseif (false !== $entitySlug) {
$params = ['slug' => $entitySlug];
} else {
$this->twig->addGlobal('metas', $metasToBind);
return;
}
$locale = $request->attributes->get('_locale');
$repository = $this->entityManager->getRepository('App:'.$entityName);
if (method_exists($repository, 'findByTranslatedSlug') && (isset($params['slug']) && !empty($params['slug']))) {
$entity = $repository->findByTranslatedSlug($params['slug'], $locale);
} elseif (method_exists($repository, 'findById') && (isset($params['id']) && !empty($params['id']))) {
$entity = $repository->findById($params['id'], $locale);
} else {
$entity = $repository->findOneBy($params);
}
if (!method_exists($entity, 'getSeo')) {
$this->twig->addGlobal('metas', $metasToBind);
return;
}
$seo = $entity->getSeo();
// Si on a rien en base de données
if (null === $seo) {
$this->twig->addGlobal('metas', $metasToBind);
return;
}
// Si on a une redirection 301 on l'exécute
if (!is_null($seo->getSeoParametre())) {
if (!empty($seo->getSeoParametre()->getRedirection301())) {
$event->setResponse(new RedirectResponse($seo->getSeoParametre()->getRedirection301(), 301));
}
}
if (!empty($seo->getMetaTitle())) {
$siteName = $seo->getMetaTitle();
// On récupère la page si présent dans l'url
$page = $request->get('pageNumber', false);
if (false !== $page && $page > 1) {
$siteName .= ' - Page '.$page;
}
$metasToBind['metaTitle'] = $siteName;
}
if (!empty($seo->getMetaDescription())) {
$metasToBind['metaDescription'] = $seo->getMetaDescription();
}
if (!empty($seo->getMetaKeywords())) {
$metasToBind['metaKeyword'] = $seo->getMetaKeywords();
}
if (!is_null($seo->getSeoParametre())) {
if (!empty($seo->getSeoParametre()->getUrlCanonical())) {
$metasToBind['urlCanonical'] = $seo->getSeoParametre()->getUrlCanonical();
}
if (!empty($seo->getSeoParametre()->getRobotIndex())) {
$metasToBind['robotIndex'] = $seo->getSeoParametre()->getRobotIndex();
}
if (!empty($seo->getSeoParametre()->getRobotFollow())) {
$metasToBind['robotFollow'] = $seo->getSeoParametre()->getRobotFollow();
}
}
if (!is_null($seo->getSeoReseauxSociaux())) {
if (!empty($seo->getSeoReseauxSociaux()->getFacebookDescription())) {
$metasToBind['facebookDescription'] = $seo->getSeoReseauxSociaux()->getFacebookDescription();
}
if (!is_null($seo->getSeoReseauxSociaux()->getImage())) {
$metasToBind['image'] = $seo->getSeoReseauxSociaux()->getImage();
}
}
$this->twig->addGlobal('metas', $metasToBind);
return;
}
}