Zarządzanie cyklemżycia obiektow教义
Zarządzanie cyklemżycia obiektow教义
Byłoby wspaniale, gdyby przy tworzeniu nowego komentarza atrybutcreatedAt
przyjąłautomatycznie wartośćbieżącej daty我godziny。
教义oferuje wiele możliwości manipulowania obiektami我我atrybutami podczas cyklu我życia (przed utworzeniem rekordu w bazie danych,阿宝aktualizacji rekordu,…)。
Definiowanie wywołańzwrotnych cyklużycia (ang。生命周期回调)
Jeśli schemat działania聂wymaga dostępu做żadnej usługi我马zastosowanie tylko做jednego rodzaju encji, należy zdefiniowaćwywołanie zwrotne (ang。回调)w klasie encji:
1 2 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@@ 6 6 + 6,7 @@使用App \ Repository \ CommentRepository;使用原则\ ORM \ ORM映射;# (ORM \实体(repositoryClass: CommentRepository::类))+ # (ORM \ HasLifecycleCallbacks)类评论{# [ORM \ Id] @@ -90, 6 + 91, 12美元@@类评论返回;}+ # (ORM \ PrePersist)+公共setCreatedAtValue()函数+ {+ $ this - > createdAt = new \ DateTimeImmutable ();+}+公共函数getConference(): ?会议{返回$ this - >会议;
ZdarzenieORM \ PrePersist
jest emitowane, gdy obiekt jest阿宝拉兹pierwszy zapisany w bazie danych。Gdy达克sięstanie, wywołana zostanie metodasetCreatedAtValue ()
,jako wartośćatrybutucreatedAt
我czas zostanie użyta bieżąca数据。
Dodawanie slugow做konferencji
Adresy URL konferencji聂mowią南zbyt wiele:/会议/ 1
。公司więcej, sązależne od szczegołow implementacji (klucz podstawowy w bazie danych jest widoczny国防后勤局użytkownika)。
一个gdyby达克użyćadresow URL następującej formie:- 2020 /会议/巴黎
吗?Wyglądałoby到o wiele lepiej。片段巴黎- 2020
jest tym, określamy mianem鼻涕虫。
Dodaj nowy atrybut o nazwie鼻涕虫
国防后勤局konferencji(极przechowujące ciąg znakow o długości做255 znakow nieprzyjmujące wartości零
):
1
美元ob娱乐下载symfony控制台:实体会议
Utworz plik migracji,赎dodaćnowąkolumnę:
1
美元ob娱乐下载symfony控制台:迁移
我wykonaj nowo utworzonąmigrację:
1
美元ob娱乐下载symfony控制台学说:迁移:迁移
Widzisz komunikat błędu吗?对oczekiwany efekt。Dlaczego吗?Ponieważzdefiniowaliśmy kolumnę鼻涕虫
德,赎聂przyjmowała wartości零
。Jeśli migracja zostałaby wykonana, rekordy konferencji istniejące w bazie danych otrzymałyby wartość零
w kolumnie鼻涕虫
。Naprawmy, modyfikując nasząmigrację:
1 2 3 4 5 6 7 8 9 10 11 12 13
- - - /迁移/ Version00000000000000.php+ + + b /迁移/ Version00000000000000.php@@ -20 7 + 20 9 @@最终类Version00000000000000延伸AbstractMigration公共函数(模式美元):空白{/ /这个()迁移是自动生成的,请修改它来满足您的需求- $ this - > addSql (“ALTER TABLE会议添加蛞蝓VARCHAR (255) NOT NULL”);+ $ this - > addSql (“ALTER TABLE会议添加蛞蝓VARCHAR (255)”);+ $ this - > addSql(“更新会议设置蛞蝓= CONCAT(低(市),“-”,年)");+ $ this - > addSql (“ALTER TABLE会议改变柱塞集非空的);}公共函数(模式美元):空白
Sztuczka polega na tym,赎najpierw dodaćkolumnę我pozwolićna dodanie w niej wartości零
,następnie zmodyfikowaćistniejące rekordy ustawiając wartość鼻涕虫
na wartośćinnąniż零
,na koniec zmodyfikowaćkolumnę鼻涕虫
,达克赎wartość零
聂była dozwolona。
请注意
W realnym projekcie używanieCONCAT(低(市),“-”,年)
może okazaćsięniewystarczające。W takim przypadku będziemy musieli użyćSluggera“prawdziwego”。
Tym razem migracja powinna wykonaćsię木菠萝należy:
1
美元ob娱乐下载symfony控制台学说:迁移:迁移
Ponieważaplikacja wkrotce użyje slugow做odnajdowania wymaganej konferencji, dostosujmy encję会议赎zagwarantować,że wartości slugow będąunikalne w bazie danych:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
- - - / src /实体/ Conference.php+ + + b / src /实体/ Conference.php@@ 6、8 + 6、10 @@使用App \ Repository \ ConferenceRepository;使用原则\常见\ \ ArrayCollection集合;使用原则\常见\集合\集合;使用原则\ ORM \ ORM映射;+使用Syob娱乐下载mfony \桥\学说\验证器\ \ UniqueEntity约束;# (ORM \实体(repositoryClass: ConferenceRepository::类))+ #【UniqueEntity(“鼻涕虫”)]类会议{# [ORM \ Id] @@ -27, 7 + 29日7 # @@类会议[ORM \ OneToMany (mappedBy:“会议”,targetEntity:备注::类,orphanRemoval: true)]美元私人评论;- # [ORM \列(类型:字符串,长度:255)]+ # [ORM \列(类型:字符串,长度:255年,独特:true))私人美元弹头;公共函数__construct ()
木菠萝można siębyło domyślać,musimy wykonaćkolejne migracje:
1
美元ob娱乐下载symfony控制台:迁移
1
美元ob娱乐下载symfony控制台学说:迁移:迁移
Generowanie slugow
Generowanie slugow, ktore zachowajączytelnośćbędąc częściąadresu URL (gdzie wszystko oprocz znakow ASCII powinno byćzakodowane)聂jestłatwym zadaniem, szczegolnie w przypadku językow innych niżangielski。木菠萝przekonwertujesz na przykłade
做e
吗?
Zamiast wymyślaćkoło na nowo, użyjmy komponentu Sob娱乐下载ymfony o nazwie字符串
,ktory ułatwia manipulacjęciągami znakow, oraz dostarcza między innymi mechanizmsluggera。
Dodaj w klasie会议
metodęcomputeSlug ()
,ktorej zadaniem będzie utworzenie sluga na podstawie danych konferencji:
1 2 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 @@使用原则\常见\ \ ArrayCollection集合;使用原则\常见\集合\集合;使用原则\ ORM \ ORM映射;使用Syob娱乐下载mfony \桥\学说\验证器\ \ UniqueEntity约束;+使用Syob娱乐下载mfony轰\组件\字符串\ \ SluggerInterface;# (ORM \实体(repositoryClass: ConferenceRepository::类)]#【UniqueEntity(“鼻涕虫”)]@@ -47年6 + 48岁13 @@类会议返回$ this - > id;}+公共职能computeSlug (SluggerInterface重击者美元)+ {+如果(!美元这- >鼻涕虫|| '-' === $this->slug) {+ $ this - >蛞蝓= (string) $重击者- >蛞蝓((字符串)这个美元)- >低();+}+}+公共函数getCity(): ?字符串{返回$ this - >城市;
MetodacomputeSlug ()
tworzy蛞蝓tylko wtedy, gdy aktualny蛞蝓jest pusty滑ustawiony na specjalnąwartość- - - - - -
。阿宝有限公司南ta specjalna wartość- - - - - -
吗?Ponieważprzy dodawaniu konferencji w panelu administracyjnym蛞蝓jest wartościąwymaganą。Potrzebujemy zatem niepustej wartości ktora przekaże aplikacji,że chcemy,赎蛞蝓zostałwygenerowany automatycznie。
Definiowanie złożonych wywołańzwrotnych cyklużycia (ang。生命周期回调)
Podobnie木菠萝w przypadku atrybutucreatedAt
,gdy konferencja zostaje zmodyfikowana, wartośćatrybutu鼻涕虫
powinna zostaćautomatycznie uaktualniona poprzez wywołanie metodycomputeSlug ()
。
Ponieważmetoda zależy od implementacjiSluggerInterface
聂możemy w prosty sposob dodaćobsługi zdarzeniaprePersist
,木菠萝miało miejsce w poprzednim przypadku (nie mamy możliwości wstrzyknięcia sluggera)。
Zamiast迪高utworz nasłuchiwacz zdarzeń学说(ang。教义实体侦听器):
Zauważ,że蛞蝓jest aktualizowany w momencie gdy tworzona jest现代”konferencja (prePersist ()
)我gdy jest ona modyfikowana (preUpdate ()
)。
Konfigurowanie usługi w kontenerze
做tej pory聂mowiliśmy o jednym z kluczowych komponentow Symfonob娱乐下载y, czyli啊kontenerze wstrzykiwania zależności(ang。依赖注入容器)。Kontener jest odpowiedzialny咱zarządzanieusługami(ang。服务):我tworzenie我wstrzykiwanie kiedy sąwymagane。
Usługa(ang。服务)开玩笑obiektem“globalnym ktory oferuje rożnego rodzaju funkcje (np。梅勒,记录器,重击者itp) w odrożnieniu odobiektow danych(np。instancje encji学说)。
Rzadko wchodzi sięw bezpośredniąinterakcjęz kontenerem ponieważautomatycznie wstrzykuje在obiekty usług kiedy sąwymagane: na przykład, sprawdzając typ argumentu kontrolera zdefiniowany przy użyciu mechanizmu podpowiadania typow (ang。类型提示),kontener wstrzykuje odpowiedni typ usługi。
Jeśli zastanawiało Cię,木菠萝w poprzednim kroku zostałzarejestrowany nasłuchiwacz zdarzeń(ang。事件监听器),teraz poznasz odpowiedź:poprzez kontener。Kiedy klasa implementuje określone interfejsy kontener体育运动,że klasa musi byćzarejestrowana w określony sposob。
Niestety,十rodzaj automatyzacji聂zawsze jest możliwy, zwłaszcza w przypadku zewnętrznych zależności。Nasłuchiwacz zdarzeń,ktory właśnie utworzyliśmy, jest jednym z takich przykładow——聂może byćautomatycznie zarządzany przez kontener usług Symfonob娱乐下载y, ponieważ聂implementujeżadnego interfejsu我聂rozszerza„dobrze znanej klasy”。
Musimy częściowo zadeklarowaćnasz nasłuchiwacz w kontenerze。Możemy pominąćdefiniowanie usług, ktore powinny zostaćwstrzyknięte, ponieważkontener będzie w stanie我określićautomatycznie,啤酒musimy ręcznie dodaćkilkatagow,赎zarejestrowaćnasz nasłuchiwacz w dyspozytorze zdarzeń(ang。事件调度器)原则:
1 2 3 4 5 6 7 8 9 10
- - - / config / services.yaml+ + + b / config / services.yaml@@ -22 3 + 22 7 @@服务:#添加更多的服务定义当显式配置是需要#请注意,最后总是*取代*之前的定义+应用\ EntityListener \ ConferenceEntityListener:+标签:+ -{名字:“doctrine.orm。entity_listener', event: 'prePersist', entity: 'App\Entity\Conference'}+ -{名字:“doctrine.orm。entity_listener', event: 'preUpdate', entity: 'App\Entity\Conference'}
请注意
聂należy mylićnasłuchiwaczy zdarzeń学说我Symfony。ob娱乐下载米姆że wyglądająbardzo podobnie, pod spodem korzystająz osobnych mechanizmow。
Stosowanie slugow w aplikacji
Sprobuj dodaćkilka konferencji w panelu administracyjnym我zmienićmiasto滑韩国jednej z nich。蛞蝓聂zostanie w tym przypadku zaktualizowany, chybaże użyjesz specjalnej wartości- - - - - -
。
Ostatniązmianąjest aktualizacja kontrolerow我szablonow,达克赎mechanizm routingu wykorzystywał鼻涕虫
zamiastid
konferencji。
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 43 44 45 46 47 48
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -28 7 + 28 7 @@类ConferenceController延伸AbstractController]));}- #[路线(“/会议/ {id}”,名字:“会议”))+ #[路线(“/会议/{蛞蝓}”,名字:“会议”))公共函数显示(请求请求美元,美元会议,会议CommentRepository CommentRepository美元):反应{抵消美元= max(0美元请求- >查询- > getInt(“抵消”,0));- - - /模板/ base.html.twig+ + + b /模板/ base.html.twig7 @@ @@ -18年7 + 18日<标题> < a href = "{{路径(主页)}}" >留言板< / > < / h1 > < ul >{%为会议会议%}——<李> < a href = "{{路径(“会议”,{id:会议。id})}} " >{{会议}}< / > < /李>+ <李> < a href = "{{路径(“会议”,{蛞蝓:会议。蛞蝓})}}" >{{会议}}< / > < /李>{% endfor %} < / ul > <人力资源/ >- - - /模板/会议/ index.html.twig+ + + b /模板/会议/ index.html.twig7 + 8 @@ 8日,7 @@{%为会议会议%}< h4 >{{会议}}< / h4 > < p >- < a href = "{{路径(“会议”,{id:会议。视图id})}} " > < / >+ < a href = "{{路径(“会议”,{蛞蝓:会议。蛞蝓})}}" > < / >视图< / p > {% endfor %} {% endblock %}- - - /模板/会议/ show.html.twig+ + + b /模板/会议/ show.html.twig-22年@@ 10 @@ 10 + 22日{% endfor %}{%如果先前> = 0%}- < a href = "{{路径(“会议”,{id:会议。id,抵消:以前})之前}}" > < / >+ < a href = "{{路径(“会议”,{蛞蝓:会议。蛞蝓,抵消:以前})之前}}" > < / >{% endif %}{%长度如果下一个<评论| %}- < a href = "{{路径(“会议”,{id:会议。id,抵消:明年})}}" > < / >+ < a href = "{{路径(“会议”,{蛞蝓:会议。蛞蝓,抵消:明年})}}" > < / >{% endif %}{%其他%}< div >这个会议还没有发表评论。< / div >
Dostęp做stron konferencji powinien byćteraz możliwy z wykorzystaniem sluga:
Idąc dalej
- 系统zdarzeń学说(生命周期回调函数和听众,听众和实体生命周期用户);
- Dokumentacja komponentu字符串;
- Kontener usług;
- Ściągawka ob娱乐下载Symfony服务。