管理主义对象的生命周期
管理主义对象的生命周期
当创建一个新的评论,这将是伟大的如果createdAt
日期会自动设置为当前日期和时间。
教义有不同的方式来操纵对象及其属性在其生命周期(之前创建数据库中的行,行被更新后,…)。
定义生命周期回调
当行为不需要任何服务,应该只适用于一种实体,实体类定义一个回调:
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 - >会议;
的ORM \ PrePersist
事件当对象被存储到数据库中触发第一次。当这种情况发生时,setCreatedAtValue ()
方法被调用,使用当前日期和时间的价值createdAt
财产。
添加蛞蝓会议
会议的网址是没有意义的:/会议/ 1
。更重要的是,他们依靠一个实现细节(泄露数据库中的主键)。
使用url什么样- 2020 /会议/巴黎
而不是?看起来好多了。巴黎- 2020
就是我们所说的会议吗鼻涕虫。
添加一个新的鼻涕虫
财产会议(255年不是可以为空字符串的字符):
1
美元ob娱乐下载symfony控制台:实体会议
创建一个迁移文件添加新列:
1
美元ob娱乐下载symfony控制台:迁移
和执行,新移民:
1
美元ob娱乐下载symfony控制台学说:迁移:迁移
有一个错误吗?这是预期。为什么?因为我们不要求“鼻涕虫”零
但会议数据库中会得到一个现有条目零
当迁移价值。让我们通过调整迁移:
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会议改变柱塞集非空的);}公共函数(模式美元):空白
技巧在于添加列,并允许它零
,然后设置蛞蝓零
价值,最后,蛞蝓列不允许改变零
。
请注意
对于一个真正的项目,使用CONCAT(低(市),“-”,年)
可能还不够。在这种情况下,我们需要使用“真实”棒球强击手。
移民应该运行好了:
1
美元ob娱乐下载symfony控制台学说:迁移:迁移
因为应用程序很快就会用子弹找到每一个会议,让我们调整会议中是唯一的实体,以确保弹头值数据库:
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 ()
您可能已经猜到,我们需要执行迁移的舞蹈:
1
美元ob娱乐下载symfony控制台:迁移
1
美元ob娱乐下载symfony控制台学说:迁移:迁移
生成蛞蝓
生成一个鼻涕虫,在一个URL(除了ASCII字符编码)是一项具有挑战性的任务,尤其是对除英语之外的其他语言。你怎么转换e
来e
例如呢?
不要重新发明轮子,让我们使用Symfonyob娱乐下载字符串
组件,它简化了操纵字符串并提供重击者。
添加一个computeSlug ()
方法会议
类,根据会议数据计算段塞:
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 - >城市;
的computeSlug ()
方法只计算一个鼻涕虫当当前蛞蝓是空的或一组特别的- - - - - -
价值。我们为什么需要- - - - - -
特殊的价值?因为当后端增加一个会议上,“鼻涕虫”是必需的。所以,我们需要一个非空值,它告诉我们希望“鼻涕虫”的应用程序自动生成。
定义一个复杂的生命周期回调
至于createdAt
财产,鼻涕虫
应该设置一个自动每次会议是通过调用更新computeSlug ()
方法。
但这种方法取决于SluggerInterface
实现,我们不能添加prePersist
事件和之前一样(我们没有办法注入重击者)。
相反,创建一个教义实体侦听器:
注意,蛞蝓更新当创建一个新的会议(prePersist ()
),当它被更新(preUpdate ()
)。
配置一个服务容器
到目前为止,我们还没有谈论Symfony的一个关键组成部分,ob娱乐下载依赖注入容器。容器负责管理服务:创建它们,注射时必要的。
一个服务是一个“全球”对象,它提供的特性(如梅勒,一个记录器,一记,等等)与数据对象(例如教义实体实例)。
你很少直接接触容器,因为它自动将服务对象无论何时你需要他们:容器注入控制器参数对象例如type-hint时。
如果你想知道在前一步注册事件侦听器,您现在有答案:容器。当一个类实现一些特定的接口,容器需要知道类注册以某种方式。
不幸的是,自动化不提供一切,尤其是第三方包。实体的听众,我们只写了就是这样的一个例子;它不能被管理的Symfony服务容器会自动为它没有实现任ob娱乐下载何接口,它不扩展“出名的阶级”。
我们需要部分声明的侦听器容器。依赖布线可以省略容器,因为它仍然可以猜到,但我们需要手动添加一些标签注册侦听器与教义事件调度程序:
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'}
请注意
不要混淆原则事件监听器和Symfony的。ob娱乐下载即使他们看起来非常相似,他们不使用相同的基础设施。
在应用程序中使用蛞蝓
尝试在后台添加更多的会议,改变现有的城市或一年;“鼻涕虫”不会更新如果你使用特殊的除外- - - - - -
价值。
最后改变是更新控制器和模板使用会议鼻涕虫
而不是会议id
路线:
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 >
访问会议页面现在应该通过它的鼻涕虫:
要进一步
- 的事件系统原则(生命周期回调函数和听众,听众和实体生命周期用户);
- 的字符串组件文档;
- 的服务容器;
- 的ob娱乐下载Symfony服务小抄。