Forms
Uses Symfony2 components, 
that facilitate the creation, display, and validation of forms.
|-- app/
    |-- Forms/          # Forms
      |-- Constraints/  # Rules form validation
      |-- PostForm.php  # Form for adding/editing user posts
      `-- RegForm.php   # Form for the registration of a new user
Consider the main features of the form through the creation of a new message (post).
Creating forms
With the help of action newAction in the controller app/Controllers/BlogController.php
we are creating a new message (post) and store it in the database.
An example is shown below.
...
// Create object NewPost and set values
$ormPost = new Post();
$ormPost->setCreated(date($format));
// Create form
$form = $this->createForm(new PostForm(), $ormPost, array('action' => "/blog/new"));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
    $user = $this->getUser();
    $username = $user->getUsername();
    // Create new post
    $models->load('Post', 'newPost', array('username' => $username, 'new_post' => $ormPost));
    ...
}
Creating a form occurs with the function:
// Create form
$form = $this->createForm(new PostForm(), $ormPost, array('action' => "/blog/new"));
The first parameter is the form object of class PostForm app/Forms/PostForm.php,
that defines the form characteristics:
- Method (
postorget) - Action (
/blog/new) - Form fields (field type, field options)
 - Default options (
data_class,csrf_protection,csrf_field_name,intentionetc.) 
The second parameter is the object data of class Post app/Models/ORM/Post.php,
that defines the characteristics of post table in the database app/Resources/db/app.db:
- Column (
name,typeetc. ) - Relations between tables (
ManyToOne,JoinColumnetc.) - Validation rules table fields
 
The third parameter are form parameters set manually.
array('action' => "/blog/new")
Validation of form
Validation of form data takes place on two levels:
- At the server level
 - At the client level
 
At the server level, we check the sign of the user to send data and do data validation.
Validation rules are defined in the object data of class Post app/Models/ORM/Post.php.
...
if ($form->isSubmitted() && $form->isValid()) {
    ...
}
At the client level in the template app/Views/Controller/blog/new.html.twig
we add service FormValidation and validation rules for this service.
...
<script type="text/javascript">
    BSA.ScriptResources.push('FormValidation');
    ...
    addScriptParams('FormValidation',
            {
                form: 'form[name="post"]',
                rules: {
                    "post[created]": {
                        required: true
                    },
                    "post[title]": {
                        required: true,
                        minlength: 5
                    },
                    "post[body]": {
                        required: true
                    }
                }
            });
    ...
</script>
...
Displaying the form
View display the form, you can specify when the service configuration Twig in method _iniProviders
of class Bootstrap app/Bootstrap.php
...
// Twig
$app->register(
        new Silex\Provider\TwigServiceProvider(), array(
    ...
    #Global form templates
    'twig.form.templates' => array("Form/bootstrap_3_horizontal_layout.html.twig"),
    ...
));
...
or in the configuration file app/Resources/Config/config.yml
service_providers:
    ...
    twig:
        class: Silex\Provider\TwigServiceProvider
        construct_parameters: ~
        parameters:
            ...
            twig.form.templates:    
                #Global form templates
                - Form/bootstrap_3_horizontal_layout.html.twig
            ...
    ...
where the parameter #Global form templates is set .
Templates that define the appearance of the form are in app/Views/Form.