2013-04-16 1 views
0

Je le code suivant que je mets dans une classe d'entité:accéder à un service d'une entité

$filesystem = $this->container->get('knp_gaufrette.filesystem_map')->get('amazon'); 
$filesystem->write($this->file , $this->name, true); 

Cependant, cela génère toujours une erreur de:

Notice: Undefined property: MySite\UserBundle\Entity\ProfilePicture::$container in /Users/Mike/Sites/MySite/src/MySite/MainBundle/Entity/Document.php line 98 

Toute idée pourquoi c'est l'affaire? Comment accéder à un conteneur de service à partir d'une entité?

J'ai mis cela à l'intérieur d'une classe abstraite:

abstract class Document 
{ 

...... 
} 

Répondre

0

Dans un environnement hérité, j'ai créé un eventlistener doctrine qui injecte automatiquement le conteneur dans une entité qui implémente ContainerAwareInterface. Avec cela, je peux travailler avec une «entité existante» avec un minimum d'effort.

C'est comment Symfony ControllerResolver injecte le conteneur dans un contrôleur mais pour l'entité.

<?php 

namespace Acme\DemoBundle\Doctrine; 

use Doctrine\ORM\Event\LifecycleEventArgs; 
use JMS\DiExtraBundle\Annotation as DI; 
use Symfony\Component\DependencyInjection\ContainerAware; 
use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface; 


/** 
* adds some nice features to more easy entity utilization 
* 
* @DI\Service 
* @DI\Tag("doctrine.event_listener", attributes = {"event" = "postLoad"}) 
*/ 
class ContainerAwareListener extends ContainerAware 
{ 

    /** 
    * @DI\InjectParams({ 
    *  "container" = @DI\Inject("service_container"), 
    * }) 
    */ 
    public function __construct(ContainerInterface $container = null){ 
     $this->setContainer($container); 
    } 

    /** 
    * After object is loaded, listener inject the container 
    * 
    * @param LifecycleEventArgs $args 
    */ 
    public function postLoad(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 
     if($entity instanceof ContainerAwareInterface){ 
      $entity->setContainer($this->container); 
     } 
    } 
} 

l'entité doivent mettre en œuvre le containerawareinterface et les services requis peuvent être obtenus dans la méthode setContainer(), le service est défini par JMSDIExtrabundle mais peut être définie sous services.yml. Comme beaucoup le suggèrent, c'est une mauvaise pratique parce que l'entité doit dépendre le moins possible de tous. Mais comme un extrema ratio (ou dans des délais extrêmes :-)) c'est génial.

+0

avez-vous déjà pensé à utiliser Entity listener? – adit

+0

Je n'ai pas compris ce que vous voulez dire, c'est un auditeur d'entité :) –

0

Les entités sont des modèles de données et ne doivent contenir que des données. Au lieu de cela, créez un service d'écoute ou de gestionnaire avec injection de dépendances.

+1

C'est un bon conseil, mais c'est un peu maigre. S'il vous plaît, fournissez à OP plus d'informations et de code :) – DonCallisto

+0

@akluth le truc c'est que cette classe Document a une méthode appelée performUpload() et dans cette méthode c'est où je fais les uploads – adit

Questions connexes