编程语言
首页 > 编程语言> > PHP-Symfony / propel表单保存具有其他属性的对象

PHP-Symfony / propel表单保存具有其他属性的对象

作者:互联网

首先,让我说,我发现sfFormPropel表单的界面不一致.
有bind()不返回任何内容,但触发验证,save()返回保存的对象,bindAndSave()返回布尔值,实际上是isValid()的返回值.现在,我有一个正在运行的应用程序,但是我觉得代码不正确,而且我对symfony还是很陌生,所以也许我错过了一些东西.

我需要创建的对象需要一些外部属性,这些外部属性未在表单中显示,而是在模型外部,并由应用程序处理(例如,创建实体的用户的userId,外部生成的guid等).

现在的流程如下:

>从请求中获取值并将其绑定为表格
>检查表格是否有效
>如果有效,则添加其他值并将其绑定以形成更多时间
>保存表单并返回对象

显而易见的答案是将特定于应用程序的值添加到从请求中检索的值,但是如果表单无效,则绑定特定于应用程序的值没有意义,因为它们可能是昂贵的操作,可能会创建数据库记录等等.此外,应该不能在发布请求中传递这些值,它们应该仅来自应用程序.

现在,尽管我必须让模型执行这些操作,但是由于数据在模型外部,因此仍然需要将操作传递给模型.问题是,如果我在bind()之后调用$form-> getObject(),它仍然具有旧数据,而不是提交的数据.

实施这种后处理的正确方法是什么?

第二次赏金开始奖励其他有价值的答案

解决方法:

这取决于谁对附加属性有“知识”.如果它们确实是特定于请求的,因此需要在控制器中进行处理,我将进行绑定,测试是否有效,然后更新绑定的对象.要获取具有绑定(并经过验证)字段的更新对象,请使用updateObject函数.

$form->bind(..)
if ($form->isValid()) {

   $obj = $form->updateObject(); // Updates the values of the object with the cleaned up values. (returns object)
   $obj->foo = 'bar';

   $obj->save();
}

但是由于这通常也是特定于表单的行为,因此我通常会覆盖Form类.通过覆盖doUpdateValues()函数,您可以轻松访问提交的数据,并追加自己的数据.当然,您也可以在链中更高一级,并覆盖save()函数.
要为此表单设置自定义数据,您还可以“发布”公共方法,然后供控制器使用.

标签:propel,symfony-forms,symfony1,php
来源: https://codeday.me/bug/20191208/2088408.html