Symfony2 - Comment utiliser le __construct() dans un Contrôleur d'accès et Instaler.Contexte?
Je vais avoir quelques problèmes avec Symfony2. À savoir sur la façon d'utiliser le __construct() fonction. la Documentation Officielle est terriblement mauvais!
Je veux être en mesure d'utiliser les éléments suivants:
public function __construct()
{
parent::__construct();
$user = $this->get('security.context')->getToken()->getUser();
}
Comment jamais, j'obtiens l'erreur suivante:
Erreur fatale: Impossible d'appeler un constructeur dans /Sites/src/DEMO/DemoBundle/Controller/Frontend/HomeController.php sur la ligne 11
La ligne 11 est "parent::__construct();"
Je l'ai enlevé et le suivant, nouvelle erreur
Erreur fatale: Appel à un membre de la fonction get() sur un non-objet dans /Sites/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php sur la ligne 242
Je pense je pourrais avoir besoin pour configurer le ContainerInterface DIC, mais je n'ai aucune idée de comment faire (j'ai essayé et échoué, lamentablement)
Les idées sont les bienvenues?
Mise à jour - Essayé de changer de prolonger ContainerAware et eu cette erreur:
Fatal error: Class DEMO\DemoBundle\Controller\Frontend\HomeController ne peut pas s'étendre à partir de l'interface de Symfony\Component\DependencyInjection\ContainerAwareInterface dans /Sites/src/DEMO/DemoBundle/Controller/Frontend/HomeController.php sur la ligne 43
En utilisant le code suivant dans le contrôleur:
<?php
namespace DEMO\DemoBundle\Controller\Frontend;
use Symfony\Component\DependencyInjection\ContainerAware;
class HomeController extends ContainerAwareInterface
{
protected $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
- Je pense que vous ne pouvez pas accéder à conteneur __construct.
- Pourquoi ne pas simplement d'injecter de l'utilisateur exemple comme argument dans le constructeur?
- Nanocom - vous dire "simplement", mais je suis assez nouveau à Symfony2. J'ai essayé de trouver un travail décent de la documentation sur les Auditeurs et les Services de l'Officiel docs il suffit de ne pas très bien l'expliquer à mon humble avis.
- cela semble assez clair: symfony.com/doc/current/book/service_container.html - vous pouvez élargir sur ce qu'il est que vous voulez réaliser?
- Je veux être en mesure d'utiliser __construct() ou une fonction similaire, pour me permettre de définir quelques variables, je peux ré-utiliser dans mon contrôleur. Dans CodeIgniter2 je peux utiliser le __construct pas de problèmes, mais Symfony2 est tout à fait différent et je dois prendre environ 20 étapes pour obtenir quelque chose de si simple exécutant (ou pas comme c'est le cas)
- juste injecter du conteneur dans le constructeur au lieu d'utiliser ContainerAware. (À définir votre appareil en tant que service).
- Aussi, le Contrôleur de base vous êtes l'extension n' pas dispose d'un constructeur, de logique, il hurle à vous, il ne peut pas l'appeler.
- Vous souhaitez aussi utiliser le mot-clé "instruments" au lieu de "s'étend". Classe sont étendues, les interfaces sont implémentées.
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que vous êtes l'extension de la valeur par défaut de Symfony contrôleur? Si oui, un oeil au code qui va révéler la réponse:
Avis qu'il n'y a pas de Contrôleur::__construct définis de manière à l'aide de parent::__construct, vous n'obtiendrez pas n'importe où. Si l'on regarde ContainerAware:
Encore, aucun constructeur et le conteneur n'est pas disponible jusqu'à ce que setContainer est appelé. Afin de remplacer setContainer et de mettre votre logique. Ou bien juste faire un seul contrôleur qui n'a pas étendre la classe controller de base et de l'injecter les dépendances directement dans le constructeur.
Mise À Jour Août 2017
Encore quelques coups sur cette. Si vous voulez vraiment exécuter quelque chose avant chaque ensuite, le contrôleur de l'utilisation d'un noyau contrôleur auditeur. Si vous n'avez besoin que l'utilisateur n'a alors bien sûr utiliser getUser(). Et merci de ne pas remplacer setContainer(). Dans certains cas, il pourrait fonctionner, mais il serait juste spire votre code.
J'ai aussi fréquemment voulez une instance de l'Utilisateur actuel dans la plupart de mes contrôleurs. Je trouve que c'est plus facile de simplement faire quelque chose comme ceci:
Cependant, c'est un peu trop simpliste exemple de cas. Si vous voulez faire plus de travail avant que l'action d'un Contrôleur est commencé, je vous suggère de définir votre appareil en tant que Service.
Aussi jeter un oeil à cet article: S'Éloigne du Contrôleur de Base
Je dois récupérer le 'façade' manager pour mon api rest de la ressource. N'utilisez pas le constructeur et à l'aide d'une fonction privée semble le plus facile et le plus simple pour moi.
PS C'est ok pour moi pour usage privé/fonctions protégées dans mon contrôleur, tant qu'il ne contient aucune des conditions
Vous ne pouvez pas appeler getUser() ou() pour les services de contrôleur de constructeurs. Si vous vous souvenez que, vous permettra d'économiser beaucoup de temps de débogage.
Je sais que la question est très vieux, mais je n'ai pas trouvé de réponse jusqu'à présent. Donc, je vais le partager.
Le but ici, est d'exécuter un code à chaque fois une action dans notre contrôleur est appelé.
La
__construct
méthode ne fonctionne pas, parce qu'elle est appelée avant toute autre chose, vous ne pouvez pas accéder au conteneur de services.Le truc, c'est de la surcharge de chaque méthode automatiquement lorsqu'ils sont appelés :
Avertissement ! Vous devez définir chaque méthode comme une méthode privée ! Ou la
__call
méthode magique ne sera pas appelé.Il n'existe que deux solutions à ce problème:
Utiliser une méthode privée comme l'a souligné @Tjorriemorrie ici. Mais c'est un sale méthode pour les puristes. (Je suis en utilisant ce! 😀 );
Définir le contrôleur comme un service, mais de cette façon, vous perdrez tous les raccourcis fournis par
Symfony\Bundle\FrameworkBundle\Controller\Controller
. Ici est l'article qui montre comment faire.Comme dit, personnellement, dans ma situation, je visez plutôt une solution à ceci:
C'est typiquement une classe que j'appelle
MyManager
où j'ai mis le code que j'utilise en plus d'une action dans le contrôleur ou que unusefully occupe des lignes (par exemple le code pour créer et remplir des formulaires ou tout autre code pour faire de gros travaux ou des tâches qui nécessitent beaucoup de code).De cette façon, je mantain le code de l'action clair dans ses objectifs, sans ajouter de la confusion.
Peut-être l'utilisation d'une propriété pour stocker la dépendance est un overoptimization, mais... je l'aime 🙂
Comme je le vois, Contrôleur s'étend ContainerAware, et si nous prenons un coup d'oeil de ContainerAware il met en œuvre ContainerAwareInterface. Donc, ContainerAware devez avoir déclaré les méthodes exactes dans son interface. Ajoutez cette ligne
public function __construct();
à la ContainerAwareInterface définition et il sera résolu.