[Symfony] Surchargez toutes les actions de votre controller

Il peut arriver, dans certains de vos projets Symfony, que vous deviez appeler une fonction spécifique dans toutes vos actions d’un controller en particulier. Mais voila, vous êtes également dépendant de vos services, qui ne sont disponibles qu’à l’intérieur de vos actions.

L’astuce consiste ici à surcharger chacune des actions de vos controllers automatiquement, pour leur demander d’exécuter le même code avant même de s’exécuter elle-même. Vous bénéficiez ainsi des mêmes dépendances que vos actions ainsi que du même environnement.

<?php
namespace AppBundle\DefaultController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller {
    /**
     * @Route("/method1", name="app_method1")
     */
    private function method1Action() {
        return $this->render('method1.html.twig');
    }

    /**
     * @Route("/method2", name="app_method2")
     */
    private function method2Action() {
        return $this->render('method2.html.twig');
    }

    public function __call($method, $args) {
        $user = $this->get('security.tokenStorage')->getToken()->getUser();
        dump($user->getUsername());
       
        return call_user_func_array(array($this, $method), $args);
    }
}

Ici, pour n’importe quelle méthode de notre controller « Default », on va « dumper » le nom de l’utilisateur connecté avant d’exécuter l’action.

Attention cependant, pour que la méthode magique « __call » soit appelée, il faut placer la méthode de l’action en « private ».

Laisser un commentaire