mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
En symfony 5.4 le typage a été vraiment amélioré, et phpstan peut détecter plus d'erreur potentielles. Mais le problème est que Symfony "type" les `User` avec son propre `Symfony\Component\Security\Core\User\UserInterface` alors qu'on a besoin de `Chill\MainBundle\Entity\User`. Imaginons qu'on a ceci: ```php namespace Chill\Bundle\Service; final readonly class SomeService { public function myMethod(\Chill\MainBundle\Entity\User $user): void { // ... } } ``` Quand on l'appelle dans un contrôleur ou dans un service: ```php namespace Chill\Bundle\Service; use Symfony\Component\Security\Core\Security; final readonly OtherService { public function __construct(private Security $security, private SomeService $service) {} public function __invoke(): void { $this->service->myMethod($this->security->getUser()); } } ``` PHPstan va se plaindre: ``` Parameter #1 $user of method SomeService::myMethod() expects Chill\MainBundle\Entity\User, Symfony\Component\Security\Core\User\UserInterface|null given. ``` Du coup, j'ai créé ce service: ```php <?php namespace Chill\MainBundle\Security; use Chill\MainBundle\Entity\User; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; use Symfony\Component\Security\Core\Security; /** * Security helper for Chill user * * Provides security-related functionality such as user retrieval, authorization checks, * and token retrieval, in a context where only an authenticated @see{User::class} is expected. * */ final readonly class ChillSecurity implements AuthorizationCheckerInterface { public function hasUser(): bool { // implementation detail not shown here } public function getUser(): User { // implementation detail not shown here } public function isGranted($attribute, $subject = null): bool { // implementation detail not shown here } public function getToken(): ?TokenInterface { // implementation detail not shown here } } ``` Et maintenant, on peut faire: ```php namespace Chill\Bundle\Service; use Chill\MainBundle\Security\ChillSecurity; final readonly OtherService { public function __construct(private ChillSecurity $security, private SomeService $service) {} public function __invoke(): void { $this->service->myMethod($this->security->getUser()); } } ``` Et tout va bien se passer. Ca sera dans la version de chill qui fait passer à symfony 5.4.
Chill framework
Documentation of the Chill software.
The online documentation can be found at http://docs.chill.social
See the docs
directory for more.
Languages
PHP
77.3%
Twig
10.4%
Vue
7.4%
JavaScript
3.1%
TypeScript
1%
Other
0.8%