Bonjour,
Aujourd'hui, je vais vous montrer comment tirer le meilleur parti des Traits dans Symfony.
Tout d'abord, qu'est-ce qu'un Trait en POO ?
Depuis la documentation officielle des Traits de PHP :
Un trait est semblable à une classe, mais il ne sert qu'à grouper des fonctionnalités d'une manière intéressante.
Un exemple de trait et la syntaxe particulière :
trait Something {
public function do() {
echo "I have done";
}
}
class SomeElse {
use Something;
public function doAnother() {
$this->do();
// affiche "I have done"
}
}
Imaginons maintenant que nous voulions, dans plusieurs controleurs Symfony, mettre à disposition des certaines méthodes, ici restreindre l'accès à certaines partie du code :
trait ControllerTrait
{
protected function handleAccess(User $user, Cercle $cercle)
{
if (! $this->hasAccess($user, $cercle))
{
throw new AccessDeniedException();
}
}
protected function hasAccess(User $user, Cercle $cercle)
{
$cercle_manager = $this->get('cercle_manager');
return $cercle_manager->findCercleUserBycercleAndUser($cercle, $user) !== null;
}
}
class CercleController extends Controller
{
use ControllerTrait;
/**
* @Route("/groupe/index/{slug}", defaults={"slug" = null}, name="groupe_index")
*/
public function indexAction(Request $request)
{
$slug = $request->get('slug');
$cercle = $this->getCercle($slug);
$user = $this->getUser();
$this->handleAccess($user, $cercle);
// D'autres actions
}
}
Une autre idée d'utilisation des Traits dans la définition des entitées Doctrine, afin de rendre communes certaines fonctionnalités, comme Translatable, Timestampable, Sluggable...
A très bientôt,
Mathieu