新在Symfo欧宝娱乐app下载地址ny 5.3:表单处理程序辅助
2021年4月30日·发表的哈维尔Eguiluz
警告:这篇文章是关于一个不受支持的Symfony的版本。欧宝娱乐app下载地址其中一些信息可能是过时了。阅读最近的Symfony文档欧宝娱乐app下载地址。
推荐的方法处理Symfony形式欧宝娱乐app下载地址是使用一个单一动作呈现形式和处理表单提交。
在实践中就是这个样子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src /控制器/ ConferenceController.php/ /……#(路线(“/ {id} /编辑”,名字:“conference_edit”,方法:[“得到”,“POST”]))公共函数编辑(请求美元请求、会议美元会议):响应{美元形式=美元这- >createForm (ConferenceType::类,美元会议);美元形式- >handleRequest (美元请求);如果(美元形式- >isSubmitted () & &美元形式- >isValid ()) {/ /做一些与美元会议对象/ /(例如保存在数据库中)返回美元这- >redirectToRoute (“conference_show”,(“id”= >美元会议- >getId ()));}返回美元这- >呈现(“会议/ edit.html.twig”,(“形式”= >美元形式- >createView ()));}
当使用库等欧宝娱乐app下载地址Symfony UX涡轮这个简单的表单处理是不够的,你必须严格遵循HTTP协议(例如,如果表单提交,但无效的,响应必须有一个HTTP 422状态代码)。
为了简化表单处理在这些情况下,Symfony 5.3增加了一个欧宝娱乐app下载地址新(可选)辅助呈现形式。这个助手中定义AbstractController基地控制器作为一个新方法renderForm ()
。
这是最后一行前面的示例应该写在使用新助手:
1 2 3 4 5 6 7
/ / src /控制器/ ConferenceController.php/ /……返回美元这- >renderForm (“会议/ edit.html.twig”,(“形式”= >美元形式]);}
的签名renderForm ()
方法是一样的呈现()
:
1 2 3 4 5
renderForm(字符串美元视图,数组美元参数=[],响应美元响应=零):响应
这种方法使给定的形式(电话$形式- > createView ()
在内部)和设置422年
状态码当表单提交和无效的。
的美元的参数
参数是变量列表传递给树枝模板和可选的美元的反应
对象允许您配置特定属性返回的响应(例如,它的缓存选项)。
发表在#生活在边缘
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
或者更好的是:形式:getHttpCode()将返回推荐的HTTP响应代码。303在200年成功如果方法,如果不提交,422如果提交错误……然后$ this - >渲染(…,$形式- > getHttpCode ());/ /:)
我喜欢这个比老方法的呈现形式,我的大脑从未设法环绕。在我脑海中工作流是1。呈现形式,2。处理提交和呈现响应(有效或无效)。“无效的响应”通常看起来非常相似的原始形式是偶然的本质和核心API的设计。
我认为改善任何能使处理无效的形式更加明确,如从约瑟夫Kufner建议,或者增加handleForm的一个可选的可调用的签名onIvalid美元,如:“handleForm (FormInterface美元形式,请求美元请求,调用渲染美元,美元可调用onSuccess,可调用$ onInvalid = null)”
保护功能renderForm(字符串模板,美元FormInterface美元形式,数组$ params =[]):反应
{
代码=美元形式- > isSubmitted() & & ! $形式- > isValid () ?响应::HTTP_UNPROCESSABLE_ENTITY:回应::并;
返回$ this - >渲染(模板,美元array_merge (params美元[‘形式’= > $形式- > createView())),新的反应(null,代码)美元);
}
或者看到这个依据https://gist.github.com/garak/fbc48d46e5c6226fe0fe19597f5a5293更好的视图
@Massimiliano Arione我们最初做了类似的事,但这两次触发验证逻辑,会对性能产生影响。此外,它很难通过自定义参数视图,和钩定制逻辑。
如果它很有趣,我开发了一个包,使用相同的原则,它允许分离逻辑在提交表单的处理程序,而不是把它留在控制器。所以控制器不仅工作:接收请求并返回一个响应。
看到这里:https://github.com/Digivia/form-handler
https://github.com/欧宝娱乐app下载地址symfony/symfony/pull/41178
Javier Eguiluz is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now