Utiliser les traits dans Symfony

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,

Weenesta