Bon j'ai réussi,
Dans la bundle (ModuleBundle), il passer par la méthode build et lui rajouter un Compiler
1 2 3 4 5 6 7 8 9
| class ModuleBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ModuleCompilerPass());
}
} |
le compiler va permettre de recupere tout les services tag du type : module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| namespace ModuleBundle\DependencyInjection\Compiler;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Reference;
class ModuleCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
if (false === $container->hasDefinition('module.factory')) {
return;
}
$definition = $container->getDefinition('module.factory');
foreach ($container->findTaggedServiceIds('module') as $id => $attributes) {
$definition->addMethodCall('addModule', array(new Reference($id)));
}
}
} |
voici le factory qui va géré ça
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| namespace ModuleBundle\Service;
class ModuleFactory
{
private $modules;
public function getModule($module)
{
return $this->modules[$module];
}
public function hasModule($module)
{
return isset($this->modules[$module]);
}
public function addModule($modules)
{
$this->modules[$modules->getName()] = $modules;
}
} |
Maintenant pour les modules, c'est simple dans la condf du service i lfaudra lui mettre le tag "module"
Exemple pour TextModule
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="module.text.class">TextBundle\Module\ForumModule</parameter>
<parameter key="module.text.entity">TextBundle:Text</parameter>
</parameters>
<services>
<service id="module.module.text" class="%module.text.class%">
<tag name="module" template="TextBundle:Module:text" id="text" />
<argument type="service" id="doctrine.orm.entity_manager" />
<argument>%moodle.text.entity%</argument>
</service>
</services>
</container> |
Et la classe du Module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| <?php
namespace textBundle\Module;
use Moodle\ModuleBundle\Service\ModuleInterface;
use Doctrine\ORM\EntityManager;
class TextModule implements ModuleInterface
{
protected $em;
protected $entity;
private $forum;
public function __construct(EntityManager $em, $entity)
{
$this->em = $em;
$this->entity = $entity;
}
public function get($id)
{
$this->text= $this->em->find($this->entity, $id);
return $this->text;
}
public function getTitle()
{
return $this->text->name;
}
public function getLink()
{
return $this->text->id;
}
public function getName()
{
return 'text';
}
} |
ensuite dans la vue on fera (pour le moment j'ai pas finis pour les templates) :
$module = $this->get('module.factory')->get('text')->get(5);
Partager