我正在使用FOSRestBundle在Symfony中构建REST API。
在我的税务总监中,我有:
private function processForm(Request $request, Tax $tax )
{
$form = $this->createForm(new TaxType(),$tax);
$req = $request->request->all();
$form->submit($req['tax']);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($tax);
$em->flush();
return $this->getTaxAction($tax->getId());
}
return array(
'form' => $form,
'request' => $request->request->all()
);
}
此功能从POST和PUT函数调用。
TaxType
class TaxType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('createDate')
->add('writeDate')
->add('name')
->add('amount')
->add('active')
->add('createUid')
->add('writeUid')
->add('company')
;
}
...
到目前为止它工作正常,但现在我在表格中添加了一些额外的列(并且是税务实体的自己),例如:哪个公司属于记录,创建日期。这不是来自客户端,而是设置在服务器端。 我如何添加例如createData?
我试过了
$req['tax']['createDate'] = new \DateTime("now");
但我得到: {"代码":400,"消息":"验证失败","错误":{"儿童": {" createDate":{"错误":["此值无效。"],"儿童":{&#34 ;日期":{"儿童":{"一年":[],"当月":[],"天&#34 ;: []}}"时间" {"的子" {"小时":[],"分钟":[]}} }}" writeDate":{"儿童":{"日期":{"儿童":{"一年&#34 ;:[],"一个月":[],"天":[]}}"时间" {"子&#34 ;: {"小时":[],"分钟":[]}}}}"名称":[],"量&#34 ;: [],"有源":[]," createUID所":[]," writeUid":[],"公司":[] }}}
来自实体Tax.php
/ ** * @var \ DateTime * / private $ createDate;
我想我正在使用正确的数据类型扩展请求,但我得到验证错误。
答案 0 :(得分:1)
如果我正确理解了这个问题,您不必接受请求,只需更改$ tax-object上的属性即可。 如果需要,您也可以在表单验证后执行此操作。
答案 1 :(得分:1)
您可以从表单构建器中删除add('createDate')
。
$助洗剂
<删除> - &gt;添加( 'CREATEDATE')德尔>
- &gt;添加( 'writeDate')
- &gt;添加( '姓名')
- &gt;添加( '量')
- &gt;添加( '激活')
- &gt;添加( 'createUID所')
- &gt;添加( 'writeUid')
- &gt; add('company')
然后在持久化之前在$ tex对象上设置createdDate值。
if ($form->isValid()) {
$tax->setCreateDate(new \DateTime("now"));
$em = $this->getDoctrine()->getManager();
$em->persist($tax);
$em->flush();
return $this->getTaxAction($tax->getId());
}
或者您可以使用Doctrine's Lifecycle Callbacks来实现此目标。
快乐的编码!!