FatalErrorException: Erreur: Appel à un membre de la fonction a() sur un non-objet
J'ai lu beaucoup de sujets sur ce sujet et je n'arrive pas à trouver une solution à mon problème.
Je crois que le problème est évident et j'ai peut-être juste le regardant fixement trop longtemps.
L'erreur est FatalErrorException: Erreur: Appel à un membre de la fonction a() sur un non-objet dans /vagrant/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php la ligne 198
En regardant la ligne d'erreur, dit-il.
public function getDoctrine()
{
if (!$this->container->has('doctrine')) {
throw new \LogicException('The DoctrineBundle is not registered in your application.');
}
return $this->container->get('doctrine');
}
Voici mon code...
C'est le contrôleur principal qui est de l'appel de la DAO Contrôleur
public function clickThroughAction(request $request, $hash)
{
if (isset($hash)) {
$dbController = $this->get('database_controller');
print_r($dbController->getReferralIdByHash($hash));
return $this->redirect($this->generateUrl('home'));
} else {
return 0;
}
}
C'est le service qui est utilisé.
services:
database_controller:
class: Fuel\FormBundle\Controller\DatabaseController
C'est le dao contrôleur qui est de l'appel de la base de données.
public function getReferralIdByHash($hash)
{
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'Select u From FuelFormBundle:UserReferrals u WHERE u.user_hash = :hash'
)->setParameter('hash', $hash);
$referral = $query->getResult();
if (!$referral) {
throw $this->createNotFoundException(
'No product referral found'
);
$logger = $this->get('logger');
$logger->info('I just got the logger');
$logger->crit('An error occurred, hash for referrals is not recognized. current hash is: ' . $hash . " .");
return $this->redirect($this->generateUrl('home'));
}
$clickThroughCount = $referral[0]->getClickThrough();
$referral[0]->setClickThrough($clickThroughCount + 1);
$em->flush();
return $referral;
}
Je pense que le problème est que la doctrine que le conteneur n'est pas présent, ce qui est pourquoi je suis d'avoir des problèmes. Je ne suis pas sûr de la façon de résoudre ce problème.
Toute aide est appréciée. Merci!
Modifier
Ok, donc voici ce que j'ai changé.
Contrôleur principal est restée la même.
DAO Contrôleur un couple de choses ont été ajoutées.
class DatabaseController extends Controller{
protected $entityManager;
public function __construct($entityManager) {
$this->entityManager = $entityManager;
}
public function getReferralIdByHash($hash)
{
$em = $this->entityManager;
$query = $em->createQuery(
'Select u From FuelFormBundle:UserReferrals u WHERE u.user_hash = :hash'
)->setParameter('hash', $hash);
$referral = $query->getResult();
if (!$referral) {
throw $this->createNotFoundException(
'No product referral found'
);
$logger = $this->get('logger');
$logger->info('I just got the logger');
$logger->crit('An error occurred, hash for referrals is not recognized. current hash is: ' . $hash . " .");
return $this->redirect($this->generateUrl('home'));
}
$clickThroughCount = $referral[0]->getClickThrough();
$referral[0]->setClickThrough($clickThroughCount + 1);
$em->flush();
return $referral;
}
}
Service fini par ressembler à ce
services:
database_controller:
class: Fuel\FormBundle\Controller\DatabaseController
arguments: ["@doctrine.orm.entity_manager"]
var_dump($this->container)
spectacle? Le message d'erreur fondamentalement prouve qu'il ne sera pas un objet, afin de voir ce qu'il est vraiment à ce point.Il retourne
NULL
Où est
$this->container
ensemble? Il me semble que le problème est plus probable.Je suppose que c'est ce qui me manque, mais je ne comprends toujours pas ce que je suis absent. J'ai lu la documentation mais il est déconnecter, et je suis en manque de quelque chose.
Je suppose que en général j'ai du mal à saisir l'Injection de Dépendance. J'ai lu à travers Symfonys documentation et quand j'ai fini je viens de secouer ma tête.
OriginalL'auteur B Rad | 2013-10-09
Vous devez vous connecter pour publier un commentaire.
Le problème est le conteneur n'est pas injecté dans le contrôleur de ici.
Normalement, Symfony fait automatiquement si vous êtes l'extension de
Symfony\Bundle\FrameworkBundle\Controller\Controller
, qui elle-même s'étendSymfony\Component\DependencyInjection\ContainerAware
:Le conteneur est injecté dans le contrôleur (si ce n'est explicitement défini comme un service) à l'aide de injection par mutateur l'appel de la méthode
setContainer()
avec le conteneur comme un argument.Maintenant, que vous avez configuré votre contrôleur comme un service, vous devez ajouter le setContainer appel à votre service de configuration:
Vider votre cache par la suite.
je suppose que votre autre contrôleur n'est pas défini comme un service, c'est pourquoi l'injection se produit automatiquement dans l'autre contrôleur, mais pas pour celle qui est définie comme un service (cas de disparition, le setter appel dans la définition du service). Ne fait que répondre à votre question?
Oui! Grande aide! Merci monsieur, cela efface beaucoup de confusion pour moi. J'étais sur le point de jurer hors de Symfony pour de bon! ha!
Juste pour être clair, je voudrais ajouter ce correct?
public function setContainer($container){ $this->container = $container; }
Cette méthode est fournie par
ContainerAware
quiSymfony\Bundle\FrameworkBundle\Controller\Controller
déjà s'étend. Donc, tant que vous êtes en étendant le contrôleur par défaut, vous n'aurez pas besoin d'ajouter une méthode à votre classe manuellement. Sinon, vous pourriez vous ajouter la méthode sans l'extensionController
(si vous pouvez vivre sans les alias fourni comme$this->getDoctrine()
au lieu de$this->container->get('doctrine')
) - Juste un coup d'oeil à la class. Est-ce clair?OriginalL'auteur nifr
Ne savez pas pourquoi vous feriez un contrôleur de service. Pour ce cas d'utilisation? Normalement, un service est un bon Vieux PHP Objet.
Au sujet de votre problème .. depuis que vous utilisez le contrôleur comme un service, il n'a pas de conteneur automatiquement. Donc, vous avez à injecter la totalité du conteneur, ce qui est un peu lourd si vous avez juste besoin de la doctrine.
Donc il vaut mieux se contenter d'injecter les choses que vous avez vraiment besoin. Pour injecter de la doctrine, dans votre yml ci-dessous
class:
Puis dans votre contrôleur constructeur:
Possible, vous aurez besoin d'appeler le constructeur parent (être conscient).
Si vous souhaitez en faire injecter le service complet de conteneur de toute façon, ici, c'est la bonne section dans le manuel comment vous pouvez le faire: http://symfony.com/doc/current/cookbook/service_container/scopes.html#passing-the-container-as-a-dependency-of-your-service
$entityManager
dans le createQuery plutôt que$em = $this->getDoctrine()->getManager();
Cela est correct. Je vais poster les autres modifications que j'ai faites dans ma question. Merci pour l'aide! Je vote, mais je suis de moins de 15 rep. Désolé!
lors de l'injection uniquement les services dont vous avez besoin est une bonne pratique, ma réponse est plus générique et résout le problème pour tous les contrôleurs définis comme des services. Les autres utilisateurs peuvent courir dans la question et essayer d'accéder à plusieurs services différents dans leurs contrôleurs à l'aide de
$this->container->get('service_name')
🙂OriginalL'auteur Flip
Une suggestion: lorsque vous déplacez la connexion à la base de contrôleur principal vous avez besoin pour construire la nouvelle instance de l'Entité Gestionnaire par exemple:
à l'aide de /myBundle/Modèle de dossier
OriginalL'auteur Michal