管理主义对象的生命周期
管理主义对象的生命周期
当创建一个新的评论,这将是伟大的如果createdAt
日期会自动设置为当前日期和时间。
教义有不同的方式来操纵对象及其属性在其生命周期(之前创建数据库中的行,行被更新后,…)。
定义生命周期回调
当行为不需要任何服务,应该只适用于一种实体,实体类定义一个回调:
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
- - - / src /实体/ Comment.php+ + + b / src /实体/ Comment.php@@ 7,6 + 7,7 @@使用原则\ DBAL \类型\类型;使用原则\ ORM \ ORM映射;# (ORM \实体(repositoryClass: CommentRepository::类))+ # (ORM \ HasLifecycleCallbacks)类评论{# [ORM \ Id] @@ -91, 6 + 92, 12美元@@类评论返回;}+ # (ORM \ PrePersist)+公共setCreatedAtValue()函数+ {+ $ this - > createdAt = new \ DateTimeImmutable ();+}+公共函数getConference(): ?会议{返回$ this - >会议;- - - / src /控制器/ Admin / CommentCrudController.php+ + + b / src /控制器/ Admin / CommentCrudController.php@@ -56 8 + 56 6 @@类CommentCrudController延伸AbstractCrudController]);如果(Crud:: PAGE_EDIT= = = $ pageName) {收益率$ createdAt - > setFormTypeOption(“禁用”,真正的);-其他}{——收益率createdAt美元;}}}
的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娱乐下载相反,我们可以使用一个属性告诉Symfony容器如何线:ob娱乐下载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
- - - / src / EntityListener / ConferenceEntityListener.php+ + + b / src / EntityListener / ConferenceEntityListener.php13 @@ @@ 3 9 + 3名称空间的应用程序\ EntityListener;使用App \实体\会议;+使用原则\包\ DoctrineBundle \ \ AsEntityListener属性;+使用原则\ ORM \事件;使用原则\持久性事件\ \ LifecycleEventArgs;使用Syob娱乐下载mfony轰\组件\字符串\ \ SluggerInterface;+ # [AsEntityListener(事件:事件::prePersist实体:会议::类))+ # [AsEntityListener(事件:事件::preUpdate实体:会议::类))类ConferenceEntityListener{公共函数__construct (
请注意
不要混淆原则事件监听器和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@@ -20 7 + 20 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服务小抄。