生命周期van教义-客体存在

生命周期van教义-客体存在

Bij het maken van een nieuwe反应zou het geweldig zijn als decreatedAt-datum automatisch op de huidige datum en tijd zou worden ingesteld。

教义heeft verschillende maneren om objecten en hun properties te manipuleren tijdens hun lifecycle (voordat de rij in de database wordt aangemaakt, nadat de rij is bijgewerkt, ....)。

Definiëren van生命周期回调

Wanneer het gedrag geen service nodig heeft en slechts op één sort entity moet worden toegepast, definieer dan een callback in de entity class:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
——/ src /实体/ Comment.php+ + + b / src /实体/ Comment.php@@ -7,6 +7,7 @@ use Doctrine\DBAL\Types\Types;使用Doctrine\ORM\Mapping作为ORM;# (ORM \实体(repositoryClass: CommentRepository::类))+ # (ORM \ HasLifecycleCallbacks)class注释{#[ORM\Id] @@ -91,6 +92,12 @@ class注释返回$this;}+ # (ORM \ PrePersist)+公共函数setCreatedAtValue+ {+ $this->createdAt = new \DateTimeImmutable();+}+公共函数getConference(): ?会议{返回$this->会议;

HetORM \ PrePersist-事件word geactiveerd wanneer het对象voor het eerst在数据库word opgeslagen。Als dat gebeurt, word desetCreatedAtValue ()-methode angeroepen word de huidige datum en tijd gebruikt voor de waarde van hetcreatedAt财产。

鼻涕虫去evogen aan会议

De URL's voor conference hebben momenteel geen betekenis:/会议/ 1.Belangrijker nog, ze zijn afhankelijk van een implementatiedetail (de primaire sleutel in de database is openbaar)。

Misschien kunnen we in plaats daarvan better gebruik maken van URL's zoals- 2020 /会议/巴黎?那邹儿veel更好uitzien。巴黎- 2020我们在做什么鼻涕虫Van de conferentie。

Voeg een nieuw鼻涕虫-property toe voor conference (even niet nullable string van 255 tekens)

1
ob娱乐下载symfony控制台make:实体会议

Maak een migratiebestand aan om de nieuwe kolom toe te vogen:

1
ob娱乐下载Symfony控制台make:迁移

在我死后迁徙的时候:

1
ob娱乐下载Symfony控制台原则:迁移:迁移

克里格甚至还在犹豫?那是zoals verwacht。Waarom吗?Omdat we gevraagd hebben om de slug nietTe laten zijn, maar bestaande gegevens in conference database zullen een waarde vanKrijgen wanneer de migration word uitgevoerd。拉丁语我们说oplossen door de migratie aan te passen:

12 3 4 5 6 7 8 9 10 11 12 13
——/迁移/ Version00000000000000.php+ + + b /迁移/ Version00000000000000.php@@ -20,7 +20,9 @@ final类Version00000000000000 extends AbstractMigration公共函数up(Schema $ Schema): void{//这个up()迁移是自动生成的,请根据您的需要修改它- $this->addSql('ALTER TABLE conference ADD slug VARCHAR(255) NOT NULL');+ $this->addSql('ALTER TABLE conference ADD slug VARCHAR(255)');+ $this->addSql("UPDATE conference SET slug=CONCAT(LOWER(city), '-', year)");+ $this->addSql('ALTER TABLE conference ALTER COLUMN slug SET NOT NULL');}公共函数关闭(Schema $ Schema):无效

德truc hier是om De kolom toe te vogen en toe te laten dat dezemag zijn。在瓦尔德的路上,在达尔纳的路上,在科洛姆的路上mag zijn。

请注意

我们的项目是het gebruik vanCONCAT(LOWER(城市),'-',年)我的天哪!在那个“geeval zouden we de“echte”Slugger moeten gebruiken。

De migratie zou nu goed moeten verlopen:

1
ob娱乐下载Symfony控制台原则:迁移:迁移

在数据库中,有一个数据库,在数据库中,有一个数据库:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
——/ src /实体/ Conference.php+ + + b / src /实体/ Conference.php@@ -6,8 +6,10 @@使用App\Repository\ConferenceRepository;使用原则\常见\ \ ArrayCollection集合;使用原则\常见\集合\集合;使用Doctrine\ORM\Mapping作为ORM;+使用Syob娱乐下载mfony \桥\学说\验证器\ \ UniqueEntity约束;# (ORM \实体(repositoryClass: ConferenceRepository::类))+ #【UniqueEntity(“鼻涕虫”)]class Conference {#[ORM\Id] @@ -27,7 +29,7 @@ class Conference #[ORM\OneToMany(mappedBy: ' Conference ', targetEntity: Comment::class, orphanRemoval: true)] private Collection $comments;#[ORM\列(长度:255)]+ #[ORM\列(类型:'string',长度:255,唯一:true)]字符串$slug = null;公共函数__construct()

Zoals je misschien al had geraden, moeten we de migration -truc uitvoeren:

1
ob娱乐下载Symfony控制台make:迁移
1
ob娱乐下载Symfony控制台原则:迁移:迁移

蛞蝓genereren

leesbaar在URL中(waar alles代表ASCII-tekens编码),是uitdagenda taak。再见恩格斯。锄转换器jeenaarebijvoorbeeld吗?

在plats van het wiel opnieuw uit te vinden, gebruiken we de Symob娱乐下载fony字符串组件,die de manipulatie van strings makkelijker maakt en een重击者bevat。

Voeg甚至computeSlug ()Methode toe aan de会议-class die de slug baseert op de gegeevens van de conferentie:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
——/ src /实体/ Conference.php+ + + b / src /实体/ Conference.php@@ -7,6 +7,7 @@使用Doctrine\Common\Collections\ArrayCollection;使用原则\常见\集合\集合;使用Doctrine\ORM\Mapping作为ORM;使用Syob娱乐下载mfony \桥\学说\验证器\ \ UniqueEntity约束;+使用Syob娱乐下载mfony轰\组件\字符串\ \ SluggerInterface;#[ORM\Entity(repositoryClass: ConferenceRepository::class)] #[UniqueEntity('slug')] @@ -47,6 +48,13 @@ class Conference return $this->id;}+公共函数computeSlug+ {+ if (!$这->鼻涕虫|| '-' === $this->slug) {+ $ this - >蛞蝓=(字符串)重击者- >蛞蝓((字符串)这个美元)- >低();+}+}+公共函数getCity(): ?string{返回$this->city;

computeSlug ()-methode bouwt alleen een slug op wanneer de huidige slug leg是gelijk是aan de speciale waarde-.Waarom hebben we de speciale waarde-nodig吗?Omdat bij het tovoegen van een conference在后端,de slug noodle zakelijk是。我们甚至可以用我们所能用的语言来表达我们的应用。

甚至复杂的生命周期回调definiëren

净额createdAt-property, moet de鼻涕虫自动的,自动的,自动的,自动的,自动的,自动的computeSlug方法。

Maar omdat deze方法afhankelijk是van甚至是实施vanSluggerInterface, kunnen we geenprePersist-event tovoegen zoals voorheen(我们在注入的过程中遇到了困难)。

Maak in plaats daarvan een Doctrine实体听众:

src / EntityListener / ConferenceEntityListener.php
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
名称空间应用程序EntityListener使用应用程序实体会议使用学说ORM事件LifecycleEventArgs使用ob娱乐下载组件字符串重击者SluggerInterfaceConferenceEntityListener公共函数__construct(私有的SluggerInterface重击者,){}公共函数prePersist(会议会议, LifecycleEventArgs事件会议->computeSlug (->重击者);}公共函数preUpdate(会议会议, LifecycleEventArgs事件会议->computeSlug (->重击者);}}

Merk op de slug word bijgewerkt wanneer er even nieuwe conference word aangemaakt (prePersist ()) en wanneer deze word bijgewerkt (preUpdate ()).

在集装箱配置中进行服务

Tot nu toe hebben we het niet gehad over één belangrijk onderdeel van ob娱乐下载Symfony, de依赖注入容器.集装箱是verantwoordelijk voor het beheer van De服务: het creëren en injecteren van de服务没有人想要。

即使服务是“全局”对象数据函数biedt (bv。even mailer, even logger, even slugger等)在tegenstelling totdata-objecten(bv。instanties van Doctrine-entity’s)。

Je hebt zelden直接交互met de container, omdat deze automatisch service-objecten injecteert wanneer Je ze nodig hebt: de container injecteert de objecten als argumenten van de controller wanneer Je ze type-hint bijvoorbeeld。

Als je je afvroeg hoe de event listener in de vorige stap werd geregistreerd, dan heb je nu het antwoord: de container。需要有特定的接口实施者,而不需要有容器类实施者。

Omdat onze类geen enkele接口实施者的gebruik maakt van een基类,weet Symfony niet hoe deze自动完成g配置ureerd moetob娱乐下载 worden。我们kunnen hier een attribute gebruiken om de Sob娱乐下载ymfony container te laten weten hoe deze geïnitialiseerd moet worden:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
——/ src / EntityListener / ConferenceEntityListener.php+ + + b / src / EntityListener / ConferenceEntityListener.php@@ -3,9 +3,13 @@名称空间的应用程序\ EntityListener;使用App \实体\会议;+使用原则\包\ DoctrineBundle \ \ AsEntityListener属性;使用原则\ ORM \ \ LifecycleEventArgs事件;+使用原则\ ORM \事件;使用Syob娱乐下载mfony轰\组件\字符串\ \ SluggerInterface;+#[AsEntityListener(event: Events::prePersist, entity: Conference::class)]+#[AsEntityListener(event: Events::preUpdate, entity: Conference::class)]类ConferenceEntityListener{公共函数__construct(

请注意

Verwar Doctrine事件的听众没有遇到Symfony的听众。ob娱乐下载看一看这条路,看一看这条路,看一看这条路。

Het gebruik van slugs in de applicatie

在het jaar van een bestaande会议的后端en verander de stad的Probeer meer会议脚趾te voegen;De slug zal niet worden bijgewerkt,代表着特殊的事物--waarde gebruikt。

De laatste wijziging是het bijwerken van De controllers en De templates om鼻涕虫Van de conferentie te gebruiken voor routes,在平原Van hetidVan de conferentie:

12 34 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 43 44 45 46 47 48
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -20,7 +20,7 @@类ConferenceController扩展AbstractController]);}- #[路线(“/会议/ {id}”,名字:“会议”))+ #[路线(“/会议/{蛞蝓}”,名字:“会议”))公共函数show(Request $ Request, Conference $ Conference, CommentRepository $ CommentRepository): Response {$offset = max(0, $ Request ->query->getInt('offset', 0));——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -18,7 +18,7 @@

Guestbook


. {% endfor %}
.——/模板/会议/ index.html.twig+ + + b /模板/会议/ index.html.twig@@ -8,7 +8,7 @@{% for conference in meetings %}

{{conference}}

. {% for conference in meetings %}

{{conference}- 查看 . id})}}+ 查看 . slug})}}

{% endfor %} {% endblock %}——/模板/会议/ show.html.twig+ + + b /模板/会议/ show.html.twig@@ -22,10 +22,10 @@{% endfor %} {% if previous >= 0 %}- > . id, offset: previous})}}"> previous . id, offset: previous}+ < / >{% endif %} {% if next < comments|length %}- 下一个 . id, offset: next})}}+ 下一个 . > . > . >{% endif %} {% else %}
本次会议尚未发布任何评论

De conferentiepagina的moeten nu angeroepen worden via De slug:

/会议/阿姆斯特丹- 2019
此工作,包括代码示例,是根据知识共享协议BY-NC-SA 4.0许可证。