Because the cleanest way to transfer data from a web request to the domain is by using DTOs.
For simple DTOs Symfony forces you to create 2 classes, the FormType
class and the SomethingDTO
class.
This Bundle allows you to describe DTOs by the annotation @Formable()
. Let's see an example.
use Formable\Definition\Formable;
use Symfony\Component\Validator\Constraints as Assert;
class PublishPostCommand
{
/**
* @Formable(name="title", dataType="text")
*
* @Assert\Length(max=250)
*/
public $title;
/**
* @Formable(name="content", dataType="text")
*/
public $content;
/**
* @Formable(name="tags", dataType="collection", options={
* "type"="text",
* "allow_add"=true
* })
*
* @Assert\Count(
* min = "2"
* )
*
*/
public $tags;
/**
* @Formable(name="date", dataType="date", options={
* "widget"="single_text",
* "format"="yyyy-M-d"
* })
*/
public $date;
}
/**
* @var
*
* @Formable(name="moneyDTO", class="Formable\Tests\Integration\DTOs\TestMoneyDTO")
*/
public $moneyDTO;
public function publishAction(Request $request)
{
$publishCommand = new PublishPostCommand();
$publishCommand->date = new \DateTime('now');
$form = $this->get('pugx.formable')->generate($publishCommand);
$form->submit($request->request->all(), false /* Do not clear missing data */);
if ($form->isValid()) {
...
}
}
The @Formable()
annotation follows the Symfony\Component\Form\FormBuilderInterface
interface.
ARGUMENTS:
- name: [string] the field name
- dataType: [string] the FormType
- options: [array] the FormType options
/**
* @Formable(name="date", dataType="date", options={
* "format"= "yyyy-MM-dd",
* "days" = {1,2,3,4}
* })
*/
public $date;
composer require pugx/formable
// Register the Bundle
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
...
new \Formable\Bundle\FormableBundle(),
);
return $bundles;
}
}
bin/test