扎扎茨赞尼cyklem zycia obiektów主义
扎扎茨赞尼cyklem zycia obiektów主义
byzoby wspanale, gdyby przy tworzeniu nowego komentarza atrybutcreatedAt
przyjagiwautatycznie wartotzic biewazicej daty I godziny。
教条的eruje wiele moitzliwowicci manipulowania obiektami i ich atrybutami podczas cyklu ich zynia (przed utworzeniem rekordu w bazie danych, po aktualizacji rekordu,…)。
定义iowanie wywoyanukovzwrotnych cyklu zyncia (ang。生命周期回调)
jeutli schemat dziazania nie wymaga dostzynpu do avadnej ususugi ma zastosowanie tylko do jednego rodzaju encji, nalevy zdefiniowach wywoyanie zwrone (ang。回调)w klasie encji:
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->会议;
ZdarzenieORM \ PrePersist
Jest emitowane, gdy obiekt Jest Po raz pierwszy zapisany w bazie danych。Gdy tak się stanie, wywoyana zostanie metodasetCreatedAtValue ()
jako wartotich atrybutucreatedAt
乌茨塔比亚扎卡数据I czas。
Dodawanie slugów do konferencji
地址URL konferencji nie mówią nam zbyt wiele:/会议/ 1
.Co wiechcej, są one zalepne od szczegółów implementacji (klucz podstawowy w bazie danych jest widoczny dla uuytkownika)。
A gdyby tak uvyk adresów URL nastcippujagicej formie:- 2020 /会议/巴黎
?wygldaoloby to o wiele lepiej。片段巴黎- 2020
开玩笑吧,我爱你鼻涕虫.
Dodaj现在尝试,但是nazwie鼻涕虫
Dla konferencji (pole przechowujcig znaków o duugoi do 255 znaków, nieprzyjmujce wartoci零
):
1
$ob娱乐下载symfony控制台make:实体会议
Utwórz plik migracji, aby dodaic nową kolumnę:
1
$ob娱乐下载Symfony控制台make:迁移
我wykonaj现在utworzoną migrację:
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
Widzisz komunikat bzynucdu ?致oczekiwany efekt。Dlaczego吗?poniewa耶扎兹definiowaliemikolumnę鼻涕虫
Tak, aby nie przyjmowaova wartowici零
.jeutli migracja zostababy wykonana,到rekordy konferencji istniejensce w bazie danych otrzymaoyby wartowicch零
w kolumnie鼻涕虫
.Naprawmy to, modyfikujh3c naszą migrację:
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):无效
Sztuczka polega na tym, aby najpierw dodaic kolumnę i pozwolich na dodanie w niej wartowicci零
,纳斯特洛普尼兹莫迪菲科瓦奇istniejensce rekordy ustawiajensc wartowicch鼻涕虫
娜瓦托维奇inną尼耶扎零
, a na koniec zmodyfikowak kolumnę鼻涕虫
,达克阿比瓦托维奇零
聂比娅·多夫罗娜。
请注意
W realnym projekcie乌泽瓦尼CONCAT(LOWER(城市),'-',年)
莫埃·冈扎克się niewystarczajzhece。W takim przypadku bluddziemy musieli utsek“prawdziwego”Sluggera。
Tym razem migracja powinna wykonack się jak nalevy:
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
波尼瓦耶扎扎普利卡加wkrótce乌泽耶slugów do odnajdowania wymaganej konferencji, dostosujmy encję会议aby zagwarantowaich, zye wartowicci slugów będą unikalne w bazie danych:
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()
贾克·莫伊纳się拜约·多米耶拉克,musimy wykonak kolejne migracje:
1
$ob娱乐下载Symfony控制台make:迁移
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
Generowanie slugow
Generowanie slugów, które zachowają czytelno维奇bzydzhec częścią adresu URL (gdzie wszystko oprócz znaków ASCII powinno byich zakodowane) nie jest zatwym zadaniem, szczególnie w przypadku języków innych ni耶扎吉尔斯基。Jak przekonwertujesz na przyksade
做e
?
扎米亚斯特·维米耶拉克·科乌乌斯特·科乌米·科帕内图·塞弗尼·诺兹维ob娱乐下载字符串
, który uutatwia manipulację cigami znaków, oraz dostarcza miymdzy innymi mechanizmsluggera.
Dodaj w klasie会议
metodęcomputeSlug ()
, której zadaniem banydzie utworzenie sluga na podstawie danych konferencji:
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;
MetodacomputeSlug ()
Tworzy鼻涕虫tylko wtedy, gdy aktualny鼻涕虫jest pusty lub ustawiony na specjalną wartowicch-
.Po co nam ta specjalna wartowicch-
?波尼瓦耶扎兹dodawaniu konferencji w panelu行政,jnym蛞蝓笑话wartością wymaganą。Potrzebujemy zatem niepustej wartotzci która przekaze aplikacji, ze chcemy, aby slug zosta华沙wygenerowany automatycznie。
Definiowanie zologonych wywoyakenzwrotnych cyklu zyncia (ang。生命周期回调)
Podobnie jak w przypadku atrybutucreatedAt
, gdy konferencja zostaje zmodyfikowana, wartomich atrybutu鼻涕虫
Powinna zostac automatycznie uaktualniona poprzez wywoyanie metodycomputeSlug ()
.
波尼瓦耶米托达扎莱季奇SluggerInterface
, nie mozemy w prosty sposób dodaic obssburg zdarzeniaprePersist
, jak miajo to miejsce w poprzednim przypadku (nie mamy mozliwowici wstrzykniknicia sluggera)。
扎米亚斯特·泰戈utwórz纳乌奇瓦茨·扎达泽恩学说(ang。教条实体听者):
zauwa耶扎,zue slug jest aktualizowany w momencie, gdy tworzona jest nowa konferencjaprePersist ()
)我在开玩笑(preUpdate ()
).
Konfigurowanie ususugi w kontenerze
Do tej pory nie mówiliśmy o jednym z kluczowych komponentów ob娱乐下载Symfony, czyli oKontenerze wstrzykiwania zaleebnovacci(ang。依赖注入容器)。Kontener jest odpowiedzialny za zarzagizdanie我们ługami(ang。服务):ich tworzenie I wstrzykiwanie kiedy są wymagane。
我们ł佐治亚大学(ang。服务)笑话obiektem“globalnym”,który oferuje różnego rodzaju funkcje (np。梅勒,记录器,重击器itp) w odróżnieniu odobiektow danych(np。instancje encji Doctrine)。
Rzadko wchodzi się w bezpośrednią interakcję z kontenerem, poniewa耶扎扎自重cznie wstrzykuje on obiekty usutug kiedy są one wymagane: na przykwad, sprawdzajjcc typ argumentu kontrolera zdefiniowany przy uzyciu mechanizmu podpowiadania typów (ang。打字提示),kontener wstrzykuje odpowiedni typ ususugi。
jeutli zastanawiaos Cię, jak w poprzednim kroku zostaov zarejestrowany nasuchiwacz zdarzegdn (ang。事件监听器),teraz poznasz odpowiedwarsaw: poprzez kontener。Kiedy klasa implementuje okretlone interfejsy, kontener wie, zarejestrowana wokretlony sposób。
波尼瓦耶扎扎,克拉萨,尼,施托托耶,瓦涅扎扎,涅涅拉,涅涅拉,涅涅拉,雅克ją自动瓦耶扎尼,skonfigurowaic。ob娱乐下载扎米亚斯特·泰戈·莫泽米·乌茨克·阿特里布托,阿比·波维德热耶克·康特内洛维·辛菲尼,雅克ją波德瓦茨奇:ob娱乐下载
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(
请注意
涅那列维·米利克·纳乌奇瓦奇·兹达泽恩的交响乐学说。ob娱乐下载Mimo ze wyglądają bardzo podobnie, pod spodem korzystają z osobnych mechanizmów。
Stosowanie slugów w aplikacji
Spróbuj dodaic kilka konferencji w panelu administracynym i zmiennik miasto lub rok jednej z nich。Slug nie zostanie w tym przypadku zaktualizowany, chyba zuzyjesz specjalnej warto2000ci-
.
Ostatnią zmianą笑话aktualizacja kontrolerów i szablonów, tak aby mechanizm routingu wykorzystywa华沙鼻涕虫
zamiastid
konferencji。
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
{% for conference in conferences %}- - {{conference}}
. Id})}}">{{conference}}+ - {{conference}}
.{% endfor %}
. {% 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 %} 本次会议尚未发布任何评论
dostutpp do stron konferencji powinien byk teraz moitzliwy z wykorzystaniem sluga:
Idąc dalej
- 兹达泽恩体系学说(生命周期回调和监听器,实体监听器和生命周期订阅者);
- Dokumentacja komponentu弦;
- 我们Kontenerług;
- Ściągawka ob娱乐下载Symfony Services.