<?php
declare(strict_types=1);
/*
* Copyright (C) Office National de Publication et de Communication - All Rights Reserved
*
* Unauthorized copying of this file, via any medium is strictly prohibited by law
* This file is proprietary and confidential
*/
namespace App\Service;
use App\Common\LieuInterface;
use App\Common\QuoiInterface;
use App\Entity\AncienneRegion;
use App\Entity\Departement;
use App\Entity\QuoiMotCle;
use App\Entity\Region;
use App\Entity\Ville;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\EntityManagerInterface;
final class Slugify
{
private const CACHE_LIFETIME = 60;
private const ALIAS_QUOI = [
'ehpad' => 'ehpad-maisons-de-retraite',
'formation-sanitaire-et-social' => 'formation',
'handicap-adultes' => 'adultes-handicapes',
];
/** @var EntityManagerInterface */
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
public function revealQuoi(string $slug): QuoiInterface
{
$slug = \strtolower($slug);
$slug = Tools::stripAccents($slug);
// Crée un objet qui représente la recherche par texte
return new QuoiMotCle($slug);
}
public function revealLieu(string $slug): ?LieuInterface
{
$slug = \strtolower($slug);
$slug = Tools::stripAccents($slug);
$classes = [Departement::class, Region::class, AncienneRegion::class];
foreach ($classes as $class) {
$lieu = $this->findBySlug($class, $slug);
if ($lieu) {
return $lieu;
}
}
return $this->findVilleBySlug($slug);
}
public function getAliasQuoi(string $slug): ?string
{
return self::ALIAS_QUOI[$slug] ?? null;
}
private function findVilleBySlug(string $slug): ?Ville
{
/** @var ServiceEntityRepository $repository */
$repository = $this->entityManager->getRepository(Ville::class);
return $repository
->createQueryBuilder('v')
->where('v.slug = :slug')
->setParameter('slug', $slug)
->setMaxResults(1)
->getQuery()
->useResultCache(true, self::CACHE_LIFETIME)
->getOneOrNullResult();
}
private function findBySlug(string $class, string $slug)
{
/** @var ServiceEntityRepository $repository */
$repository = $this->entityManager->getRepository($class);
$entities = $repository
->createQueryBuilder('x')
->getQuery()
->useResultCache(true, self::CACHE_LIFETIME)
->getResult();
foreach ($entities as $entity) {
if ($entity->getSlug() === $slug) {
return $entity;
}
}
}
}