Skip to content

Commit 4fd6a62

Browse files
franmomuphansys
authored andcommitted
Update Symfony docs
1 parent b4b1f14 commit 4fd6a62

File tree

1 file changed

+101
-56
lines changed

1 file changed

+101
-56
lines changed

doc/symfony4.md renamed to doc/symfony.md

Lines changed: 101 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Install Gedmo Doctrine extensions in Symfony 4
1+
# Install Gedmo Doctrine extensions in Symfony
22

3-
Configure full featured [Doctrine extensions](https://github.com/doctrine-extensions/DoctrineExtensions) for your Symfony 4 project.
3+
Configure full featured [Doctrine extensions](https://github.com/doctrine-extensions/DoctrineExtensions) for your Symfony project.
44
This post will show you - how to create a simple configuration file to manage extensions with
55
ability to use all features it provides.
66
Interested? then bear with me! and don't be afraid, we're not diving into security component :)
@@ -11,19 +11,19 @@ over management of extensions.
1111

1212
Content:
1313

14-
- [Symfony 4](#sf4-app) application
14+
- [Symfony](#sf-app) application
1515
- Extensions metadata [mapping](#ext-mapping)
1616
- Extensions filters [filtering](#ext-filtering)
1717
- Extension [listeners](#ext-listeners)
1818
- Usage [example](#ext-example)
1919
- Some [tips](#more-tips)
2020
- [Alternative](#alternative) over configuration
2121

22-
<a name="sf4-app"></a>
22+
<a name="sf-app"></a>
2323

24-
## Symfony 4 application
24+
## Symfony application
2525

26-
First of all, we will need a symfony 4 startup application, let's say [symfony-standard edition
26+
First of all, we will need a symfony startup application, let's say [symfony-standard edition
2727
with composer](https://symfony.com/doc/current/best_practices/creating-the-project.html)
2828

2929
- `composer create-project symfony/skeleton [project name]`
@@ -46,15 +46,15 @@ To do so, add some mapping info to your **doctrine.orm** configuration, edit **c
4646
```yaml
4747
doctrine:
4848
dbal:
49-
# your dbal config here
49+
# your dbal config here
5050

5151
orm:
52-
auto_generate_proxy_classes: %kernel.debug%
52+
auto_generate_proxy_classes: '%kernel.debug%'
5353
auto_mapping: true
54-
# only these lines are added additionally
54+
# only these lines are added additionally
5555
mappings:
5656
translatable:
57-
type: annotation # or attribute
57+
type: attribute # or annotation or xml
5858
alias: Gedmo
5959
prefix: Gedmo\Translatable\Entity
6060
# make sure vendor library location is correct
@@ -79,7 +79,7 @@ to you also. To skip mapping of these entities, you can map **only superclasses*
7979
```yaml
8080
mappings:
8181
translatable:
82-
type: annotation # or attribute
82+
type: attribute # or annotation or xml
8383
alias: Gedmo
8484
prefix: Gedmo\Translatable\Entity
8585
# make sure vendor library location is correct
@@ -101,23 +101,23 @@ everything the extensions provide:
101101
```yaml
102102
# only orm config branch of doctrine
103103
orm:
104-
auto_generate_proxy_classes: %kernel.debug%
104+
auto_generate_proxy_classes: '%kernel.debug%'
105105
auto_mapping: true
106-
# only these lines are added additionally
106+
# only these lines are added additionally
107107
mappings:
108108
translatable:
109-
type: annotation # or attribute
109+
type: attribute # or annotation or xml
110110
alias: Gedmo
111111
prefix: Gedmo\Translatable\Entity
112112
# make sure vendor library location is correct
113113
dir: "%kernel.project_dir%/vendor/gedmo/doctrine-extensions/src/Translatable/Entity"
114114
loggable:
115-
type: annotation # or attribute
115+
type: attribute # or annotation or xml
116116
alias: Gedmo
117117
prefix: Gedmo\Loggable\Entity
118118
dir: "%kernel.project_dir%/vendor/gedmo/doctrine-extensions/src/Loggable/Entity"
119119
tree:
120-
type: annotation # or attribute
120+
type: attribute # or annotation or xml
121121
alias: Gedmo
122122
prefix: Gedmo\Tree\Entity
123123
dir: "%kernel.project_dir%/vendor/gedmo/doctrine-extensions/src/Tree/Entity"
@@ -130,11 +130,11 @@ To do so, add this filter info to your **doctrine.orm** configuration, edit **co
130130
```yaml
131131
doctrine:
132132
dbal:
133-
# your dbal config here
133+
# your dbal config here
134134
orm:
135-
auto_generate_proxy_classes: %kernel.debug%
135+
auto_generate_proxy_classes: '%kernel.debug%'
136136
auto_mapping: true
137-
# only these lines are added additionally
137+
# only these lines are added additionally
138138
filters:
139139
softdeleteable:
140140
class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
@@ -155,13 +155,24 @@ services:
155155
gedmo.listener.tree:
156156
class: Gedmo\Tree\TreeListener
157157
tags:
158-
- { name: doctrine.event_subscriber, connection: default }
158+
- { name: doctrine.event_listener, event: 'prePersist'}
159+
- { name: doctrine.event_listener, event: 'preUpdate'}
160+
- { name: doctrine.event_listener, event: 'preRemove'}
161+
- { name: doctrine.event_listener, event: 'onFlush'}
162+
- { name: doctrine.event_listener, event: 'loadClassMetadata'}
163+
- { name: doctrine.event_listener, event: 'postPersist'}
164+
- { name: doctrine.event_listener, event: 'postUpdate'}
165+
- { name: doctrine.event_listener, event: 'postRemove'}
159166
calls:
160167
- [ setAnnotationReader, [ "@annotation_reader" ] ]
161168

162169
Gedmo\Translatable\TranslatableListener:
163170
tags:
164-
- { name: doctrine.event_subscriber, connection: default }
171+
- { name: doctrine.event_listener, event: 'postLoad' }
172+
- { name: doctrine.event_listener, event: 'postPersist' }
173+
- { name: doctrine.event_listener, event: 'preFlush' }
174+
- { name: doctrine.event_listener, event: 'onFlush' }
175+
- { name: doctrine.event_listener, event: 'loadClassMetadata' }
165176
calls:
166177
- [ setAnnotationReader, [ "@annotation_reader" ] ]
167178
- [ setDefaultLocale, [ "%locale%" ] ]
@@ -170,46 +181,63 @@ services:
170181
gedmo.listener.timestampable:
171182
class: Gedmo\Timestampable\TimestampableListener
172183
tags:
173-
- { name: doctrine.event_subscriber, connection: default }
184+
- { name: doctrine.event_listener, event: 'prePersist' }
185+
- { name: doctrine.event_listener, event: 'onFlush' }
186+
- { name: doctrine.event_listener, event: 'loadClassMetadata' }
174187
calls:
175188
- [ setAnnotationReader, [ "@annotation_reader" ] ]
176189

177190
gedmo.listener.sluggable:
178191
class: Gedmo\Sluggable\SluggableListener
179192
tags:
180-
- { name: doctrine.event_subscriber, connection: default }
193+
- { name: doctrine.event_listener, event: 'prePersist' }
194+
- { name: doctrine.event_listener, event: 'onFlush' }
195+
- { name: doctrine.event_listener, event: 'loadClassMetadata' }
181196
calls:
182197
- [ setAnnotationReader, [ "@annotation_reader" ] ]
183198

184199
gedmo.listener.sortable:
185200
class: Gedmo\Sortable\SortableListener
186201
tags:
187-
- { name: doctrine.event_subscriber, connection: default }
202+
- { name: doctrine.event_listener, event: 'onFlush' }
203+
- { name: doctrine.event_listener, event: 'loadClassMetadata' }
204+
- { name: doctrine.event_listener, event: 'prePersist' }
205+
- { name: doctrine.event_listener, event: 'postPersist' }
206+
- { name: doctrine.event_listener, event: 'preUpdate' }
207+
- { name: doctrine.event_listener, event: 'postRemove' }
208+
- { name: doctrine.event_listener, event: 'postFlush' }
188209
calls:
189210
- [ setAnnotationReader, [ "@annotation_reader" ] ]
190-
211+
191212
gedmo.listener.softdeleteable:
192213
class: Gedmo\SoftDeleteable\SoftDeleteableListener
193214
tags:
194-
- { name: doctrine.event_subscriber, connection: default }
215+
- { name: doctrine.event_listener, event: 'onFlush' }
216+
- { name: doctrine.event_listener, event: 'loadClassMetadata' }
195217
calls:
196218
- [ setAnnotationReader, [ "@annotation_reader" ] ]
197219

198220
Gedmo\Loggable\LoggableListener:
199221
tags:
200-
- { name: doctrine.event_subscriber, connection: default }
222+
- { name: doctrine.event_listener, event: 'onFlush' }
223+
- { name: doctrine.event_listener, event: 'loadClassMetadata' }
224+
- { name: doctrine.event_listener, event: 'postPersist' }
201225
calls:
202226
- [ setAnnotationReader, [ "@annotation_reader" ] ]
203227

204228
Gedmo\Blameable\BlameableListener:
205229
tags:
206-
- { name: doctrine.event_subscriber, connection: default }
230+
- { name: doctrine.event_listener, event: 'prePersist' }
231+
- { name: doctrine.event_listener, event: 'onFlush' }
232+
- { name: doctrine.event_listener, event: 'loadClassMetadata' }
207233
calls:
208234
- [ setAnnotationReader, [ "@annotation_reader" ] ]
209235

210236
Gedmo\IpTraceable\IpTraceableListener:
211237
tags:
212-
- { name: doctrine.event_subscriber, connection: default }
238+
- { name: doctrine.event_listener, event: 'prePersist' }
239+
- { name: doctrine.event_listener, event: 'onFlush' }
240+
- { name: doctrine.event_listener, event: 'loadClassMetadata' }
213241
calls:
214242
- [ setAnnotationReader, [ "@annotation_reader" ] ]
215243

@@ -224,15 +252,19 @@ You will need to create this subscriber class if you use **loggable** , **transl
224252
behaviors. This listener will set the **locale used** from request and **username** to
225253
loggable and blameable. So, to finish the setup create **EventSubscriber\DoctrineExtensionSubscriber**
226254

227-
## Register event subscriber for [Symfony Doctrine MongoDB Bundle](https://github.com/doctrine/DoctrineMongoDBBundle)
255+
## Register event listener for [Symfony Doctrine MongoDB Bundle](https://github.com/doctrine/DoctrineMongoDBBundle)
228256

229-
Because DoctrineExtensions does not implement `EventSubscriberInterface` from MongoDBBundle, you need to manually tag
230-
the listeners. Otherwise, the listeners will not be listening to the triggered events of Doctrine.
257+
You also need to manually tag the listeners. Otherwise, the listeners will not be listening to the triggered events
258+
of Doctrine.
231259

232260
```yaml
233261
Gedmo\Loggable\LoggableListener:
234-
tags:
235-
- { name: doctrine_mongodb.odm.event_subscriber }
262+
tags:
263+
- { name: doctrine_mongodb.odm.event_listener, event: 'onFlush' }
264+
- { name: doctrine_mongodb.odm.event_listener, event: 'loadClassMetadata' }
265+
- { name: doctrine_mongodb.odm.event_listener, event: 'postPersist' }
266+
calls:
267+
- [ setAnnotationReader, [ "@annotation_reader" ] ]
236268
```
237269
238270
```php
@@ -245,7 +277,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface;
245277
use Symfony\Component\HttpKernel\KernelEvents;
246278
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
247279

248-
class DoctrineExtensionSubscriber implements EventSubscriberInterface
280+
final class DoctrineExtensionSubscriber implements EventSubscriberInterface
249281
{
250282
/**
251283
* @var BlameableListener
@@ -278,7 +310,7 @@ class DoctrineExtensionSubscriber implements EventSubscriberInterface
278310
}
279311

280312

281-
public static function getSubscribedEvents()
313+
public static function getSubscribedEvents(): array
282314
{
283315
return [
284316
KernelEvents::REQUEST => 'onKernelRequest',
@@ -318,76 +350,90 @@ if you do not believe me, let's create a simple entity in our project:
318350

319351
namespace App\Entity;
320352

321-
use Gedmo\Mapping\Annotation as Gedmo; // gedmo annotations
322-
use Doctrine\ORM\Mapping as ORM; // doctrine orm annotations
353+
use DateTimeImmutable;
354+
use Doctrine\DBAL\Types\Types;
355+
use Doctrine\ORM\Mapping as ORM;
356+
use Gedmo\Mapping\Annotation as Gedmo;
323357

324358
/**
325359
* @ORM\Entity
326360
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
327361
*/
362+
#[ORM\Entity]
363+
#[Gedmo\SoftDeleteable(fieldName: 'deletedAt', timeAware: false)]
328364
class BlogPost
329365
{
330366
/**
331367
* @Gedmo\Slug(fields={"title"}, updatable=false, separator="_")
332368
* @ORM\Id
333369
* @ORM\Column(length=32, unique=true)
334370
*/
335-
private $id;
371+
#[Gedmo\Slug(fields: ['title', updatable: false, separator: '_'])]
372+
#[ORM\Id]
373+
#[ORM\Column(lenght: 32, unique: true)]
374+
private ?int $id;
336375

337376
/**
338377
* @Gedmo\Translatable
339378
* @ORM\Column(length=64)
340379
*/
341-
private $title;
380+
#[Gedmo\Translatable]
381+
#[ORM\Column(length: 64)]
382+
private ?string $title;
342383

343384
/**
344385
* @Gedmo\Timestampable(on="create")
345-
* @ORM\Column(name="created", type="datetime")
386+
* @ORM\Column(name="created", type="datetime_immutable")
346387
*/
347-
private $created;
388+
#[Gedmo\Timestampable(on: 'create')]
389+
#[ORM\Column(name: 'created', type: Types::DATETIME_IMMUTABLE)]
390+
private ?DateTimeImmutable $created;
348391

349392
/**
350-
* @ORM\Column(name="updated", type="datetime")
393+
* @ORM\Column(name="updated", type="datetime_immutable")
351394
* @Gedmo\Timestampable(on="update")
352395
*/
353-
private $updated;
396+
#[Gedmo\Timestampable(on: 'update')]
397+
#[ORM\Column(name: 'updated', type: Types::DATETIME_IMMUTABLE)]
398+
private ?DateTimeImmutable $updated;
354399

355400
/**
356-
* @ORM\Column(type="datetime", nullable=true)
401+
* @ORM\Column(type="datetime_immutable", nullable=true)
357402
*/
358-
private $deletedAt;
403+
#[ORM\Column(type: Types::DATETIME_IMMUTABLE, nullable: true)]
404+
private ?DateTimeImmutable $deletedAt;
359405

360-
public function getId()
406+
public function getId(): ?int
361407
{
362408
return $this->id;
363409
}
364410

365-
public function setTitle($title)
411+
public function setTitle(?string $title): void
366412
{
367413
$this->title = $title;
368414
}
369415

370-
public function getTitle()
416+
public function getTitle(): ?string
371417
{
372418
return $this->title;
373419
}
374420

375-
public function getCreated()
421+
public function getCreated(): ?DateTimeImmutable
376422
{
377423
return $this->created;
378424
}
379425

380-
public function getUpdated()
426+
public function getUpdated(): ?DateTimeImmutable
381427
{
382428
return $this->updated;
383429
}
384430

385-
public function getDeletedAt(): ?Datetime
431+
public function getDeletedAt(): ?DateTimeImmutable
386432
{
387433
return $this->deletedAt;
388434
}
389435

390-
public function setDeletedAt(?Datetime $deletedAt): void
436+
public function setDeletedAt(?DateTimeImmutable $deletedAt): void
391437
{
392438
$this->deletedAt = $deletedAt;
393439
}
@@ -409,9 +455,8 @@ and add an action to test how it works:
409455
/**
410456
* @Route("/posts", name="_demo_posts")
411457
*/
412-
public function postsAction()
458+
public function postsAction(EntityManagerInterface $em): Response
413459
{
414-
$em = $this->getDoctrine()->getManager();
415460
$repository = $em->getRepository(App\Entity\BlogPost::class);
416461
// create some posts in case if there aren't any
417462
if (!$repository->find('hello_world')) {
@@ -463,7 +508,7 @@ doctrine_mongodb:
463508
auto_mapping: true
464509
mappings:
465510
translatable:
466-
type: annotation # or attribute
511+
type: attribute # or annotation or xml
467512
alias: GedmoDocument
468513
prefix: Gedmo\Translatable\Document
469514
# make sure vendor library location is correct

0 commit comments

Comments
 (0)