Symfonyob娱乐下载 5.3新增功能:表单处理程序助手
2021年4月30日·发表的哈维尔Eguiluz
警告:这篇文章是关于一个不受支持的Symfony版本。ob娱乐下载有些信息可能已经过时了。阅读最新的Symfony文档ob娱乐下载.
提供的
格雷戈勒Pineau而且尼古拉斯Grekas在# 41178而且# 41190.
推荐的方法处理Symfony形式ob娱乐下载是使用一个操作同时呈现表单和处理表单提交。
这是它在实践中的样子:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
/ / src /控制器/ ConferenceController.php/ /……#(路线(“/ {id} /编辑”,名字:“conference_edit”,方法:[“得到”,“POST”]))公共函数编辑(请求$请求、会议$会议):响应{$形式=$这->createForm (ConferenceType::类,$会议);$形式->handleRequest ($请求);如果($形式->isSubmitted () & &$形式->isValid ()) {//对$conference对象执行一些操作//(例如,在数据库中持久化)返回$这->redirectToRoute (“conference_show”, (“id”= >$会议->getId ()));}返回$这->呈现(“会议/ edit.html.twig”, (“形式”= >$形式->createView ()));}
当使用库时,如ob娱乐下载Symfony UX Turbo这种简单的表单处理是不够的,你必须严格遵循HTTP协议(例如,如果表单提交但无效,响应必须有HTTP 422状态码)。
为了简化这些情况下的表单处理,Symfony 5.3添加了一个ob娱乐下载用于呈现表单的新(可选)帮助器.类中定义了此帮助程序AbstractController基础控制器作为一个新方法调用renderForm ()
.
这是在使用新helper时,上一个例子的最后几行应该如何编写:
1 2 3 4 5 6 7
/ / src /控制器/ ConferenceController.php/ /……返回$这->renderForm (“会议/ edit.html.twig”, (“形式”= >$形式]);}
签署renderForm ()
方法与for相同呈现()
:
1 2 3 4 5
renderForm(字符串$视图,数组$参数=[],响应$响应=零):响应
此方法呈现给定的表单(它调用形式- > createView ()
在内部),并设置422
表单已提交且无效时的状态码。
的美元的参数
参数是传递给Twig模板的变量列表,参数是可选的美元的反应
对象允许你配置返回响应的某些属性(例如它的缓存选项)。
发表在#生活在边缘
评论
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
或者更好:Form::getHttpCode(),它将返回响应的推荐HTTP代码。如果方法是post,则成功为303,如果没有提交则为200,如果提交错误则为422…然后只需$this->渲染(…美元形式——> getHttpCode ());/ /:)
比起渲染表单的旧方法,我更喜欢这种方法,因为我的大脑从来没有想过要把它包裹起来。在我看来,工作流程是1。2.渲染表单。处理提交和呈现响应(有效或无效)。事实上,“无效响应”通常看起来与原始形式非常相似,这是偶然的性质,而不是API设计的核心。
我将看到任何改进,使处理无效的形式更明确,如从Josef Kufner的建议,或可能添加到' handleForm '的签名可调用的$ onvalid,例如:' handleForm(FormInterface $form,请求$ Request,可调用$render,可调用$onSuccess,可调用$onInvalid = null) '
protected函数renderForm(string $template, FormInterface $form, array $params =[]):响应
{
代码=美元形式——> isSubmitted() & & !形式- > isValid () ?Response::HTTP_UNPROCESSABLE_ENTITY: Response::HTTP_OK;
返回$this->渲染($template, array_merge($params, ['form' => $form->createView()]), new Response(null, $code));
}
或者看看这个要点,以获得更好的视图https://gist.github.com/garak/fbc48d46e5c6226fe0fe19597f5a5293
@Massimiliano Arione我们最初做了类似的事情,但这触发了两次验证逻辑,这影响了性能。此外,它也使得向视图传递自定义参数和挂钩自定义逻辑变得更加困难。
如果感兴趣的话,我开发了一个具有相同原理的包,它允许在处理程序中提交表单后解耦逻辑,而不是将其留在控制器中。所以控制器只做它的工作:接收请求并发回响应。
点击这里查看:https://github.com/Digivia/form-handler
https://github.com/ob娱乐下载symfony/symfony/pull/41178
Javier Eguiluz is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now