Files
Coltura/src/Module/Sites/Application/Service/CurrentSiteProvider.php
tristan 6cf5ef4cfc
All checks were successful
Auto Tag Develop / tag (push) Successful in 6s
Module sites (#8)
| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|                  |                 |

## Description de la PR

## Modification du .env

## Check list

- [x] Pas de régression
- [x] TU/TI/TF rédigée
- [x] TU/TI/TF OK
- [ ] CHANGELOG modifié

Co-authored-by: Matthieu <mtholot19@gmail.com>
Reviewed-on: #8
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
2026-04-20 15:31:58 +00:00

70 lines
2.3 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Module\Sites\Application\Service;
use App\Module\Core\Domain\Entity\User;
use App\Module\Sites\Domain\Entity\Site;
use App\Module\Sites\SitesModule;
use Symfony\Bundle\SecurityBundle\Security;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use function in_array;
/**
* Resout le site courant de l'utilisateur authentifie pour les besoins de
* l'outillage opt-in "site-aware" (ticket 4 module Sites).
*
* Consomme par :
* - SiteScopedQueryExtension : filtrage automatique des collections API.
* - SiteAwareInjectionProcessor : injection automatique sur POST/PATCH.
*
* Retourne `null` dans trois cas distincts (chacun volontairement
* silencieux pour que les extensions/processor deviennent no-op sans
* erreur visible) :
* 1. Le module Sites est desactive dans `config/modules.php`.
* 2. Aucun user n'est authentifie (appel depuis un endpoint public).
* 3. L'user authentifie n'a pas de `currentSite` positionne (cas rare
* grace a la garde `UserRbacProcessor::ensureCurrentSiteConsistency`).
*
* Le flag `sitesActive` est calcule UNE FOIS au boot du service pour
* eviter un `require` a chaque resolution.
*/
final class CurrentSiteProvider implements CurrentSiteProviderInterface
{
private readonly bool $sitesActive;
public function __construct(
private readonly Security $security,
#[Autowire(param: 'kernel.project_dir')]
string $projectDir,
) {
// Lit config/modules.php (tableau de FQCN) et verifie la presence
// de SitesModule::class. Pattern aligne sur ModulesProvider.
$configPath = $projectDir.'/config/modules.php';
$moduleClasses = file_exists($configPath) ? require $configPath : [];
$this->sitesActive = in_array(SitesModule::class, $moduleClasses, true);
}
/**
* Retourne le site courant de l'utilisateur authentifie, ou null si
* l'une des 3 conditions de desactivation est remplie (cf. docblock
* de classe).
*/
public function get(): ?Site
{
if (!$this->sitesActive) {
return null;
}
$user = $this->security->getUser();
if (!$user instanceof User) {
return null;
}
return $user->getCurrentSite();
}
}