【问题标题】:REST controller in Symfony 2: how to deal with field names?Symfony 2 中的 REST 控制器:如何处理字段名称?
【发布时间】:2012-04-25 21:14:12
【问题描述】:

我刚刚在 Symfony2 上使用 SensioGeneratorBundle 生成了一些实体和一个 CRUD,并且我正在将生成的 CRUD 转换为 REST API。我在使用字段名称时遇到问题...我想要自定义字段名称,而 Symfony 的 bindRequest 需要“acme_demobundle_tabletype_field”才能正常工作和验证,我只想拥有“字段”。

如何使用自定义字段名称进行 POST 并让控制器理解并绑定正确的值?例如:

发布

a: 香蕉

b: 巧克力

Symfony 地图:

a => 标题

b => 内容

【问题讨论】:

  • 我不知道。我发现最接近的是创建一个自定义param converter

标签: php symfony


【解决方案1】:

您的问题分为两部分。首先是字段名称前面的前缀和字段名称本身。

如果您在2.1 上,请使用@m2mdas 描述的技巧来摆脱前缀。如果您不在2.1,最好的办法是使用createNamed 创建表单,并在创建表单时提供一个空名称。像这样的:

$this->formFactory->createNamed(new CustomType(), '', $data, $optionsArray);

从未在2.0.x 中测试过此表单,但可以在2.1 中确认如果名称为空,请删除字段前缀。

其中formFactoryFormFactory 服务(@form.factory) 的一个实例。

对于字段,您可以使用自定义名称并告诉 Symfony 它应该在哪里映射属性。为此,您使用property_path 选项。这将指示 symfony 将属性映射到这个路径而不是默认路径。当你定义它时,你应该如何在你的表单类型中使用它:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('a', 'text', array(
        'property_path' => 'title',
    ));

    $builder->add('b', 'text', array(
        'property_path' => 'content',
    ));
}

使用这个,当 Symfony 从 POST 数据中接收到字段 a 时,它将映射到属性 title ,反之亦然。您的对象将需要一个 setTitle 方法和一个 setContent 方法。

希望这会有所帮助。

问候,
马特

【讨论】:

  • 很棒的马特,非常感谢。我几乎摆脱了 REST 控制器上的表单并手动进行验证。谢谢! :D
【解决方案2】:

我查看了 github。根据this PR,可以设置空父名。因此,在您的表单类型类中,只需在 getName 方法中返回空字符串。

【讨论】:

  • 它说我的名字无效。我回来了''。
  • 难道没有办法拥有不同的字段名称和自定义映射吗?
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2020-04-09
  • 2022-11-29
  • 1970-01-01
相关资源
最近更新 更多