Жизненный икл объектов主义
Жизненный икл объектов主义
Былобынеплохо,еслиприсозданииновогокомментариязначениеполяcreatedAt
автоматическизаполнялосьтекущимидатойивременем。
教义можетпо——разномуманипулироватьобъектамииихсвойствамивразличныхстадияхжизненногоцикла(довставкизаписивбазуданных,послеобновлениязаписиитд)。。
Определениеобратныхвызововсобытийжизненногоцикла
Еслилогиканетребуетдоступаксервисуиприменяетсятолькокодномутипусущности,можноопределитьобратныйвызоввклассесущности:
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->会议;
СобытиеORM \ PrePersist
срабатывает,когдаобъектвпервыесохранятсявбазеданных。В р о о ом м м мен р р о о о о о о о о о о о оsetCreatedAtValue ()
,которыйиспользуеттекущиедатуивремявкачествезначениядлясвойстваcreatedAt
.
Добавление слагов дл конферен
Сейчас url -а од реса конферен н и р р ро/会议/ 1
не о и ен понятны。,Болеетогоонираскрываютдеталиреализацииприложения(значениепервичногоключа1
доступнопользователю)。
Почему бы не испол зо са т url -ад с еса и ида- 2020 /会议/巴黎
?Они и намно о о о о л и и и и и。Фрагментадреса巴黎- 2020
——этослаг(и ело о е еко он тна а а а а ас с с са) конфе е ен ии。
Добавьте но о о о о с о о о ст о鼻涕虫
вклассконференции(строкадлинойд255осимволов,котораянеможетбытьпустой):
1
$ob娱乐下载symfony控制台make:实体会议
Создайтефайлмиграции,чтобыдобавитьновыйстолбец:
1
$ob娱乐下载Symfony控制台make:迁移
А затем р о олнит и но о и и и
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
Увиделиошибку吗?Этобылоожидаемо,потомучтомыуказали,чтосвойство鼻涕虫
не должно б т т т пуст т м (содержать зна с ение零
).Нововремямиграциисуществующиевбазеданныхзаписиконференцийбудутперезаписанызначениями零
.Давайтеисправимэто,поменявлогикупроцессамиграции:
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):无效
Мыприменилинекоторуюхитрость:сначаладобавляемстолбецслагасвозможностьюиметьзначениепоумолчанию-零
,далеесоздаёмслагдлясуществующихзаписей(тоестьзаполняемновыйстолбецзначениями,отличнымиот零
),азатемизменяемстолбецслагатак,чтобыононнепозволялхранитьзначение零
.
请注意
В didn ' еал ном проект т испол зо В ание выраженияCONCAT(LOWER(城市),'-',年)
может б т т т едостато с н м。Втакомслучаепонадобитсяиспользовать”настоящий”сервисдлягенерациислага(слагер)。
Теперь ми и и с а а и и и и про и т т без ошибок:
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()
Каквымоглидогадаться,намнужновыполнитьпроцедурумиграции:
1
$ob娱乐下载Symfony控制台make:迁移
1
$ob娱乐下载Symfony控制台原则:迁移:迁移
Генерацияслагов
Вомногихязыкахсоздатьслаг,которыйхорошочитаетсявURL -адресе(гдедолжнобытьзакодировановсе,кромеASCII -символов),нетак-топросто。К по имеру, как помен т тe
наe
?
Чтобынеизобретатьвелосипед,давайтевоспользуемсяSymfonob娱乐下载y -компонентом字符串
,которыйнетолькооблегчаетработусостроками,ноисодержитслагер.
Вкласс会议
добавьтеметодcomputeSlug ()
,которыйисходяизданныхконференциисгенерируетслаг:
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 ()
генерируетслагтольковтомслучае,еслизначениеслагаотсутствует,либоуказанныйслагимеетспециальноезначение-
.Но за а и ем оно Но нужно?Посколькуслагнеможетбытьпусты,мпридобавленииконференциивадминистративнойпанелинамнужноуказатьнекоеспециальноезначениев(нашемслучае--
)всоответствующемполе,чтобысообщитьприложению,чтоонодолжноавтоматическисгенерироватьслаг。
Определениесложныхобратныхвызововжизненногоцикла
По анало о ии о о со о о ст о оcreatedAt
,свойство鼻涕虫
должноавтоматическиобновлятьсяприкаждомизмененииконференциипутемвызоваметодаcomputeSlug ()
.
Но так как метод за а си си ии о о и еализа ииSluggerInterface
, мы не можем доба о ит т соб итprePersist
так,какделалиэтораньшен(етспособавнедритьслагер)。
Вместоэтогосоздайтеобработчиксущности学说:
Обратитевнимание,чтослаггенерируетсякакприсозданииновойконференции(prePersist ()
), так и п и её обновлении (preUpdate ()
).
Настройка сер и иса в конте е е
ДосихпормынеупомянулиодинизглавныхкомпонентовSymfony -кob娱乐下载онтейнервнедрениязависимостей,которыйуправляетсервисами: созда а недр е е необходимости。
Сервис”——этоглобальный“объектсопределённойфункциональностью(梅勒-отправкаэлектронныхписем,日志程序—логирование,重击者——генерацияURL -адресов。итд)。вотличиеотобъектовданных(к п п им ме п у, экземпляров сущности主义)。
Выредкобудетеработатьсконтейнеромнапрямую,посколькуонавтоматическивнедряетсервисы,когдаэтовамнеобходимо:внедрениеобъектов——сервисовпроисходит,когдавыуказываететипысоответствующихсервисоввкачествеаргументовконтроллера。
Теперьвызнаете,чтообработчиксобытиявпредыдущемпримеребылзарегистрированчерезконтейнер。Когдаклассреализуетопределённыеинтерфейсы,контейнерзнает,чтоклассдолженбытьзарегистрировансоответствующимобразом。
Здесь,посколькунашкласснереализуетниодногоинтерфейсаинерасширяетниодногобазовогокласса,Symfonyнезнает,кob娱乐下载акегоавтоматическиконфигурировать。Вместоэтогомыможемиспользоватьатрибут,чтобыуказатьконтейнеруSymfony,к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(
请注意
Непутайтеобработчикисобытий教义иобработчикисобытийSymfony。ob娱乐下载Дажееслиониоченьпохожи,онипо——разномуработаютизнутри。
Использование слагов в приложении
Попробуйтедобавитьнесколькоконференцийвадминистративнойпанели,либоизменитегородилигодпроведенияужесозданныхконференций;слагнеобновится,толькоесливынеукажетевегополеспециальноезначение--
.
Осталосьсделатьпоследнееизменение——заменитьвконтроллерахишаблонахпараметрмаршрутовконференцийсid
на鼻涕虫
:
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 %} 本次会议尚未发布任何评论
Теперьможноперейтикстраницеконференциичерезеёслаг:
Двигаемсядальше
- Система соб и ти и и(обратныевызовыиобработчикисобытийжизненногоцикла,обработчикисущностейиподписчикижизненногоцикла);
- Документация компонента字符串;
- Сервис-контейнер;
- Шпаргалка по се е висаob娱乐下载м Symfony.