Advanced usage: example with Doctrine

That's not really an advanced topic, but the sample will be a bit hard to read (as it takes many files), so let's say it targets more experienced Symfony users.

In this demo, we're displaying a MyArray of MyElements, both persisted into the database. The MyArray entity only have an id and a name, and MyElement has id, MyArray's id and a value. This is quite the same as we seen in all demos, but persisted.


Existing arrays:
Name Open Delete
gufc fucvuy Open Delete
_ Open Delete
___ ☘ Cela fonctionne ☠Open Delete
___ Array with Elements ... Click Open to test loading Open Delete
____ Open Delete
__________________________________________ Open Delete
____________________________1 test Open Delete
___m Open Delete
__bvnvbnvbnvbn Open Delete
_a_ Open Delete
_Greeting, :D happy 2018 Open Delete
---#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
---#i27992875ec4286a24e569b1e015b0473 Open Delete
---#ie025efbbb0738ed01a63b326c174233e Open Delete
!!!!sdsdsd Open Delete
' Open Delete
() Open Delete
(orphée) Open Delete
&&&&&&&&&&& Open Delete
#456 Open Delete
#69 Open Delete
#7233333 Open Delete
#AlgoSucks Open Delete
#timowashere Open Delete
%2372 Open Delete
%2372uuuu Open Delete
%25237233333#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
%25237233333#i21ef661e2506d5d0e513dce166c17d49 Open Delete
%25237233333#i27992875ec4286a24e569b1e015b0473 Open Delete
%25237233333#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
%25237233333#ie025efbbb0738ed01a63b326c174233e Open Delete
%252372uuuu Open Delete
%252372uuuu#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
%252372uuuu#i27992875ec4286a24e569b1e015b0473 Open Delete
%252372uuuu#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
%253F#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
%253F#i21ef661e2506d5d0e513dce166c17d49 Open Delete
%253F#i5784b3886628c4362594ffa43547edb4 Open Delete
%253F#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
%253F#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
%253F#ie025efbbb0738ed01a63b326c174233e Open Delete
%3F Open Delete
<?php echo ' i don't like it ' Open Delete
<script>alert('test')</script> Open Delete
<script>alert('test')</script>%n%n%n%n%n%n Open Delete
<script>alert('test')</script>%n%n%n%n%n%n<script>alert('test')</script>%n%n%n%n%n%n<script>alert('test')</script>%n%n%n%n%n%n<script>alert('test')</script>%n%n%n%n%n%n<script>alert('test')</script>%n%n%n%n%n%n<script>alert('test')</script>%n%n%n%n%n%n<sc Open Delete
01233 Open Delete
1000-1 Open Delete
11 Open Delete
11#i27992875ec4286a24e569b1e015b0473 Open Delete
11#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
11#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
11#ie025efbbb0738ed01a63b326c174233e Open Delete
1111#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
1111#i21ef661e2506d5d0e513dce166c17d49 Open Delete
1111#i5784b3886628c4362594ffa43547edb4 Open Delete
1111#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
1111#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
1111111111111111111111111111111111#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
1111111111111111111111111111111111#i21ef661e2506d5d0e513dce166c17d49 Open Delete
1111111111111111111111111111111111#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
1111111111111111111111111111111111#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
1111111111111111111111111111111111#ie025efbbb0738ed01a63b326c174233e Open Delete
121113aaaaa Open Delete
122 Open Delete
123 Open Delete
1231 Open Delete
123123 Open Delete
15 Open Delete
1Alpha Open Delete
2' Open Delete
222 Open Delete
2222 example Open Delete
2222%2520example Open Delete
222222 Open Delete
2232323 Open Delete
3 Open Delete
32 Open Delete
33 Open Delete
5 Open Delete
63 Open Delete
8 Open Delete
88 Open Delete
888 Open Delete
969 Open Delete
999 Open Delete
ñsf Open Delete
☘ Cela fonctionne ☘ Open Delete
A1 Open Delete
a2 Open Delete
aa Open Delete
ñlkjlkj Open Delete
ñsfkjaldsa Open Delete
aaaaaaaaaaaaaaaaaaaaaaaaaa Open Delete
тест Open Delete
aaamine22222 Open Delete
aaamine22222#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
aaamine22222#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
aaamine22222#i21ef661e2506d5d0e513dce166c17d49 Open Delete
aaamine22222#i5784b3886628c4362594ffa43547edb4 Open Delete
aaamine22222#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
aaamine22222#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
aaamine22222#ie025efbbb0738ed01a63b326c174233e Open Delete
adfadf Open Delete
Array Open Delete
arrayGilmry Open Delete
asdaexample Open Delete
asdas Open Delete
asdasd Open Delete
asdasd#i21ef661e2506d5d0e513dce166c17d49 Open Delete
asdasd#i27992875ec4286a24e569b1e015b0473 Open Delete
asdasd#i5784b3886628c4362594ffa43547edb4 Open Delete
asdasd#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
asdasd#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
asdasd#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
asdasdadasd#i27992875ec4286a24e569b1e015b0473 Open Delete
asdasdadasd#i5784b3886628c4362594ffa43547edb4 Open Delete
asdasdadasd#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
asdasdadasd#ie025efbbb0738ed01a63b326c174233e Open Delete
asdfasdfasd Open Delete
asdfg Open Delete
AU Open Delete
azerty Open Delete
b Open Delete
balala Open Delete
bbb Open Delete
bcvbcvb Open Delete
bdfdfdfdf Open Delete
bjfhj Open Delete
bjfhj#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
bjfhj#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
bjfhj#i21ef661e2506d5d0e513dce166c17d49 Open Delete
bjfhj#i27992875ec4286a24e569b1e015b0473 Open Delete
bjfhj#i5784b3886628c4362594ffa43547edb4 Open Delete
bjfhj#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
bjfhj#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
bjfhj#ie025efbbb0738ed01a63b326c174233e Open Delete
blah#i5784b3886628c4362594ffa43547edb4 Open Delete
blah#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
blah#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
Bra Open Delete
bxvbvx Open Delete
Caracas222666 Open Delete
cccio Open Delete
cela Open Delete
Cela fonctionne Open Delete
Cela fonctionne pas Open Delete
checks Open Delete
Cmucik Open Delete
colombo Open Delete
crap Open Delete
Cuves Open Delete
cx Open Delete
cx%3Cwc Open Delete
D#i21ef661e2506d5d0e513dce166c17d49 Open Delete
D#i5784b3886628c4362594ffa43547edb4 Open Delete
D#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
D#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
D#ie025efbbb0738ed01a63b326c174233e Open Delete
das Open Delete
dcdc Open Delete
dd Open Delete
dddd Open Delete
ddddd Open Delete
defrsdf Open Delete
delete_empty Open Delete
Demo Open Delete
dfa#i5784b3886628c4362594ffa43547edb4 Open Delete
dghdfgdfgd Open Delete
diego Open Delete
Doom Open Delete
dra Open Delete
dsadsadd Open Delete
dsdfgsdfgdf Open Delete
dsvfdsfg] Open Delete
eeeeee Open Delete
ejemplo 2 Open Delete
exadasdas Open Delete
exam Open Delete
exampldfdfe Open Delete
example Open Delete
example Radu Open Delete
example+exam Open Delete
example123#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
example123#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
example123#i21ef661e2506d5d0e513dce166c17d49 Open Delete
example123#i27992875ec4286a24e569b1e015b0473 Open Delete
example123#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
example22222222222222 Open Delete
example3243423 Open Delete
example33333 Open Delete
exampleasdas Open Delete
exampleasfsafa Open Delete
exampleasfsafasf#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
exampleasfsafasf#i21ef661e2506d5d0e513dce166c17d49 Open Delete
exampleasfsafasf#i5784b3886628c4362594ffa43547edb4 Open Delete
exampleasfsafasf#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
exampleasfsafasf#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
exampleasfsafasf#ie025efbbb0738ed01a63b326c174233e Open Delete
exampleaz Open Delete
exampledsdsdd Open Delete
examplee Open Delete
exampleede Open Delete
examplefffffffffffff Open Delete
examplefh Open Delete
examplefsd Open Delete
examplehfghfhfgfg Open Delete
examplejjj Open Delete
examplemmm Open Delete
examplenhnhd Open Delete
exampleqqqq Open Delete
exampleqzd Open Delete
exampleRW Open Delete
examplesadasdsdsad Open Delete
examplesdf Open Delete
examplesdsd Open Delete
exampletes Open Delete
examplew Open Delete
exampple Open Delete
examqdqsple Open Delete
eze Open Delete
familly Open Delete
fat Open Delete
fdf Open Delete
fdf#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
fdf#i21ef661e2506d5d0e513dce166c17d49 Open Delete
fdf#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
fdf#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
fdg Open Delete
fdgdf Open Delete
fdsdf Open Delete
ff d Open Delete
ffff Open Delete
ffsss Open Delete
fg Delete
fgfdgfdgdg Open Delete
fgjgh Open Delete
fr Open Delete
Fruits Open Delete
fsdfsdf Open Delete
fuck you Open Delete
gdfg#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
gdfg#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
gdfg#i21ef661e2506d5d0e513dce166c17d49 Open Delete
gdfg#i27992875ec4286a24e569b1e015b0473 Open Delete
gdfg#i5784b3886628c4362594ffa43547edb4 Open Delete
ghfhgfg Open Delete
ghgtytyt Open Delete
ghione Open Delete
ghjk Open Delete
ghjk#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
ghjk#i5784b3886628c4362594ffa43547edb4 Open Delete
ghjk#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
ghjk#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
ghjk#ie025efbbb0738ed01a63b326c174233e Open Delete
ghk Open Delete
Ghy Open Delete
gjkl Open Delete
Group%20B Open Delete
Group%2BC Open Delete
Group%2BC#i27992875ec4286a24e569b1e015b0473 Open Delete
Group%2BC#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
Group+C Open Delete
gufc fucvuy dd Open Delete
hahah Open Delete
hbhbhb Open Delete
Hello World ! Open Delete
Hello%20World%20! Open Delete
HEYY%20:D Open Delete
HEYY%2520:D#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
HEYY%2520:D#i21ef661e2506d5d0e513dce166c17d49 Open Delete
HEYY%2520:D#i5784b3886628c4362594ffa43547edb4 Open Delete
HEYY%2520:D#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
HEYY%2520:D#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
HEYY%2520:D#ie025efbbb0738ed01a63b326c174233e Open Delete
hgjgjh Open Delete
hhmm Open Delete
hi bitches Open Delete
hi%20bitches Open Delete
hjvhj Open Delete
ho Open Delete
hoho Open Delete
htt Open Delete
hu Open Delete
hujpizda Open Delete
iii Open Delete
ilesh Open Delete
iooi Open Delete
ismail Open Delete
itemList Open Delete
iujjj Open Delete
jbnn Open Delete
jghjghjgj Open Delete
jhgfgh Open Delete
jkbhkjh Open Delete
jtujjk Open Delete
kappa Open Delete
khj Open Delete
khj#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
khj#i21ef661e2506d5d0e513dce166c17d49 Open Delete
khj#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
khj#ie025efbbb0738ed01a63b326c174233e Open Delete
kjkjkj Open Delete
kjkk Open Delete
kkik Open Delete
kkk Open Delete
kkk#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
kkk#i27992875ec4286a24e569b1e015b0473 Open Delete
kkk#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
kkk#ie025efbbb0738ed01a63b326c174233e Open Delete
klk Open Delete
kln Open Delete
kpok%C2%B4p Open Delete
lj Open Delete
lkj Open Delete
lkjlkj Open Delete
lol Open Delete
Lorenz du Open Delete
loslos Open Delete
Lundi Open Delete
mardi Open Delete
mjn Open Delete
mm Open Delete
mon exemple Open Delete
mon putain de tableau Open Delete
mon%20exemple Open Delete
mon%20tableau Open Delete
Mumbojumbo Open Delete
name Open Delete
Names Open Delete
nbnv Open Delete
new test Open Delete
New_test_2017- Open Delete
ñlkjlkj Open Delete
nmn Open Delete
nmn#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
nmn#i21ef661e2506d5d0e513dce166c17d49 Open Delete
nmn#i27992875ec4286a24e569b1e015b0473 Open Delete
nmn#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
ñsfkjaldsa Open Delete
o%C4%B1 Open Delete
oı Open Delete
oı Open Delete
oezjfez Open Delete
oij Open Delete
ok Open Delete
olaboga Open Delete
oui Open Delete
Ouiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii Open Delete
Ouiiiiiiiiiiiiiiiiiiiiiiiilul Open Delete
ouiou Open Delete
pepiii Open Delete
perses Open Delete
perses#i21ef661e2506d5d0e513dce166c17d49 Open Delete
perses#i5784b3886628c4362594ffa43547edb4 Open Delete
perses#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
po Open Delete
poiuytre Open Delete
pornhub.com Open Delete
pppppii#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
pppppii#i27992875ec4286a24e569b1e015b0473 Open Delete
pppppii#i5784b3886628c4362594ffa43547edb4 Open Delete
pppppii#ie025efbbb0738ed01a63b326c174233e Open Delete
pppppp Open Delete
Premier element de test Open Delete
project 1 Open Delete
qqq Open Delete
qsd Open Delete
quantite --1 Open Delete
question2 Open Delete
qwe Open Delete
qwert Open Delete
r Open Delete
Recipe Open Delete
rerererere Open Delete
rerwrer Open Delete
resr Open Delete
rewq Open Delete
rfermkferkmfe Open Delete
rr Open Delete
rrr Open Delete
rrrr Open Delete
rrrr#i5784b3886628c4362594ffa43547edb4 Open Delete
rrrr#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
RV Open Delete
s Open Delete
saASD Open Delete
sad.asdasd.sdsad Open Delete
sadsad Open Delete
sam Open Delete
samArray Open Delete
samples Open Delete
scyx Open Delete
sdasd Open Delete
sdasdafs Open Delete
SED Open Delete
seeme#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
seeme#i1dcd1cbb0d8eeb1fd3a32dc2aa9c8013 Open Delete
seeme#i21ef661e2506d5d0e513dce166c17d49 Open Delete
seeme#i5784b3886628c4362594ffa43547edb4 Open Delete
seeme#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
seeme#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
seeme#ie025efbbb0738ed01a63b326c174233e Open Delete
sf Open Delete
sfd Open Delete
sfdf Open Delete
sfsa Open Delete
sgdfs Open Delete
some new array Open Delete
someNewArray#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
sqsq Open Delete
sss Open Delete
ssss Open Delete
ssssssssssssssssssssssssss Open Delete
Starojitski Open Delete
suck my cock fgts Open Delete
t Open Delete
t11 Open Delete
Ta mere la Open Delete
Ta mere la grosse choin Open Delete
Ta mere la grosse tchoin Open Delete
Ta%20mere%20la%20grosse%20choin Open Delete
Ta%20mere%20la%20grosse%20tchoin Open Delete
Ta%2520mere%2520la%2520grosse%2520choin#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
Ta%2520mere%2520la%2520grosse%2520choin#i8c18088ea4d8dd4d6e5e986bceed35da Open Delete
Ta%2520mere%2520la%2520grosse%2520choin#ibcac9f4c58199eeaa7ba5c7750b8434b Open Delete
Ta%2520mere%2520la%2520grosse%2520choin#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
Ta%2520mere%2520la%2520grosse%2520choin#ie025efbbb0738ed01a63b326c174233e Open Delete
tableau%20cellule%20unique Open Delete
Telous Open Delete
terst Open Delete
tesr Open Delete
tesss Open Delete
test2 Open Delete
teste Open Delete
testing Open Delete
testname Open Delete
tesy Open Delete
texte Open Delete
the+test Open Delete
this is an array Open Delete
toti Open Delete
totototototo Open Delete
tre Open Delete
tset Open Delete
tttttz Open Delete
ui Open Delete
uiu Open Delete
undefined Open Delete
uytuuyt Open Delete
Vai que da Open Delete
Vai%2520que%2520da Open Delete
vcbbc Open Delete
vcvcvcvcvv Open Delete
Volta%2 Open Delete
Volta%20Di Open Delete
Volta%20Dilma%20Fora% Open Delete
Volta%2520Dilma%2520Fo Open Delete
Volta%2520Dilma%2520Fora% Open Delete
Volta%2520Dilma%2520Fora%2520Temer#i1097c8b84b58a65ed6ec7b4f0da3ab67 Open Delete
Volta%2520Dilma%2520Fora%2520Temer#i27992875ec4286a24e569b1e015b0473 Open Delete
Volta%2520Dilma%2520Fora%2520Temer#i5784b3886628c4362594ffa43547edb4 Open Delete
Volta%2520Dilma%2520Fora%2520Temer#ic3ee8978c60737ab5d058b5a3f6a1b09 Open Delete
Volta%2520Dilma%2520Fora%2520Temer#ie025efbbb0738ed01a63b326c174233e Open Delete
Volta+Dilma+Fo Open Delete
vv Open Delete
werweexample Open Delete
why doctrine on delete not work Open Delete
why%20doctrine%20on%20delete%20not%20work Open Delete
Woop wooop Open Delete
Woop% Open Delete
Woop%20wooop Open Delete
wsh yannito Open Delete
ww Open Delete
www Open Delete
wxc%3Cwxc Open Delete
xcxcxcx Open Delete
xx Open Delete
xxx Open Delete
yfcx Open Delete
You Open Delete
yy Open Delete
yyyyyyyyyyyyyy Open Delete
z Open Delete
zzz Open Delete
zzzz Open Delete
ролр Open Delete
тест Open Delete
☘ Cela fonctionne ☘ Open Delete
<?php

namespace Fuz\AppBundle\Base;

use Fuz\AppBundle\Entity\Value;
use Fuz\AppBundle\Form\ValueType;
use Fuz\QuickStartBundle\Base\BaseController as QuickStartBase;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\HttpFoundation\Request;

class BaseController extends QuickStartBase
{
    protected function createContextSample(Request $request, $name = 'form', $values = ['a', 'b', 'c'])
    {
        $data = ['values' => $values];

        $form = $this
           ->get('form.factory')
           ->createNamedBuilder($name, Type\FormType::class, $data)
           ->add('values', Type\CollectionType::class, [
               'entry_type'    => Type\TextType::class,
               'label'         => 'Add, move, remove values and press Submit.',
               'entry_options' => [
                   'label' => 'Value',
               ],
               'allow_add'    => true,
               'allow_delete' => true,
               'prototype'    => true,
               'attr'         => [
                   'class' => "{$name}-collection",
               ],
           ])
           ->add('submit', Type\SubmitType::class)
           ->getForm()
        ;

        $form->handleRequest($request);
        if ($form->isValid()) {
            $data = $form->getData();
        }

        return [
            $name         => $form->createView(),
            "{$name}Data" => $data,
        ];
    }

    protected function createAdvancedContextSample(Request $request, $name = 'advancedForm')
    {
        $a = new Value('a');
        $b = new Value('b');
        $c = new Value('c');

        $data = ['values' => [$a, $b, $c]];

        $form = $this
           ->get('form.factory')
           ->createNamedBuilder($name, Type\FormType::class, $data)
           ->add('values', Type\CollectionType::class, [
               'entry_type'   => ValueType::class,
               'label'        => 'Add, move, remove values and press Submit.',
               'allow_add'    => true,
               'allow_delete' => true,
               'prototype'    => true,
               'required'     => false,
               'attr'         => [
                   'class' => "{$name}-collection",
               ],
           ])
           ->add('submit', Type\SubmitType::class)
           ->getForm()
        ;

        $form->handleRequest($request);
        if ($form->isValid()) {
            $data = $form->getData();
        }

        return [
            $name         => $form->createView(),
            "{$name}Data" => $data,
        ];
    }
}
<?php

namespace Fuz\AppBundle\Controller;

use Fuz\AppBundle\Base\BaseController;
use Fuz\AppBundle\Entity\Address;
use Fuz\AppBundle\Entity\Addresses;
use Fuz\AppBundle\Entity\Fancy;
use Fuz\AppBundle\Entity\FancyCollection;
use Fuz\AppBundle\Entity\Value;
use Fuz\AppBundle\Form\AddressesType;
use Fuz\AppBundle\Form\FancyCollectionType;
use Fuz\AppBundle\Form\MyArrayType;
use Fuz\AppBundle\Form\ValueType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Form\Extension\Core\Type;
use Symfony\Component\HttpFoundation\Request;

/**
 * @Route("/advanced")
 */
class AdvancedController extends BaseController
{
    /**
     * Advanced usage
     *
     * You can reference your form collection in the view, instead of
     * putting a selector in the form type.
     *
     * @Route("/mvcCompliance", name="mvcCompliance")
     * @Template()
     */
    public function mvcComplianceAction(Request $request)
    {
        $data = ['values' => ['a', 'b', 'c']];

        $form = $this
           ->createFormBuilder($data)
           ->add('values', Type\CollectionType::class, [
               'entry_type'    => Type\TextType::class,
               'label'         => 'Add, move, remove values and press Submit.',
               'entry_options' => [
                   'label' => 'Value',
               ],
               'allow_add'    => true,
               'allow_delete' => true,
               'prototype'    => true,
               'required'     => false,
//                   'attr' => array (
//                           'class' => 'my-selector', <--- Not MVC compliant!
//                   ),
           ])
           ->add('submit', Type\SubmitType::class)
           ->getForm()
        ;

        $form->handleRequest($request);
        if ($form->isValid()) {
            $data = $form->getData();
        }

        return [
            'form' => $form->createView(),
            'data' => $data,
        ];
    }

    /**
     * Advanced usage
     *
     * A custom form theme helps define button's layout and positions as and where you want.
     *
     * @Route("/customFormTheme", name="customFormTheme")
     * @Template()
     */
    public function customFormThemeAction(Request $request)
    {
        $data = ['values' => [new Value('a'), new Value('b'), new Value('c')]];

        $form = $this
           ->createFormBuilder($data)
           ->add('values', Type\CollectionType::class, [
               'entry_type'   => ValueType::class,
               'label'        => 'Add, move, remove values and press Submit.',
               'allow_add'    => true,
               'allow_delete' => true,
               'prototype'    => true,
               'required'     => false,
               'attr'         => [
                   'class' => 'collection',
               ],
           ])
           ->add('submit', Type\SubmitType::class)
           ->getForm()
        ;

        $form->handleRequest($request);
        if ($form->isValid()) {
            $data = $form->getData();
        }

        return [
            'form' => $form->createView(),
            'data' => $data,
        ];
    }

    /**
     * Advanced usage
     *
     * Same demo as above, but with the add button located at the bottom of
     * the form instead of close to each field.
     *
     * @Route("/customFormThemeAddBottom", name="customFormThemeAddBottom")
     * @Template()
     */
    public function customFormThemeAddBottomAction(Request $request)
    {
        return $this->customFormThemeAction($request);
    }

    /**
     * Advanced usage
     *
     * Collection of collections are useful on the most dynamic forms, and a good
     * way to test if the plugin is working as expected too.
     *
     * @Route("/collectionOfCollections", name="collectionOfCollections")
     * @Template()
     */
    public function collectionOfCollectionsAction(Request $request)
    {
        $data = [
            'collections' => [
                [new Value('a'), new Value('b'), new Value('c')],
                [new Value('d'), new Value('e'), new Value('f')],
                [new Value('g'), new Value('h'), new Value('i')],
            ],
        ];

        $form = $this
           ->get('form.factory')
           ->createNamedBuilder('form', Type\FormType::class, $data)
           ->add('collections', Type\CollectionType::class, [
               'entry_type'    => Type\CollectionType::class,
               'label'         => 'Add, move, remove collections',
               'entry_options' => [
                   'entry_type'    => ValueType::class,
                   'label'         => 'Add, move, remove values',
                   'entry_options' => [
                       'label' => 'Value',
                   ],
                   'allow_add'      => true,
                   'allow_delete'   => true,
                   'prototype'      => true,
                   'prototype_name' => '__children_name__',
                   'attr'           => [
                       'class' => 'child-collection',
                   ],
               ],
               'allow_add'      => true,
               'allow_delete'   => true,
               'prototype'      => true,
               'prototype_name' => '__parent_name__',
               'attr'           => [
                   'class' => 'parent-collection',
               ],
           ])
           ->add('submit', Type\SubmitType::class)
           ->getForm()
        ;

        $form->handleRequest($request);
        if ($form->isValid()) {
            $data = $form->getData();
        }

        return [
            'form' => $form->createView(),
            'data' => $data,
        ];
    }

    /**
     * Advanced usage
     *
     * Looks like there are weird behaviours with Doctrine:
     * https://github.com/ninsuo/symfony-collection/issues/7
     * Let's test that live!
     *
     * ... hmm, doesn't look bad anyway
     *
     * @Route(
     *      "/usageWithDoctrine/{name}",
     *      name = "usageWithDoctrine",
     *      defaults = {
     *          "name" = "example"
     *      }
     * )
     * @Template()
     */
    public function usageWithDoctrineAction(Request $request, $name)
    {
        $repo = $this->getDoctrine()->getRepository('FuzAppBundle:MyArray');

        $data = $repo->findOneByName($name);
        if (is_null($data)) {
            $data = $repo->create($name);
        }

        $form = $this->createForm(MyArrayType::class, $data);
        $form->handleRequest($request);

        $form->get('save')->isClicked() && $form->isValid() && $repo->save($data);

        return [
            'names' => $repo->getArrayNames(),
            'form'  => $form->createView(),
            'data'  => $data,
        ];
    }

    /**
     * Related to usageWithDoctrine demo
     *
     * @Route(
     *      "/usageWithDoctrineDelete/{name}",
     *      name = "usageWithDoctrineDelete"
     * )
     */
    public function usageWithDoctrineDeleteAction(Request $request, $name)
    {
        $repo = $this->getDoctrine()->getRepository('FuzAppBundle:MyArray');
        if (!is_null($data = $repo->findOneByName($name))) {
            $repo->delete($data);
        }

        return $this->forward('FuzAppBundle:Advanced:usageWithDoctrine', [
            'name' => 'example',
        ]);
    }

    /**
     * A form having a theme and containing several fields
     *
     * @Route(
     *      "/formHavingSeveralFields",
     *      name = "formHavingSeveralFields"
     * )
     * @Template()
     */
    public function formHavingSeveralFieldsAction(Request $request)
    {
        $address = new Address();
        $address->setName('Mickael Steller');
        $address->setCompany('fuz.org');
        $address->setStreet('41 rue de la Paix');
        $address->setPostalcode('75002');
        $address->setCity('Paris');
        $address->setCountry('France');

        $addresses = new Addresses();
        $addresses->getAddresses()->add($address);

        $form = $this->createForm(AddressesType::class, $addresses);
        if ($request->isMethod('POST')) {
            $form->handleRequest($request);
        }

        return [
            'form' => $form->createView(),
            'data' => $addresses,
        ];
    }

    /**
     * Another example of form theme
     *
     * @Route(
     *      "/fancyFormTheme",
     *      name = "fancyFormTheme"
     * )
     * @Template()
     */
    public function fancyFormThemeAction(Request $request)
    {
        $fancyCollection = new FancyCollection();

        for ($i = 0; $i < 3; $i++) {
            $fancy = new Fancy();
            $fancyCollection->getFancyCollection()->add($fancy);
        }

        $form = $this->createForm(FancyCollectionType::class, $fancyCollection);

        $form->handleRequest($request);
        if ($form->isValid()) {
            $data = $form->getData();
        }

        return [
            'form' => $form->createView(),
            'data' => $fancyCollection,
        ];
    }
}
<?php

namespace Fuz\AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * MyArray
 *
 * @ORM\Table(
 *      name="my_array",
 *      uniqueConstraints={@ORM\UniqueConstraint(name="name_idx", columns={"name"})}
 * )
 * @ORM\Entity(repositoryClass="Fuz\AppBundle\Repository\MyArrayRepository")
 */
class MyArray
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    protected $name;

    /**
     * @var ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="MyElement", mappedBy="array", cascade={"all"}, orphanRemoval=true)
     */
    protected $elements;

    public function __construct()
    {
        $this->elements = new ArrayCollection();
    }

    public function getId()
    {
        return $this->id;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    public function getElements()
    {
        return $this->elements;
    }
}
<?php

namespace Fuz\AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * MyElement
 *
 * @ORM\Table(name="my_element"),
 * @ORM\Entity
 */
class MyElement
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var MyArray
     *
     * @ORM\ManyToOne(targetEntity="MyArray", inversedBy="elements")
     * @ORM\JoinColumn(name="my_array_id", referencedColumnName="id")
     */
    protected $array;

    /**
     * @var string
     *
     * @ORM\Column(name="value", type="string", length=255)
     */
    protected $value;

    public function setId($id)
    {
        $this->id = $id;

        return $this;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setArray(MyArray $array)
    {
        $this->array = $array;

        return $this;
    }

    public function getArray()
    {
        return $this->array;
    }

    public function setValue($value)
    {
        $this->value = $value;

        return $this;
    }

    public function getValue()
    {
        return $this->value;
    }
}
<?php

namespace Fuz\AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MyArrayType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', TextType::class, [
                'label' => 'Array name:',
        ]);

        $builder->add('elements', CollectionType::class, [
            'label'        => 'Add an element...',
            'entry_type'   => MyElementType::class,
            'allow_add'    => true,
            'allow_delete' => true,
            'prototype'    => true,
            'required'     => false,
            'by_reference' => true,
            'delete_empty' => true,
            'attr'         => [
                'class' => 'doctrine-sample',
            ],
        ]);

        $builder->add('save', SubmitType::class, [
                'label' => 'Save this array',
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'Fuz\AppBundle\Entity\MyArray',
        ]);
    }

    public function getBlockPrefix()
    {
        return 'my_array';
    }
}
<?php

namespace Fuz\AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MyElementType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('value', TextType::class, [
            'required' => false,
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'Fuz\AppBundle\Entity\MyElement',
        ]);
    }

    public function getBlockPrefix()
    {
        return 'my_element';
    }
}
<?php

namespace Fuz\AppBundle\Repository;

use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Doctrine\ORM\EntityRepository;
use Fuz\AppBundle\Entity\MyArray;

/**
 * MyArrayRepository.
 */
class MyArrayRepository extends EntityRepository
{
    public function create($name)
    {
        $data = new MyArray();
        $data->setName($name);
        try {
            $this->_em->persist($data);
            $this->_em->flush();
        } catch (UniqueConstraintViolationException $e) {
            return null;
        }

        return $data;
    }

    public function save(MyArray $data)
    {
        foreach ($data->getElements() as $element) {
            $element->setArray($data);
        }
        try {
            $this->_em->persist($data);
            $this->_em->flush();
        } catch (UniqueConstraintViolationException $e) {
            return null;
        }

        return $data;
    }

    public function getArrayNames()
    {
        $arrays = $this
            ->_em
            ->createQuery("
               SELECT arr.name
               FROM Fuz\AppBundle\Entity\MyArray arr
            ")
            ->execute();
        $names = [];
        foreach ($arrays as $array) {
            $names[] = $array['name'];
        }

        return $names;
    }

    public function delete(MyArray $data)
    {
        foreach ($data->getElements() as $element) {
            $this->_em->remove($element);
        }
        $this->_em->remove($data);
        $this->_em->flush();
    }
}

{% block my_element_label %}{% endblock %}
{% block my_element_errors %}{% endblock %}

{% block my_element_widget %}

    <div class="row">
        <div class="col-md-7">
            {{ form_widget(form.value) }}
        </div>
        <div class="col-md-2">
            <a href="#" class="collection-up btn btn-default">Up</a>
            <a href="#" class="collection-down btn btn-default">Down</a>
        </div>
        <div class="col-md-2">
            <a href="#" class="collection-remove btn btn-default">Remove</a>
            <a href="#" class="collection-add btn btn-default">Add</a>
        </div>
        <div class="col-md-1">
            <a href="#" class="collection-duplicate btn btn-default">Duplicate</a>
        </div>
    </div>

{% endblock %}
{% extends 'FuzAppBundle::layout.html.twig' %}

{% block extra_js %}
    <script src="{{ asset('js/jquery.collection.js') }}"></script>
{% endblock %}

{% block title %}Advanced usage: example with Doctrine{% endblock %}

{% block body %}

    <h2>{{ block('title') }}</h2>

    <p>
        That's not really an <i>advanced</i> topic, but the sample will be a bit hard to read (as it takes many files),
        so let's say it targets more experienced Symfony users.
    </p>

    <p>
        In this demo, we're displaying a MyArray of MyElements, both persisted into the database. The MyArray entity
        only have an id and a name, and MyElement has id, MyArray's id and a value. This is quite the same as we seen
        in all demos, but persisted.
    </p>

    <div class="text-center">
        <input type="button" id="new" class="btn btn-default" value="Create new array"/>
    </div>

    {%
        form_theme form
            'jquery.collection.html.twig'
            'FuzAppBundle:Advanced:doctrine-theme.html.twig'
    %}
    {{ form(form) }}

    <hr/>

    {% if names|length %}
        Existing arrays:
        <table class="table">
            <thead>
                <th>Name</th>
                <th>Open</th>
                <th>Delete</th>
            </thead>
            <tbody>
                {% for name in names %}
                    <tr>
                        <td>{{ name }}</td>
                        <td>
                            {% if data.name != name %}<a href="{{ path('usageWithDoctrine', {'name': name}) }}">Open</a>{% endif %}
                        </td>
                        <td><a href="{{ path('usageWithDoctrineDelete', {'name': name}) }}">Delete</a></td>
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    {% endif %}

    {{
        tabs([
            'Base/BaseController.php',
            'Controller/AdvancedController.php',
            'Resources/views/Advanced/usageWithDoctrine.html.twig',
            'Resources/views/Advanced/doctrine-theme.html.twig',
            'Entity/MyArray.php',
            'Form/MyArrayType.php',
            'Entity/MyElement.php',
            'Form/MyElementType.php',
            'Repository/MyArrayRepository.php',
        ])
    }}

{% endblock %}

{% block script %}

    <script type="text/javascript">

        // only useful for the "new" button...
        $('#new').on('click', function() {
           var name = prompt("Which name would you like to use?");
           if (name) {
               var uri = '{{ path('usageWithDoctrine', {'name': 'a'}) }}';
               document.location = uri.substr(0, uri.length - 1) + encodeURIComponent(name);
           }
        });

        $('.doctrine-sample').collection();

    </script>

{% endblock %}