简体   繁体   中英

REST controller in Symfony 2: how to deal with field names?

I just generated some entities and a CRUD using SensioGeneratorBundle on Symfony2 and i'm converting the generated CRUD to a REST API. I'm having problems with the field names... i wanted to have custom field names, while Symfony's bindRequest expects "acme_demobundle_tabletype_field" in order to work correctly and validate, i want to have just "field".

How can i POST with custom field names and make the controller understand and bind the correct values? For example:

POST

a: banana

b: chocolate

Symfony maps:

a => title

b => content

There is two part to your question. First the prefix prepended to the fields name and the fields name themselves.

To get rid of the prefix, use the trick described by @m2mdas if you are on 2.1 . If your not on 2.1 , your best bet is to create your form using createNamed and give an empty name when creating the form. Something like this:

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

Never tested this form in 2.0.x but can confirm in 2.1 that having an empty name remove the field's prefix.

Where formFactory is an instance of the FormFactory service ( @form.factory ).

For the fields, you can use custom name and tell Symfony where it should map the property. For that, you use the property_path option. This will instruct symfony to map the property to this path instead of the default path. Here how you should use it in you form type when you define it:

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

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

Using this, when Symfony received the field a from the POST data, it will map it to the property title and vice-versa when the form is rendered. Your object will need a setTitle method and a setContent method.

Hope this helps.

Regards,
Matt

I looked into github. According to this PR, you can set empty parent name. So in your form type class just return empty string in getName method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM