【发布时间】:2016-01-06 22:27:40
【问题描述】:
对于我目前正在构建的 API,我希望能够发送带有以下内容的 JSON 正文的请求
{"title": "foo"}
为名为@987654322@ 的实体创建新的数据库记录。
我制作了一个子类FOSRestController 的控制器。为了创建一个项目,我做了一个动作
/**
* @Route("/")
*
* @ApiDoc(
* section="Project",
* resource=true,
* input={"class"="AppBundle\Form\API\ProjectType"},
* description="Creates a new project",
* statusCodes={
* 201="Returned when successful",
* }
* )
*
* @Method("POST")
* @Rest\View(statusCode=201)
*/
public function createProjectAction(Request $request)
{
$project = new Project();
$form = $this->createForm(ProjectType::class, $project);
$form->submit(($request->request->get($form->getName())));
if ($form->isSubmitted() && $form->isValid()) {
return $project;
}
return View::create($form, 400);
}
ProjectType 看起来像这样
class ProjectType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title');
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Project'
));
}
}
但是,当我尝试将所述 JSON 发布到 API 时,它会响应 title 属性不能为空,这很好,因为这是为它设置的验证规则。但是,它已设置。我突然意识到我必须发送以实际对象名称为前缀的 JSON 才能使这项工作:
{"project":{"title": "bla"}}
公平地说,这感觉有点奇怪,只需发布属性就足够了。
所以,根据这些信息,我只有两个问题:
- 为什么我需要用
($request->request->get($form->getName()))“提交”这个表单,$request应该不够吗? - 我需要对 FormType 进行哪些更改才能按原样验证实体,而不是为其添加实体名称的前缀?
编辑 1:在默认选项中添加或删除 data_class 根本不会改变行为。
【问题讨论】:
-
您是否尝试过使用标准格式提交表单,
$form->handleRequest($request);? -
@JasonRoman 是的,但这似乎根本不起作用。无论我发送什么,我什至都无法通过 isValid()。
标签: php rest fosrestbundle symfony