Depuis la sortie de la version 2 de Doctrine, il manquait cruellement l’extension SoftDelete qui vous permet de gérer la suppression de vos enregistrements sans réellement les détruire. Depuis peu, Gediminas Morkevicius alias l3pp4rd a implémenter cela dans ses extensions dédiées à Doctrine 2. Ci-dessous, je vais vous montrer comment changer la version de doctrine dans Symfony2 et sa configuration.
Pour cela, nous allons modifier le fichier deps à la racine de votre projet. Nous allons changer les versions de doctrine pour passer à la version 2.2 et ajouter les extensions:
[doctrine-common] git=http://github.com/doctrine/common.git version=2.2.1 [doctrine-dbal] git=http://github.com/doctrine/dbal.git version=2.2.1 [doctrine] git=http://github.com/doctrine/doctrine2.git version=2.2.1 [gedmo-doctrine-extensions] git=http://github.com/l3pp4rd/DoctrineExtensions.git
Passons maintenant à la définition du namespace pour ces extensions. Modifions le fichier autoload.php se trouvant dans le dossier app
registerNamespaces(array( ... 'Gedmo' => __DIR__.'/../vendor/gedmo-doctrine-extensions/lib', )); ...
Nous pouvons maintenant déclarer le service dont nous avons besoin. Ouvrons le fichier services.xml dans le dossier « Resources/config »:
<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="gedmo.softdeleteable.listener.class">Gedmo\SoftDeleteable\SoftDeleteableListener</parameter> </parameters> <services> ... <service id="gedmo.listener.softdeleteable" class="%gedmo.softdeleteable.listener.class%"> <tag name="doctrine.event_subscriber" /> <call method="setAnnotationReader"> <argument type="service" id="annotation_reader" /> </call> </service> </services> </container>
Chargeons maintenant le filtre qui va modifier vos requêtes lors de l’utilisation de softDelete. Pour cela, nous allons ajouter quelques lignes au boot de notre Bundle. Dans mon cas, j’ai toujours un bundle Core dans mes projets, voici le code à insérer:
<?php namespace Funstaff\CoreBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; class FunstaffCoreBundle extends Bundle { public function boot() { $doctrine = $this->container->get('doctrine'); $doctrine->getEntityManager()->getConfiguration()->addFilter( 'soft-deleteable', 'Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter' ); $em = $doctrine->getEntityManager(); $em->getFilters()->enable('soft-deleteable'); } }
La nouvelle extension est dès maintenant activée.
Pour l’utiliser, nous allons ajouter une annotation sur notre entité comme indiqué ci-dessous:
<?php namespace Funstaff\UserBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as GEDMO; /** * @ORM\Entity * @ORM\Table(name="user") * @GEDMO\SoftDeleteable(fieldName="deletedAt") */ class User { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; ... }
J’espère que cette petite explication vous servira pour vos prochains développements.
Pour en savoir plus sur l’utilisation de celle-ci, veuillez consulter la documentation officielle qui se trouve ici.
Bon tests 😉
I’m getting: Call to undefined method Doctrine\ORM\Configuration::addFilter()
Any ideas?
Are you using doctrine 2.2 ?
There is a better way to register the filter, keeping the entity manager lazy-loaded. And the bundle now allows registering the SoftDeleteableListener too: https://github.com/stof/StofDoctrineExtensionsBundle/pull/123