From eefc1a072eec3e8f8a60dc6f20f7f8c582efdde8 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 18 Nov 2018 16:35:02 +0100 Subject: [PATCH] [DI] the reproducer for bug 29246 --- reproducer-29246/.env | 13 ++ reproducer-29246/.gitignore | 7 + reproducer-29246/.lando.yml | 34 +++ reproducer-29246/bin/console | 40 ++++ reproducer-29246/composer.json | 56 +++++ reproducer-29246/config/bundles.php | 9 + .../config/packages/doctrine.yaml | 17 ++ .../config/packages/framework.yaml | 32 +++ reproducer-29246/config/packages/msgphp.php | 22 ++ .../config/packages/prod/doctrine.yaml | 31 +++ .../config/packages/test/framework.yaml | 4 + reproducer-29246/config/services.yaml | 8 + reproducer-29246/public/index.php | 27 +++ reproducer-29246/src/.bootstrap.php | 21 ++ reproducer-29246/src/Entity/User/User.php | 34 +++ .../src/Entity/User/UserEmail.php | 35 ++++ reproducer-29246/src/Entity/User/Username.php | 15 ++ reproducer-29246/src/Kernel.php | 58 ++++++ reproducer-29246/symfony.lock | 194 ++++++++++++++++++ 19 files changed, 657 insertions(+) create mode 100644 reproducer-29246/.env create mode 100644 reproducer-29246/.gitignore create mode 100644 reproducer-29246/.lando.yml create mode 100755 reproducer-29246/bin/console create mode 100644 reproducer-29246/composer.json create mode 100644 reproducer-29246/config/bundles.php create mode 100644 reproducer-29246/config/packages/doctrine.yaml create mode 100644 reproducer-29246/config/packages/framework.yaml create mode 100644 reproducer-29246/config/packages/msgphp.php create mode 100644 reproducer-29246/config/packages/prod/doctrine.yaml create mode 100644 reproducer-29246/config/packages/test/framework.yaml create mode 100644 reproducer-29246/config/services.yaml create mode 100644 reproducer-29246/public/index.php create mode 100644 reproducer-29246/src/.bootstrap.php create mode 100644 reproducer-29246/src/Entity/User/User.php create mode 100644 reproducer-29246/src/Entity/User/UserEmail.php create mode 100644 reproducer-29246/src/Entity/User/Username.php create mode 100644 reproducer-29246/src/Kernel.php create mode 100644 reproducer-29246/symfony.lock diff --git a/reproducer-29246/.env b/reproducer-29246/.env new file mode 100644 index 0000000000000..1349cae87a4ab --- /dev/null +++ b/reproducer-29246/.env @@ -0,0 +1,13 @@ +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET=6055ddd43cc57a932559ce2520118d8f +#TRUSTED_PROXIES=127.0.0.1,127.0.0.2 +#TRUSTED_HOSTS=localhost,example.com +###< symfony/framework-bundle ### + +###> doctrine/doctrine-bundle ### +# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url +# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db" +# Configure your db driver and server_version in config/packages/doctrine.yaml +DATABASE_URL=sqlite:///%kernel.project_dir%/var/data.db +###< doctrine/doctrine-bundle ### diff --git a/reproducer-29246/.gitignore b/reproducer-29246/.gitignore new file mode 100644 index 0000000000000..7bcd56ec29667 --- /dev/null +++ b/reproducer-29246/.gitignore @@ -0,0 +1,7 @@ +###> symfony/framework-bundle ### +/.env.local +/.env.*.local +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### diff --git a/reproducer-29246/.lando.yml b/reproducer-29246/.lando.yml new file mode 100644 index 0000000000000..c02593f0acc85 --- /dev/null +++ b/reproducer-29246/.lando.yml @@ -0,0 +1,34 @@ +name: sf +recipe: lemp + +config: + php: 7.2 + webroot: public + database: mariadb + +tooling: + php: + service: appserver + description: Run PHP commands + cmd: + - php + composer: + service: appserver + description: Run Composer commands + cmd: + - composer + bash: + service: appserver + description: Run bash commands + cmd: + - bash + - -xc + sf: + service: appserver + description: Run Symfony commands + cmd: + - bin/console + +events: + post-start: + appserver: "composer install --working-dir=$LANDO_MOUNT" diff --git a/reproducer-29246/bin/console b/reproducer-29246/bin/console new file mode 100755 index 0000000000000..0d0ea9fb1b467 --- /dev/null +++ b/reproducer-29246/bin/console @@ -0,0 +1,40 @@ +#!/usr/bin/env php +getParameterOption(['--env', '-e'], null, true)) { + putenv('APP_ENV='.$_ENV['APP_ENV']); + // force loading .env files when --env is defined + $_SERVER['APP_ENV'] = null; +} + +if ($input->hasParameterOption('--no-debug', true)) { + putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); +} + +require dirname(__DIR__).'/src/.bootstrap.php'; + +if ($_SERVER['APP_DEBUG']) { + umask(0000); + + if (class_exists(Debug::class)) { + Debug::enable(); + } +} + +$kernel = new Kernel($_SERVER['APP_ENV'], $_SERVER['APP_DEBUG']); +$application = new Application($kernel); +$application->run($input); diff --git a/reproducer-29246/composer.json b/reproducer-29246/composer.json new file mode 100644 index 0000000000000..ad42f66357954 --- /dev/null +++ b/reproducer-29246/composer.json @@ -0,0 +1,56 @@ +{ + "prefer-stable": true, + "minimum-stability": "dev", + "require": { + "msgphp/user-bundle": "0.7.*", + "symfony/console": "dev-master", + "symfony/flex": "^1.1", + "symfony/framework-bundle": "dev-master", + "symfony/orm-pack": "^1.0", + "symfony/yaml": "dev-master" + }, + "require-dev": { + "symfony/dotenv": "dev-master" + }, + "config": { + "preferred-install": { + "*": "dist" + }, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "replace": { + "paragonie/random_compat": "2.*", + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php71": "*", + "symfony/polyfill-php70": "*", + "symfony/polyfill-php56": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ] + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "id": "", + "allow-contrib": true, + "require": "4.2.*" + } + } +} diff --git a/reproducer-29246/config/bundles.php b/reproducer-29246/config/bundles.php new file mode 100644 index 0000000000000..0cee0f3c63240 --- /dev/null +++ b/reproducer-29246/config/bundles.php @@ -0,0 +1,9 @@ + ['all' => true], + Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], + MsgPhp\UserBundle\MsgPhpUserBundle::class => ['all' => true], + Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class => ['all' => true], + Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], +]; diff --git a/reproducer-29246/config/packages/doctrine.yaml b/reproducer-29246/config/packages/doctrine.yaml new file mode 100644 index 0000000000000..c42a04e1403d8 --- /dev/null +++ b/reproducer-29246/config/packages/doctrine.yaml @@ -0,0 +1,17 @@ +doctrine: + dbal: + url: '%env(resolve:DATABASE_URL)%' + charset: utf8mb4 + default_table_options: + charset: utf8mb4 + collate: utf8mb4_unicode_ci + + orm: + auto_generate_proxy_classes: '%kernel.debug%' + naming_strategy: doctrine.orm.naming_strategy.underscore + mappings: + app: + dir: '%kernel.project_dir%/src/Entity' + type: annotation + prefix: App\Entity + alias: App diff --git a/reproducer-29246/config/packages/framework.yaml b/reproducer-29246/config/packages/framework.yaml new file mode 100644 index 0000000000000..6d885470d5dcd --- /dev/null +++ b/reproducer-29246/config/packages/framework.yaml @@ -0,0 +1,32 @@ +framework: + secret: '%env(APP_SECRET)%' + #default_locale: en + #csrf_protection: true + #http_method_override: true + + # Enables session support. Note that the session will ONLY be started if you read or write from it. + # Remove or comment this section to explicitly disable session support. + session: + handler_id: ~ + cookie_secure: auto + cookie_samesite: lax + + #esi: true + #fragments: true + php_errors: + log: true + + cache: + # Put the unique name of your app here: the prefix seed + # is used to compute stable namespaces for cache keys. + #prefix_seed: your_vendor_name/app_name + + # The app cache caches to the filesystem by default. + # Other options include: + + # Redis + #app: cache.adapter.redis + #default_redis_provider: redis://localhost + + # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) + #app: cache.adapter.apcu diff --git a/reproducer-29246/config/packages/msgphp.php b/reproducer-29246/config/packages/msgphp.php new file mode 100644 index 0000000000000..8e8ef476e132e --- /dev/null +++ b/reproducer-29246/config/packages/msgphp.php @@ -0,0 +1,22 @@ +extension('msgphp_user', [ + 'class_mapping' => [ + User\Entity\User::class => \App\Entity\User\User::class, + User\Entity\UserEmail::class => \App\Entity\User\UserEmail::class, + User\Entity\Username::class => \App\Entity\User\Username::class, + ], + 'username_lookup' => [ + ['target' => User\Entity\UserEmail::class, 'field' => 'email', 'mapped_by' => 'user'], + ], + ]); + + $container->parameters() + ->set('msgphp.doctrine.mapping_config', [ + 'key_max_length' => 191, + ]); +}; diff --git a/reproducer-29246/config/packages/prod/doctrine.yaml b/reproducer-29246/config/packages/prod/doctrine.yaml new file mode 100644 index 0000000000000..2f16f0fdea982 --- /dev/null +++ b/reproducer-29246/config/packages/prod/doctrine.yaml @@ -0,0 +1,31 @@ +doctrine: + orm: + metadata_cache_driver: + type: service + id: doctrine.system_cache_provider + query_cache_driver: + type: service + id: doctrine.system_cache_provider + result_cache_driver: + type: service + id: doctrine.result_cache_provider + +services: + doctrine.result_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.result_cache_pool' + doctrine.system_cache_provider: + class: Symfony\Component\Cache\DoctrineProvider + public: false + arguments: + - '@doctrine.system_cache_pool' + +framework: + cache: + pools: + doctrine.result_cache_pool: + adapter: cache.app + doctrine.system_cache_pool: + adapter: cache.system diff --git a/reproducer-29246/config/packages/test/framework.yaml b/reproducer-29246/config/packages/test/framework.yaml new file mode 100644 index 0000000000000..d051c840086e3 --- /dev/null +++ b/reproducer-29246/config/packages/test/framework.yaml @@ -0,0 +1,4 @@ +framework: + test: true + session: + storage_id: session.storage.mock_file diff --git a/reproducer-29246/config/services.yaml b/reproducer-29246/config/services.yaml new file mode 100644 index 0000000000000..3ccf5b585499f --- /dev/null +++ b/reproducer-29246/config/services.yaml @@ -0,0 +1,8 @@ +parameters: + locale: 'en' + +services: + _defaults: + autowire: true + autoconfigure: true + public: false diff --git a/reproducer-29246/public/index.php b/reproducer-29246/public/index.php new file mode 100644 index 0000000000000..3f40a88b5d249 --- /dev/null +++ b/reproducer-29246/public/index.php @@ -0,0 +1,27 @@ +handle($request); +$response->send(); +$kernel->terminate($request, $response); diff --git a/reproducer-29246/src/.bootstrap.php b/reproducer-29246/src/.bootstrap.php new file mode 100644 index 0000000000000..95c1cd41a2969 --- /dev/null +++ b/reproducer-29246/src/.bootstrap.php @@ -0,0 +1,21 @@ +loadEnv(dirname(__DIR__).'/.env'); +} + +$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $_SERVER['APP_ENV'] ?: $_ENV['APP_ENV'] ?: 'dev'; +$_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; +$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; diff --git a/reproducer-29246/src/Entity/User/User.php b/reproducer-29246/src/Entity/User/User.php new file mode 100644 index 0000000000000..39f0d517e7e97 --- /dev/null +++ b/reproducer-29246/src/Entity/User/User.php @@ -0,0 +1,34 @@ +id = $id; + $this->credential = new EmailPassword($email, $password); + } + + public function getId(): UserIdInterface + { + return $this->id; + } +} diff --git a/reproducer-29246/src/Entity/User/UserEmail.php b/reproducer-29246/src/Entity/User/UserEmail.php new file mode 100644 index 0000000000000..c682f572ae3b5 --- /dev/null +++ b/reproducer-29246/src/Entity/User/UserEmail.php @@ -0,0 +1,35 @@ +confirm(); + } else { + $this->confirmationToken = bin2hex(random_bytes(32)); + } + } +} diff --git a/reproducer-29246/src/Entity/User/Username.php b/reproducer-29246/src/Entity/User/Username.php new file mode 100644 index 0000000000000..a13629f517b6f --- /dev/null +++ b/reproducer-29246/src/Entity/User/Username.php @@ -0,0 +1,15 @@ +getProjectDir().'/var/cache/'.$this->environment; + } + + public function getLogDir() + { + return $this->getProjectDir().'/var/log'; + } + + public function registerBundles() + { + $contents = require $this->getProjectDir().'/config/bundles.php'; + foreach ($contents as $class => $envs) { + if ($envs[$this->environment] ?? $envs['all'] ?? false) { + yield new $class(); + } + } + } + + protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader) + { + $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); + $container->setParameter('container.dumper.inline_class_loader', true); + $confDir = $this->getProjectDir().'/config'; + + $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/{packages}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob'); + $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); + } + + protected function configureRoutes(RouteCollectionBuilder $routes) + { + $confDir = $this->getProjectDir().'/config'; + + $routes->import($confDir.'/{routes}/*'.self::CONFIG_EXTS, '/', 'glob'); + $routes->import($confDir.'/{routes}/'.$this->environment.'/**/*'.self::CONFIG_EXTS, '/', 'glob'); + $routes->import($confDir.'/{routes}'.self::CONFIG_EXTS, '/', 'glob'); + } +} diff --git a/reproducer-29246/symfony.lock b/reproducer-29246/symfony.lock new file mode 100644 index 0000000000000..49cc96793230d --- /dev/null +++ b/reproducer-29246/symfony.lock @@ -0,0 +1,194 @@ +{ + "doctrine/annotations": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "cb4152ebcadbe620ea2261da1a1c5a9b8cea7672" + } + }, + "doctrine/cache": { + "version": "v1.8.0" + }, + "doctrine/collections": { + "version": "v1.5.0" + }, + "doctrine/common": { + "version": "v2.9.0" + }, + "doctrine/dbal": { + "version": "v2.8.0" + }, + "doctrine/doctrine-bundle": { + "version": "1.6", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.6", + "ref": "453e89b78ded666f351617baca5ae40d20622351" + } + }, + "doctrine/doctrine-cache-bundle": { + "version": "1.3.5" + }, + "doctrine/doctrine-migrations-bundle": { + "version": "1.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.2", + "ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" + } + }, + "doctrine/event-manager": { + "version": "v1.0.0" + }, + "doctrine/inflector": { + "version": "v1.3.0" + }, + "doctrine/instantiator": { + "version": "1.1.0" + }, + "doctrine/lexer": { + "version": "v1.0.1" + }, + "doctrine/migrations": { + "version": "v1.8.1" + }, + "doctrine/orm": { + "version": "v2.6.2" + }, + "doctrine/persistence": { + "version": "v1.0.1" + }, + "doctrine/reflection": { + "version": "v1.0.0" + }, + "jdorn/sql-formatter": { + "version": "v1.2.17" + }, + "msgphp/domain": { + "version": "0.8-dev" + }, + "msgphp/user": { + "version": "0.8-dev" + }, + "msgphp/user-bundle": { + "version": "0.6", + "recipe": { + "repo": "github.com/symfony/recipes-contrib", + "branch": "master", + "version": "0.6", + "ref": "6629107e956e6eb4a7d45367717ff4e7c0dd5a9f" + } + }, + "ocramius/package-versions": { + "version": "1.3.0" + }, + "ocramius/proxy-manager": { + "version": "2.2.2" + }, + "psr/cache": { + "version": "1.0.1" + }, + "psr/container": { + "version": "1.0.0" + }, + "psr/log": { + "version": "1.0.2" + }, + "psr/simple-cache": { + "version": "1.0.1" + }, + "symfony/cache": { + "version": "v4.2.0-beta2" + }, + "symfony/config": { + "version": "v4.2.0-beta2" + }, + "symfony/console": { + "version": "3.3", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "3.3", + "ref": "181d766db0eb468f41337f9b2d9d5b61ba1ee441" + } + }, + "symfony/contracts": { + "version": "v1.0.0-beta1" + }, + "symfony/debug": { + "version": "v4.1.7" + }, + "symfony/dependency-injection": { + "version": "v4.2.0-beta2" + }, + "symfony/doctrine-bridge": { + "version": "v4.1.7" + }, + "symfony/dotenv": { + "version": "4.2-dev" + }, + "symfony/event-dispatcher": { + "version": "v4.1.7" + }, + "symfony/filesystem": { + "version": "v4.1.7" + }, + "symfony/finder": { + "version": "v4.1.7" + }, + "symfony/flex": { + "version": "1.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "1.0", + "ref": "5f8a51c0fad684396f6b6c0fd770e043439cb632" + } + }, + "symfony/framework-bundle": { + "version": "4.2", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.2", + "ref": "784b189ed874237b202d3be7f2598d536ffb9b5f" + } + }, + "symfony/http-foundation": { + "version": "v4.1.7" + }, + "symfony/http-kernel": { + "version": "v4.2.0-beta2" + }, + "symfony/orm-pack": { + "version": "v1.0.5" + }, + "symfony/polyfill-mbstring": { + "version": "v1.10.0" + }, + "symfony/routing": { + "version": "4.0", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "master", + "version": "4.0", + "ref": "5f514d9d3b8a8aac3d62ae6a86b18b90ed0c7826" + } + }, + "symfony/var-exporter": { + "version": "v4.2.0-beta2" + }, + "symfony/yaml": { + "version": "4.2-dev" + }, + "zendframework/zend-code": { + "version": "3.3.1" + }, + "zendframework/zend-eventmanager": { + "version": "3.2.1" + } +}