├── src
├── Controller
│ ├── .gitignore
│ └── ContactController.php
├── Domain
│ ├── Enum
│ │ ├── Interest.php
│ │ └── Age.php
│ └── Data
│ │ └── Contact.php
├── Kernel.php
└── Form
│ └── ContactType.php
├── config
├── packages
│ ├── sensio_framework_extra.yaml
│ ├── test
│ │ └── validator.yaml
│ ├── twig.yaml
│ ├── validator.yaml
│ ├── routing.yaml
│ ├── cache.yaml
│ └── framework.yaml
├── routes
│ ├── framework.yaml
│ └── annotations.yaml
├── routes.yaml
├── preload.php
├── bundles.php
└── services.yaml
├── templates
├── contact
│ ├── thanks.html.twig
│ └── index.html.twig
└── base.html.twig
├── .env.test
├── public
└── index.php
├── tests
├── bootstrap.php
├── Controller
│ └── ContactControllerTest
│ │ ├── ThanksTest.php
│ │ └── IndexTest.php
└── Form
│ └── ContactTypeTest.php
├── .gitignore
├── bin
├── console
└── phpunit
├── .env
├── phpunit.xml.dist
├── composer.json
└── symfony.lock
/src/Controller/.gitignore:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/config/packages/sensio_framework_extra.yaml:
--------------------------------------------------------------------------------
1 | sensio_framework_extra:
2 | router:
3 | annotations: false
4 |
--------------------------------------------------------------------------------
/config/packages/test/validator.yaml:
--------------------------------------------------------------------------------
1 | framework:
2 | validation:
3 | not_compromised_password: false
4 |
--------------------------------------------------------------------------------
/config/packages/twig.yaml:
--------------------------------------------------------------------------------
1 | twig:
2 | default_path: '%kernel.project_dir%/templates'
3 |
4 | when@test:
5 | twig:
6 | strict_variables: true
7 |
--------------------------------------------------------------------------------
/config/routes/framework.yaml:
--------------------------------------------------------------------------------
1 | when@dev:
2 | _errors:
3 | resource: '@FrameworkBundle/Resources/config/routing/errors.xml'
4 | prefix: /_error
5 |
--------------------------------------------------------------------------------
/config/routes.yaml:
--------------------------------------------------------------------------------
1 | controllers:
2 | resource: ../src/Controller/
3 | type: annotation
4 |
5 | kernel:
6 | resource: ../src/Kernel.php
7 | type: annotation
8 |
--------------------------------------------------------------------------------
/templates/contact/thanks.html.twig:
--------------------------------------------------------------------------------
1 | {% extends 'base.html.twig' %}
2 |
3 | {% block title %}送信完了{% endblock %}
4 |
5 | {% block body %}
6 |
ありがとうございました。
7 | {% endblock %}
8 |
--------------------------------------------------------------------------------
/config/routes/annotations.yaml:
--------------------------------------------------------------------------------
1 | controllers:
2 | resource: ../../src/Controller/
3 | type: annotation
4 |
5 | kernel:
6 | resource: ../../src/Kernel.php
7 | type: annotation
8 |
--------------------------------------------------------------------------------
/config/preload.php:
--------------------------------------------------------------------------------
1 |
7 | {{ form_widget(form) }}
8 |
9 |
10 | {% endblock %}
11 |
--------------------------------------------------------------------------------
/tests/bootstrap.php:
--------------------------------------------------------------------------------
1 | bootEnv(dirname(__DIR__).'/.env');
11 | }
12 |
--------------------------------------------------------------------------------
/config/packages/routing.yaml:
--------------------------------------------------------------------------------
1 | framework:
2 | router:
3 | utf8: true
4 |
5 | # Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
6 | # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
7 | #default_uri: http://localhost
8 |
9 | when@prod:
10 | framework:
11 | router:
12 | strict_requirements: null
13 |
--------------------------------------------------------------------------------
/config/bundles.php:
--------------------------------------------------------------------------------
1 | ['all' => true],
5 | Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
6 | Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
7 | Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
8 | Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
9 | ];
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | ###> symfony/framework-bundle ###
3 | /.env.local
4 | /.env.local.php
5 | /.env.*.local
6 | /config/secrets/prod/prod.decrypt.private.php
7 | /public/bundles/
8 | /var/
9 | /vendor/
10 | ###< symfony/framework-bundle ###
11 |
12 | ###> symfony/phpunit-bridge ###
13 | .phpunit.result.cache
14 | /phpunit.xml
15 | ###< symfony/phpunit-bridge ###
16 |
17 | ###> phpunit/phpunit ###
18 | /phpunit.xml
19 | .phpunit.result.cache
20 | ###< phpunit/phpunit ###
21 |
--------------------------------------------------------------------------------
/bin/console:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 | request('GET', '/contact/thanks');
14 | $response = $client->getResponse();
15 | $this->assertTrue($response->isOk(), (string) $response->getContent());
16 | $this->assertTrue($crawler->filter('form')->count() === 0);
17 | $this->assertEquals('送信完了', $crawler->filter('title')->text());
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/bin/phpunit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env php
2 |
2 |
3 |
4 |
5 | {% block title %}Welcome!{% endblock %}
6 |
7 | {# Run `composer require symfony/webpack-encore-bundle` to start using Symfony UX #}
8 | {% block stylesheets %}
9 | {{ encore_entry_link_tags('app') }}
10 | {% endblock %}
11 |
12 | {% block javascripts %}
13 | {{ encore_entry_script_tags('app') }}
14 | {% endblock %}
15 |
16 |
17 | {% block body %}{% endblock %}
18 |
19 |
20 |
--------------------------------------------------------------------------------
/config/packages/framework.yaml:
--------------------------------------------------------------------------------
1 | # see https://symfony.com/doc/current/reference/configuration/framework.html
2 | framework:
3 | secret: '%env(APP_SECRET)%'
4 | #csrf_protection: true
5 | http_method_override: false
6 |
7 | # Enables session support. Note that the session will ONLY be started if you read or write from it.
8 | # Remove or comment this section to explicitly disable session support.
9 | session:
10 | handler_id: null
11 | cookie_secure: auto
12 | cookie_samesite: lax
13 | storage_factory_id: session.storage.factory.native
14 |
15 | #esi: true
16 | #fragments: true
17 | php_errors:
18 | log: true
19 |
20 | when@test:
21 | framework:
22 | test: true
23 | session:
24 | storage_factory_id: session.storage.factory.mock_file
25 |
--------------------------------------------------------------------------------
/.env:
--------------------------------------------------------------------------------
1 | # In all environments, the following files are loaded if they exist,
2 | # the latter taking precedence over the former:
3 | #
4 | # * .env contains default values for the environment variables needed by the app
5 | # * .env.local uncommitted file with local overrides
6 | # * .env.$APP_ENV committed environment-specific defaults
7 | # * .env.$APP_ENV.local uncommitted environment-specific overrides
8 | #
9 | # Real environment variables win over .env files.
10 | #
11 | # DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
12 | #
13 | # Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
14 | # https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
15 |
16 | ###> symfony/framework-bundle ###
17 | APP_ENV=dev
18 | APP_SECRET=71be8b9dbb7c6084193253f07f2cdb5e
19 | ###< symfony/framework-bundle ###
20 |
--------------------------------------------------------------------------------
/tests/Form/ContactTypeTest.php:
--------------------------------------------------------------------------------
1 | factory->create(ContactType::class);
17 | $form->submit([
18 | 'name' => '77web',
19 | 'age' => 3, // Age::AGE_40_TO_49の4番目のcase
20 | 'interests' => ['php', 'angular', 'aws'],
21 | 'opinion' => 'I love Symfony',
22 | ]);
23 | $this->assertTrue($form->isValid());
24 |
25 | $data = $form->getData();
26 | $this->assertTrue($data instanceof Contact);
27 | $this->assertEquals(Age::AGE_40_TO_49, $data->getAge());
28 | $this->assertEquals([Interest::PHP, Interest::FRONTEND, Interest::INFRA], $data->getInterests());
29 | $this->assertEquals('77web', $data->getName());
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/src/Form/ContactType.php:
--------------------------------------------------------------------------------
1 | add('name')
19 | ->add('age', EnumType::class, [
20 | 'class' => Age::class,
21 | ])
22 | ->add('interests', EnumType::class, [
23 | 'class' => Interest::class,
24 | 'multiple' => true,
25 | 'expanded' => true,
26 | ])
27 | ->add('opinion')
28 | ;
29 | }
30 |
31 | public function configureOptions(OptionsResolver $resolver): void
32 | {
33 | $resolver->setDefaults([
34 | 'data_class' => Contact::class,
35 | ]);
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/config/services.yaml:
--------------------------------------------------------------------------------
1 | # This file is the entry point to configure your own services.
2 | # Files in the packages/ subdirectory configure your dependencies.
3 |
4 | # Put parameters here that don't need to change on each machine where the app is deployed
5 | # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
6 | parameters:
7 |
8 | services:
9 | # default configuration for services in *this* file
10 | _defaults:
11 | autowire: true # Automatically injects dependencies in your services.
12 | autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
13 |
14 | # makes classes in src/ available to be used as services
15 | # this creates a service per class whose id is the fully-qualified class name
16 | App\:
17 | resource: '../src/'
18 | exclude:
19 | - '../src/DependencyInjection/'
20 | - '../src/Entity/'
21 | - '../src/Kernel.php'
22 | - '../src/Tests/'
23 |
24 | # add more service definitions when explicit configuration is needed
25 | # please note that last definitions always *replace* previous ones
26 | App\Controller\:
27 | resource: '../src/Controller'
28 | tags:
29 | - { name: controller.service_arguments }
30 |
--------------------------------------------------------------------------------
/src/Controller/ContactController.php:
--------------------------------------------------------------------------------
1 | formFactory->createNamed('', ContactType::class);
26 | $form->handleRequest($request);
27 | if ($form->isSubmitted() && $form->isValid()) {
28 | // TODO send mail to us :)
29 | return new RedirectResponse($this->urlGenerator->generate('contact_thanks'));
30 | }
31 |
32 | return [
33 | 'form' => $form->createView(),
34 | ];
35 | }
36 |
37 | #[Route('/contact/thanks', name: 'contact_thanks')]
38 | #[Template]
39 | public function thanks(): array
40 | {
41 | return [];
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/tests/Controller/ContactControllerTest/IndexTest.php:
--------------------------------------------------------------------------------
1 | request('GET', '/contact');
14 | $response = $client->getResponse();
15 | $this->assertTrue($response->isOk(), (string) $response->getContent());
16 | $this->assertTrue($crawler->filter('form')->count() === 1);
17 | $this->assertEquals('フォーム', $crawler->filter('title')->text());
18 | }
19 |
20 | public function test_フォーム送信()
21 | {
22 | $client = static::createClient();
23 | $crawler = $client->request('GET', '/contact');
24 | $response = $client->getResponse();
25 | $this->assertTrue($response->isOk(), (string) $response->getContent());
26 |
27 | $form = $crawler->selectButton('フォーム送信')->form();
28 | $form['name'] = '77web';
29 | $form['age'] = 3;
30 | $form['interests[0]']->tick();
31 | $form['opinion'] = 'enum is great';
32 | $client->submit($form);
33 |
34 | $sendResponse = $client->getResponse();
35 | $this->assertTrue($sendResponse->isRedirect('/contact/thanks'), (string) $sendResponse->getStatusCode());
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/phpunit.xml.dist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | tests
23 |
24 |
25 |
26 |
27 |
28 | src
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
42 |
43 |
--------------------------------------------------------------------------------
/src/Domain/Data/Contact.php:
--------------------------------------------------------------------------------
1 | name;
30 | }
31 |
32 | /**
33 | * @param string|null $name
34 | * @return Contact
35 | */
36 | public function setName(?string $name): self
37 | {
38 | $this->name = $name;
39 | return $this;
40 | }
41 |
42 | /**
43 | * @return Age|null
44 | */
45 | public function getAge(): ?Age
46 | {
47 | return $this->age;
48 | }
49 |
50 | /**
51 | * @param Age|null $age
52 | * @return Contact
53 | */
54 | public function setAge(?Age $age): self
55 | {
56 | $this->age = $age;
57 | return $this;
58 | }
59 |
60 | /**
61 | * @return Interest[]
62 | */
63 | public function getInterests(): array
64 | {
65 | return $this->interests ?? [];
66 | }
67 |
68 | /**
69 | * @param null|Interest[] $interests
70 | * @return Contact
71 | */
72 | public function setInterests(?array $interests): self
73 | {
74 | $this->interests = $interests;
75 | return $this;
76 | }
77 |
78 | /**
79 | * @return string|null
80 | */
81 | public function getOpinion(): ?string
82 | {
83 | return $this->opinion;
84 | }
85 |
86 | /**
87 | * @param string|null $opinion
88 | * @return Contact
89 | */
90 | public function setOpinion(?string $opinion): self
91 | {
92 | $this->opinion = $opinion;
93 | return $this;
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "project",
3 | "license": "proprietary",
4 | "minimum-stability": "stable",
5 | "prefer-stable": true,
6 | "require": {
7 | "php": ">=8.1.0",
8 | "ext-ctype": "*",
9 | "ext-iconv": "*",
10 | "sensio/framework-extra-bundle": "^6.2",
11 | "symfony/console": "6.0.*",
12 | "symfony/dotenv": "6.0.*",
13 | "symfony/flex": "^2",
14 | "symfony/form": "6.0.*",
15 | "symfony/framework-bundle": "6.0.*",
16 | "symfony/runtime": "6.0.*",
17 | "symfony/twig-bundle": "6.0.*",
18 | "symfony/validator": "6.0.*",
19 | "symfony/yaml": "6.0.*",
20 | "twig/extra-bundle": "^2.12|^3.0",
21 | "twig/twig": "^2.12|^3.0"
22 | },
23 | "config": {
24 | "optimize-autoloader": true,
25 | "preferred-install": {
26 | "*": "dist"
27 | },
28 | "sort-packages": true
29 | },
30 | "autoload": {
31 | "psr-4": {
32 | "App\\": "src/"
33 | }
34 | },
35 | "autoload-dev": {
36 | "psr-4": {
37 | "App\\Tests\\": "tests/"
38 | }
39 | },
40 | "replace": {
41 | "symfony/polyfill-ctype": "*",
42 | "symfony/polyfill-iconv": "*",
43 | "symfony/polyfill-php72": "*",
44 | "symfony/polyfill-php73": "*",
45 | "symfony/polyfill-php74": "*",
46 | "symfony/polyfill-php80": "*"
47 | },
48 | "scripts": {
49 | "auto-scripts": {
50 | "cache:clear": "symfony-cmd",
51 | "assets:install %PUBLIC_DIR%": "symfony-cmd"
52 | },
53 | "post-install-cmd": [
54 | "@auto-scripts"
55 | ],
56 | "post-update-cmd": [
57 | "@auto-scripts"
58 | ]
59 | },
60 | "conflict": {
61 | "symfony/symfony": "*"
62 | },
63 | "extra": {
64 | "symfony": {
65 | "allow-contrib": false,
66 | "require": "6.0.*"
67 | }
68 | },
69 | "require-dev": {
70 | "phpunit/phpunit": "^9.5",
71 | "symfony/browser-kit": "6.0.*",
72 | "symfony/css-selector": "6.0.*",
73 | "symfony/maker-bundle": "^1.36",
74 | "symfony/phpunit-bridge": "^6.0"
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/symfony.lock:
--------------------------------------------------------------------------------
1 | {
2 | "doctrine/annotations": {
3 | "version": "1.13",
4 | "recipe": {
5 | "repo": "github.com/symfony/recipes",
6 | "branch": "master",
7 | "version": "1.0",
8 | "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457"
9 | },
10 | "files": [
11 | "config/routes/annotations.yaml"
12 | ]
13 | },
14 | "doctrine/inflector": {
15 | "version": "2.0.4"
16 | },
17 | "doctrine/instantiator": {
18 | "version": "1.4.0"
19 | },
20 | "doctrine/lexer": {
21 | "version": "1.2.1"
22 | },
23 | "myclabs/deep-copy": {
24 | "version": "1.10.2"
25 | },
26 | "nikic/php-parser": {
27 | "version": "v4.13.2"
28 | },
29 | "phar-io/manifest": {
30 | "version": "2.0.3"
31 | },
32 | "phar-io/version": {
33 | "version": "3.1.0"
34 | },
35 | "phpdocumentor/reflection-common": {
36 | "version": "2.2.0"
37 | },
38 | "phpdocumentor/reflection-docblock": {
39 | "version": "5.3.0"
40 | },
41 | "phpdocumentor/type-resolver": {
42 | "version": "1.5.1"
43 | },
44 | "phpspec/prophecy": {
45 | "version": "1.14.0"
46 | },
47 | "phpunit/php-code-coverage": {
48 | "version": "9.2.9"
49 | },
50 | "phpunit/php-file-iterator": {
51 | "version": "3.0.6"
52 | },
53 | "phpunit/php-invoker": {
54 | "version": "3.1.1"
55 | },
56 | "phpunit/php-text-template": {
57 | "version": "2.0.4"
58 | },
59 | "phpunit/php-timer": {
60 | "version": "5.0.3"
61 | },
62 | "phpunit/phpunit": {
63 | "version": "9.5",
64 | "recipe": {
65 | "repo": "github.com/symfony/recipes",
66 | "branch": "master",
67 | "version": "9.3",
68 | "ref": "a6249a6c4392e9169b87abf93225f7f9f59025e6"
69 | },
70 | "files": [
71 | ".env.test",
72 | "phpunit.xml.dist",
73 | "tests/bootstrap.php"
74 | ]
75 | },
76 | "psr/cache": {
77 | "version": "3.0.0"
78 | },
79 | "psr/container": {
80 | "version": "2.0.2"
81 | },
82 | "psr/event-dispatcher": {
83 | "version": "1.0.0"
84 | },
85 | "psr/log": {
86 | "version": "3.0.0"
87 | },
88 | "sebastian/cli-parser": {
89 | "version": "1.0.1"
90 | },
91 | "sebastian/code-unit": {
92 | "version": "1.0.8"
93 | },
94 | "sebastian/code-unit-reverse-lookup": {
95 | "version": "2.0.3"
96 | },
97 | "sebastian/comparator": {
98 | "version": "4.0.6"
99 | },
100 | "sebastian/complexity": {
101 | "version": "2.0.2"
102 | },
103 | "sebastian/diff": {
104 | "version": "4.0.4"
105 | },
106 | "sebastian/environment": {
107 | "version": "5.1.3"
108 | },
109 | "sebastian/exporter": {
110 | "version": "4.0.4"
111 | },
112 | "sebastian/global-state": {
113 | "version": "5.0.3"
114 | },
115 | "sebastian/lines-of-code": {
116 | "version": "1.0.3"
117 | },
118 | "sebastian/object-enumerator": {
119 | "version": "4.0.4"
120 | },
121 | "sebastian/object-reflector": {
122 | "version": "2.0.4"
123 | },
124 | "sebastian/recursion-context": {
125 | "version": "4.0.4"
126 | },
127 | "sebastian/resource-operations": {
128 | "version": "3.0.3"
129 | },
130 | "sebastian/type": {
131 | "version": "2.3.4"
132 | },
133 | "sebastian/version": {
134 | "version": "3.0.2"
135 | },
136 | "sensio/framework-extra-bundle": {
137 | "version": "6.2",
138 | "recipe": {
139 | "repo": "github.com/symfony/recipes",
140 | "branch": "master",
141 | "version": "5.2",
142 | "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b"
143 | },
144 | "files": [
145 | "config/packages/sensio_framework_extra.yaml"
146 | ]
147 | },
148 | "symfony/browser-kit": {
149 | "version": "v6.0.0"
150 | },
151 | "symfony/cache": {
152 | "version": "v6.0.0"
153 | },
154 | "symfony/cache-contracts": {
155 | "version": "v3.0.0"
156 | },
157 | "symfony/config": {
158 | "version": "v6.0.0"
159 | },
160 | "symfony/console": {
161 | "version": "6.0",
162 | "recipe": {
163 | "repo": "github.com/symfony/recipes",
164 | "branch": "master",
165 | "version": "5.3",
166 | "ref": "da0c8be8157600ad34f10ff0c9cc91232522e047"
167 | },
168 | "files": [
169 | "bin/console"
170 | ]
171 | },
172 | "symfony/css-selector": {
173 | "version": "v6.0.0"
174 | },
175 | "symfony/dependency-injection": {
176 | "version": "v6.0.0"
177 | },
178 | "symfony/deprecation-contracts": {
179 | "version": "v3.0.0"
180 | },
181 | "symfony/dom-crawler": {
182 | "version": "v6.0.0"
183 | },
184 | "symfony/dotenv": {
185 | "version": "v6.0.0"
186 | },
187 | "symfony/error-handler": {
188 | "version": "v6.0.0"
189 | },
190 | "symfony/event-dispatcher": {
191 | "version": "v6.0.0"
192 | },
193 | "symfony/event-dispatcher-contracts": {
194 | "version": "v3.0.0"
195 | },
196 | "symfony/filesystem": {
197 | "version": "v6.0.0"
198 | },
199 | "symfony/finder": {
200 | "version": "v6.0.0"
201 | },
202 | "symfony/flex": {
203 | "version": "2.0",
204 | "recipe": {
205 | "repo": "github.com/symfony/recipes",
206 | "branch": "master",
207 | "version": "1.0",
208 | "ref": "c0eeb50665f0f77226616b6038a9b06c03752d8e"
209 | },
210 | "files": [
211 | ".env"
212 | ]
213 | },
214 | "symfony/form": {
215 | "version": "v6.0.0"
216 | },
217 | "symfony/framework-bundle": {
218 | "version": "6.0",
219 | "recipe": {
220 | "repo": "github.com/symfony/recipes",
221 | "branch": "master",
222 | "version": "5.4",
223 | "ref": "d4131812e20853626928e73d3effef44014944c0"
224 | },
225 | "files": [
226 | "config/packages/cache.yaml",
227 | "config/packages/framework.yaml",
228 | "config/preload.php",
229 | "config/routes/framework.yaml",
230 | "config/services.yaml",
231 | "public/index.php",
232 | "src/Controller/.gitignore",
233 | "src/Kernel.php"
234 | ]
235 | },
236 | "symfony/http-foundation": {
237 | "version": "v6.0.0"
238 | },
239 | "symfony/http-kernel": {
240 | "version": "v6.0.0"
241 | },
242 | "symfony/maker-bundle": {
243 | "version": "1.36",
244 | "recipe": {
245 | "repo": "github.com/symfony/recipes",
246 | "branch": "master",
247 | "version": "1.0",
248 | "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f"
249 | }
250 | },
251 | "symfony/options-resolver": {
252 | "version": "v6.0.0"
253 | },
254 | "symfony/phpunit-bridge": {
255 | "version": "6.0",
256 | "recipe": {
257 | "repo": "github.com/symfony/recipes",
258 | "branch": "master",
259 | "version": "5.3",
260 | "ref": "97cb3dc7b0f39c7cfc4b7553504c9d7b7795de96"
261 | },
262 | "files": [
263 | ".env.test",
264 | "bin/phpunit",
265 | "phpunit.xml.dist",
266 | "tests/bootstrap.php"
267 | ]
268 | },
269 | "symfony/polyfill-intl-grapheme": {
270 | "version": "v1.23.1"
271 | },
272 | "symfony/polyfill-intl-icu": {
273 | "version": "v1.23.0"
274 | },
275 | "symfony/polyfill-intl-normalizer": {
276 | "version": "v1.23.0"
277 | },
278 | "symfony/polyfill-mbstring": {
279 | "version": "v1.23.1"
280 | },
281 | "symfony/polyfill-php81": {
282 | "version": "v1.23.0"
283 | },
284 | "symfony/property-access": {
285 | "version": "v6.0.0"
286 | },
287 | "symfony/property-info": {
288 | "version": "v6.0.0"
289 | },
290 | "symfony/routing": {
291 | "version": "6.0",
292 | "recipe": {
293 | "repo": "github.com/symfony/recipes",
294 | "branch": "master",
295 | "version": "6.0",
296 | "ref": "ab9ad892b7bba7ac584f6dc2ccdb659d358c63c5"
297 | },
298 | "files": [
299 | "config/packages/routing.yaml",
300 | "config/routes.yaml"
301 | ]
302 | },
303 | "symfony/runtime": {
304 | "version": "v6.0.0"
305 | },
306 | "symfony/service-contracts": {
307 | "version": "v3.0.0"
308 | },
309 | "symfony/string": {
310 | "version": "v6.0.0"
311 | },
312 | "symfony/translation-contracts": {
313 | "version": "v3.0.0"
314 | },
315 | "symfony/twig-bridge": {
316 | "version": "v6.0.0"
317 | },
318 | "symfony/twig-bundle": {
319 | "version": "6.0",
320 | "recipe": {
321 | "repo": "github.com/symfony/recipes",
322 | "branch": "master",
323 | "version": "5.4",
324 | "ref": "bffbb8f1a849736e64006735afae730cb428b6ff"
325 | },
326 | "files": [
327 | "config/packages/twig.yaml",
328 | "templates/base.html.twig"
329 | ]
330 | },
331 | "symfony/validator": {
332 | "version": "6.0",
333 | "recipe": {
334 | "repo": "github.com/symfony/recipes",
335 | "branch": "master",
336 | "version": "4.3",
337 | "ref": "3eb8df139ec05414489d55b97603c5f6ca0c44cb"
338 | },
339 | "files": [
340 | "config/packages/test/validator.yaml",
341 | "config/packages/validator.yaml"
342 | ]
343 | },
344 | "symfony/var-dumper": {
345 | "version": "v6.0.0"
346 | },
347 | "symfony/var-exporter": {
348 | "version": "v6.0.0"
349 | },
350 | "symfony/yaml": {
351 | "version": "v6.0.0"
352 | },
353 | "theseer/tokenizer": {
354 | "version": "1.2.1"
355 | },
356 | "twig/extra-bundle": {
357 | "version": "v3.3.4"
358 | },
359 | "twig/twig": {
360 | "version": "v3.3.4"
361 | },
362 | "webmozart/assert": {
363 | "version": "1.10.0"
364 | }
365 | }
366 |
--------------------------------------------------------------------------------