├── 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 | --------------------------------------------------------------------------------