@ -0,0 +1,33 @@ | |||
# In all environments, the following files are loaded if they exist, | |||
# the latter taking precedence over the former: | |||
# | |||
# * .env contains default values for the environment variables needed by the app | |||
# * .env.local uncommitted file with local overrides | |||
# * .env.$APP_ENV committed environment-specific defaults | |||
# * .env.$APP_ENV.local uncommitted environment-specific overrides | |||
# | |||
# Real environment variables win over .env files. | |||
# | |||
# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. | |||
# | |||
# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). | |||
# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration | |||
###> symfony/framework-bundle ### | |||
APP_ENV=dev | |||
APP_SECRET=2276279ba1983a82fa74501a9d0f3bce | |||
#TRUSTED_PROXIES=127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 | |||
#TRUSTED_HOSTS='^(localhost|example\.com)$' | |||
###< symfony/framework-bundle ### | |||
###> symfony/mailer ### | |||
# MAILER_DSN=smtp://localhost | |||
###< symfony/mailer ### | |||
###> doctrine/doctrine-bundle ### | |||
# Format described at https://www.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" | |||
# For a PostgreSQL database, use: "postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=11&charset=utf8" | |||
# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml | |||
DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.7 | |||
###< doctrine/doctrine-bundle ### |
@ -0,0 +1,5 @@ | |||
# define your env variables for the test env here | |||
KERNEL_CLASS='App\Kernel' | |||
APP_SECRET='$ecretf0rt3st' | |||
SYMFONY_DEPRECATIONS_HELPER=999999 | |||
PANTHER_APP_ENV=panther |
@ -0,0 +1,16 @@ | |||
###> symfony/framework-bundle ### | |||
/.env.local | |||
/.env.local.php | |||
/.env.*.local | |||
/config/secrets/prod/prod.decrypt.private.php | |||
/public/bundles/ | |||
/var/ | |||
/vendor/ | |||
###< symfony/framework-bundle ### | |||
###> symfony/phpunit-bridge ### | |||
.phpunit | |||
.phpunit.result.cache | |||
/phpunit.xml | |||
###< symfony/phpunit-bridge ### |
@ -0,0 +1,100 @@ | |||
all: | |||
@echo "" | |||
@echo "Available targets:" | |||
@echo "" | |||
@echo "* install Install project" | |||
@echo " * build Build the app, used in Dockerfile" | |||
@echo " * composer Install Composer vendors" | |||
@echo " * setup Set up the app, used in docker entrypoint" | |||
@echo " * cc Clear and warmup Symfony cache" | |||
@echo "" | |||
@echo "* code-qa Code quality checks (uses in CI)" | |||
@echo " * lint Check for files validations" | |||
@echo " * cs-check Check code styling" | |||
@echo " * phpstan-ci Static code analysis" | |||
@echo " * psalm Static code analysis" | |||
@echo " * phpmd PHP Mess Detector (and generates report in ./reports directory)" | |||
@echo " * security-check Third-party composer libraries security check" | |||
@echo " * phpmetrics Metrics about PHP project and classes (and generates report in ./reports directory)" | |||
@echo "" | |||
@echo "* tests Run tests" | |||
@echo " * phpunit Run PHPUnit tests (and generates report in ./reports directory)" | |||
@echo "" | |||
@echo "* cs-fix Self-correcting code styling" | |||
@echo "* cs Dry-run code styling check" | |||
@echo "* phpstan Static code analysis with progress bar" | |||
.PHONY: install | |||
install: build setup | |||
.PHONY: build | |||
build: composer | |||
.PHONY: setup | |||
setup: cc | |||
.PHONY: composer | |||
composer: | |||
ifeq ($(APP_ENV), prod) | |||
php composer.phar install --no-dev --optimize-autoloader --no-interaction | |||
else | |||
php composer.phar install --optimize-autoloader --no-interaction | |||
endif | |||
.PHONY: cc | |||
cc: | |||
php bin/console cache:clear --no-warmup | |||
php bin/console cache:warmup | |||
.PHONY: code-qa | |||
code-qa: lint cs-check phpstan-ci psalm security-check phpmetrics | |||
#code-qa: lint cs-check phpstan-ci psalm phpmd security-check phpmetrics | |||
.PHONY: lint | |||
lint: | |||
bin/console lint:container | |||
bin/console lint:twig templates | |||
bin/console lint:yaml config | |||
.PHONY: cs | |||
cs: | |||
./vendor/bin/php-cs-fixer fix --dry-run --stop-on-violation --diff --show-progress=estimating | |||
.PHONY: cs-fix | |||
cs-fix: | |||
./vendor/bin/php-cs-fixer fix --verbose | |||
.PHONY: cs-check | |||
cs-check: | |||
./vendor/bin/php-cs-fixer fix --dry-run --using-cache=no | |||
.PHONY: phpstan | |||
phpstan: | |||
php vendor/bin/phpstan analyse | |||
.PHONY: phpstan-check | |||
phpstan-ci: | |||
php -d memory_limit=1G vendor/bin/phpstan analyse --no-progress | |||
.PHONY: psalm | |||
psalm: | |||
php vendor/bin/psalm | |||
.PHONY: security-check | |||
security-check: | |||
./vendor/bin/security-checker security:check composer.lock | |||
.PHONY: tests | |||
tests: phpunit | |||
.PHONY: phpunit | |||
phpunit: | |||
./vendor/bin/phpunit --coverage-html reports/phpunit-$$(date '+%Y%m%d_%H%M%S') | |||
.PHONY: phpmetrics | |||
phpmetrics: | |||
./vendor/bin/phpmetrics --report-html=reports/phpmetrics-$$(date '+%Y%m%d_%H%M%S').html src | |||
.PHONY: phpmd | |||
phpmd: | |||
./vendor/bin/phpmd src html phpmd.xml --reportfile reports/phpmd-$$(date '+%Y%m%d_%H%M%S').html |
@ -0,0 +1,43 @@ | |||
#!/usr/bin/env php | |||
<?php | |||
use App\Kernel; | |||
use Symfony\Bundle\FrameworkBundle\Console\Application; | |||
use Symfony\Component\Console\Input\ArgvInput; | |||
use Symfony\Component\Dotenv\Dotenv; | |||
use Symfony\Component\ErrorHandler\Debug; | |||
if (!in_array(PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) { | |||
echo 'Warning: The console should be invoked via the CLI version of PHP, not the '.PHP_SAPI.' SAPI'.PHP_EOL; | |||
} | |||
set_time_limit(0); | |||
require dirname(__DIR__).'/vendor/autoload.php'; | |||
if (!class_exists(Application::class) || !class_exists(Dotenv::class)) { | |||
throw new LogicException('You need to add "symfony/framework-bundle" and "symfony/dotenv" as Composer dependencies.'); | |||
} | |||
$input = new ArgvInput(); | |||
if (null !== $env = $input->getParameterOption(['--env', '-e'], null, true)) { | |||
putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); | |||
} | |||
if ($input->hasParameterOption('--no-debug', true)) { | |||
putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); | |||
} | |||
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); | |||
if ($_SERVER['APP_DEBUG']) { | |||
umask(0000); | |||
if (class_exists(Debug::class)) { | |||
Debug::enable(); | |||
} | |||
} | |||
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); | |||
$application = new Application($kernel); | |||
$application->run($input); |
@ -0,0 +1,13 @@ | |||
#!/usr/bin/env php | |||
<?php | |||
if (!file_exists(dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php')) { | |||
echo "Unable to find the `simple-phpunit.php` script in `vendor/symfony/phpunit-bridge/bin/`.\n"; | |||
exit(1); | |||
} | |||
if (false === getenv('SYMFONY_PHPUNIT_DIR')) { | |||
putenv('SYMFONY_PHPUNIT_DIR='.__DIR__.'/.phpunit'); | |||
} | |||
require dirname(__DIR__).'/vendor/symfony/phpunit-bridge/bin/simple-phpunit.php'; |
@ -0,0 +1,100 @@ | |||
{ | |||
"type": "project", | |||
"license": "proprietary", | |||
"require": { | |||
"php": ">=7.2.5", | |||
"ext-ctype": "*", | |||
"ext-iconv": "*", | |||
"composer/package-versions-deprecated": "^1.11", | |||
"doctrine/annotations": "^1.0", | |||
"doctrine/doctrine-bundle": "^2.1", | |||
"doctrine/doctrine-migrations-bundle": "^3.0", | |||
"doctrine/orm": "^2.7", | |||
"phpdocumentor/reflection-docblock": "^5.2", | |||
"sensio/framework-extra-bundle": "^5.1", | |||
"symfony/asset": "5.1.*", | |||
"symfony/console": "5.1.*", | |||
"symfony/dotenv": "5.1.*", | |||
"symfony/expression-language": "5.1.*", | |||
"symfony/flex": "^1.3.1", | |||
"symfony/form": "5.1.*", | |||
"symfony/framework-bundle": "5.1.*", | |||
"symfony/http-client": "5.1.*", | |||
"symfony/intl": "5.1.*", | |||
"symfony/mailer": "5.1.*", | |||
"symfony/mime": "5.1.*", | |||
"symfony/monolog-bundle": "^3.1", | |||
"symfony/notifier": "5.1.*", | |||
"symfony/process": "5.1.*", | |||
"symfony/property-access": "5.1.*", | |||
"symfony/property-info": "5.1.*", | |||
"symfony/security-bundle": "5.1.*", | |||
"symfony/security-csrf": "5.1.*", | |||
"symfony/serializer": "5.1.*", | |||
"symfony/string": "5.1.*", | |||
"symfony/translation": "5.1.*", | |||
"symfony/twig-bundle": "5.1.*", | |||
"symfony/validator": "5.1.*", | |||
"symfony/web-link": "5.1.*", | |||
"symfony/yaml": "5.1.*", | |||
"twig/extra-bundle": "^2.12|^3.0", | |||
"twig/twig": "^2.12|^3.0" | |||
}, | |||
"require-dev": { | |||
"symfony/browser-kit": "^5.1", | |||
"symfony/css-selector": "^5.1", | |||
"symfony/debug-bundle": "^5.1", | |||
"symfony/maker-bundle": "^1.23", | |||
"symfony/phpunit-bridge": "^5.1", | |||
"symfony/stopwatch": "^5.1", | |||
"symfony/var-dumper": "^5.1", | |||
"symfony/web-profiler-bundle": "^5.1" | |||
}, | |||
"config": { | |||
"optimize-autoloader": true, | |||
"preferred-install": { | |||
"*": "dist" | |||
}, | |||
"sort-packages": true | |||
}, | |||
"autoload": { | |||
"psr-4": { | |||
"App\\": "src/" | |||
} | |||
}, | |||
"autoload-dev": { | |||
"psr-4": { | |||
"App\\Tests\\": "tests/" | |||
} | |||
}, | |||
"replace": { | |||
"paragonie/random_compat": "2.*", | |||
"symfony/polyfill-ctype": "*", | |||
"symfony/polyfill-iconv": "*", | |||
"symfony/polyfill-php72": "*", | |||
"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": { | |||
"allow-contrib": false, | |||
"require": "5.1.*" | |||
} | |||
} | |||
} |
@ -0,0 +1,15 @@ | |||
<?php | |||
return [ | |||
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true], | |||
Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true], | |||
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], | |||
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], | |||
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], | |||
Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true], | |||
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], | |||
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], | |||
Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], | |||
Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], | |||
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], | |||
]; |
@ -0,0 +1,19 @@ | |||
framework: | |||
cache: | |||
# Unique name of your app: used to compute stable namespaces for cache keys. | |||
#prefix_seed: your_vendor_name/app_name | |||
# The "app" cache stores to the filesystem by default. | |||
# The data in this cache should persist between deploys. | |||
# 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 | |||
# Namespaced pools use the above "app" backend by default | |||
#pools: | |||
#my.dedicated.cache: null |
@ -0,0 +1,4 @@ | |||
debug: | |||
# Forwards VarDumper Data clones to a centralized server allowing to inspect dumps on CLI or in your browser. | |||
# See the "server:dump" command to start a new server. | |||
dump_destination: "tcp://%env(VAR_DUMPER_SERVER)%" |
@ -0,0 +1,19 @@ | |||
monolog: | |||
handlers: | |||
main: | |||
type: stream | |||
path: "%kernel.logs_dir%/%kernel.environment%.log" | |||
level: debug | |||
channels: ["!event"] | |||
# uncomment to get logging in your browser | |||
# you may have to allow bigger header sizes in your Web server configuration | |||
#firephp: | |||
# type: firephp | |||
# level: info | |||
#chromephp: | |||
# type: chromephp | |||
# level: info | |||
console: | |||
type: console | |||
process_psr_3_messages: false | |||
channels: ["!event", "!doctrine", "!console"] |
@ -0,0 +1,6 @@ | |||
web_profiler: | |||
toolbar: true | |||
intercept_redirects: false | |||
framework: | |||
profiler: { only_exceptions: false } |
@ -0,0 +1,20 @@ | |||
doctrine: | |||
dbal: | |||
driver: 'pdo_mysql' | |||
server_version: '5.7' | |||
url: '%env(resolve:DATABASE_URL)%' | |||
# IMPORTANT: You MUST configure your server version, | |||
# either here or in the DATABASE_URL env var (see .env file) | |||
#server_version: '5.7' | |||
orm: | |||
auto_generate_proxy_classes: true | |||
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware | |||
auto_mapping: true | |||
mappings: | |||
App: | |||
is_bundle: false | |||
type: annotation | |||
dir: '%kernel.project_dir%/src/Entity' | |||
prefix: 'App\Entity' | |||
alias: App |
@ -0,0 +1,5 @@ | |||
doctrine_migrations: | |||
migrations_paths: | |||
# namespace is arbitrary but should be different from App\Migrations | |||
# as migrations classes should NOT be autoloaded | |||
'DoctrineMigrations': '%kernel.project_dir%/migrations' |
@ -0,0 +1,17 @@ | |||
# see https://symfony.com/doc/current/reference/configuration/framework.html | |||
framework: | |||
secret: '%env(APP_SECRET)%' | |||
#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: null | |||
cookie_secure: auto | |||
cookie_samesite: lax | |||
#esi: true | |||
#fragments: true | |||
php_errors: | |||
log: true |
@ -0,0 +1,3 @@ | |||
framework: | |||
mailer: | |||
dsn: '%env(MAILER_DSN)%' |
@ -0,0 +1,16 @@ | |||
framework: | |||
notifier: | |||
#chatter_transports: | |||
# slack: '%env(SLACK_DSN)%' | |||
# telegram: '%env(TELEGRAM_DSN)%' | |||
#texter_transports: | |||
# twilio: '%env(TWILIO_DSN)%' | |||
# nexmo: '%env(NEXMO_DSN)%' | |||
channel_policy: | |||
# use chat/slack, chat/telegram, sms/twilio or sms/nexmo | |||
urgent: ['email'] | |||
high: ['email'] | |||
medium: ['email'] | |||
low: ['email'] | |||
admin_recipients: | |||
- { email: admin@example.com } |
@ -0,0 +1,8 @@ | |||
# As of Symfony 5.1, deprecations are logged in the dedicated "deprecation" channel when it exists | |||
#monolog: | |||
# channels: [deprecation] | |||
# handlers: | |||
# deprecation: | |||
# type: stream | |||
# channels: [deprecation] | |||
# path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log" |
@ -0,0 +1,20 @@ | |||
doctrine: | |||
orm: | |||
auto_generate_proxy_classes: false | |||
metadata_cache_driver: | |||
type: pool | |||
pool: doctrine.system_cache_pool | |||
query_cache_driver: | |||
type: pool | |||
pool: doctrine.system_cache_pool | |||
result_cache_driver: | |||
type: pool | |||
pool: doctrine.result_cache_pool | |||
framework: | |||
cache: | |||
pools: | |||
doctrine.result_cache_pool: | |||
adapter: cache.app | |||
doctrine.system_cache_pool: | |||
adapter: cache.system |
@ -0,0 +1,16 @@ | |||
monolog: | |||
handlers: | |||
main: | |||
type: fingers_crossed | |||
action_level: error | |||
handler: nested | |||
excluded_http_codes: [404, 405] | |||
buffer_size: 50 # How many messages should be saved? Prevent memory leaks | |||
nested: | |||
type: stream | |||
path: "%kernel.logs_dir%/%kernel.environment%.log" | |||
level: debug | |||
console: | |||
type: console | |||
process_psr_3_messages: false | |||
channels: ["!event", "!doctrine"] |
@ -0,0 +1,3 @@ | |||
framework: | |||
router: | |||
strict_requirements: null |
@ -0,0 +1,7 @@ | |||
framework: | |||
router: | |||
utf8: true | |||
# Configure how to generate URLs in non-HTTP contexts, such as CLI commands. | |||
# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands | |||
#default_uri: http://localhost |
@ -0,0 +1,24 @@ | |||
security: | |||
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers | |||
providers: | |||
users_in_memory: { memory: null } | |||
firewalls: | |||
dev: | |||
pattern: ^/(_(profiler|wdt)|css|images|js)/ | |||
security: false | |||
main: | |||
anonymous: true | |||
lazy: true | |||
provider: users_in_memory | |||
# activate different ways to authenticate | |||
# https://symfony.com/doc/current/security.html#firewalls-authentication | |||
# https://symfony.com/doc/current/security/impersonating_user.html | |||
# switch_user: true | |||
# Easy way to control access for large sections of your site | |||
# Note: Only the *first* access control that matches will be used | |||
access_control: | |||
# - { path: ^/admin, roles: ROLE_ADMIN } | |||
# - { path: ^/profile, roles: ROLE_USER } |
@ -0,0 +1,3 @@ | |||
sensio_framework_extra: | |||
router: | |||
annotations: false |
@ -0,0 +1,4 @@ | |||
framework: | |||
test: true | |||
session: | |||
storage_id: session.storage.mock_file |
@ -0,0 +1,12 @@ | |||
monolog: | |||
handlers: | |||
main: | |||
type: fingers_crossed | |||
action_level: error | |||
handler: nested | |||
excluded_http_codes: [404, 405] | |||
channels: ["!event"] | |||
nested: | |||
type: stream | |||
path: "%kernel.logs_dir%/%kernel.environment%.log" | |||
level: debug |
@ -0,0 +1,2 @@ | |||
twig: | |||
strict_variables: true |
@ -0,0 +1,3 @@ | |||
framework: | |||
validation: | |||
not_compromised_password: false |
@ -0,0 +1,6 @@ | |||
web_profiler: | |||
toolbar: false | |||
intercept_redirects: false | |||
framework: | |||
profiler: { collect: false } |
@ -0,0 +1,6 @@ | |||
framework: | |||
default_locale: en | |||
translator: | |||
default_path: '%kernel.project_dir%/translations' | |||
fallbacks: | |||
- en |
@ -0,0 +1,2 @@ | |||
twig: | |||
default_path: '%kernel.project_dir%/templates' |
@ -0,0 +1,8 @@ | |||
framework: | |||
validation: | |||
email_validation_mode: html5 | |||
# Enables validator auto-mapping support. | |||
# For instance, basic validation constraints will be inferred from Doctrine's metadata. | |||
#auto_mapping: | |||
# App\Entity\: [] |
@ -0,0 +1,5 @@ | |||
<?php | |||
if (file_exists(dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php')) { | |||
require dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php'; | |||
} |
@ -0,0 +1,3 @@ | |||
#index: | |||
# path: / | |||
# controller: App\Controller\DefaultController::index |
@ -0,0 +1,7 @@ | |||
controllers: | |||
resource: ../../src/Controller/ | |||
type: annotation | |||
kernel: | |||
resource: ../../src/Kernel.php | |||
type: annotation |
@ -0,0 +1,3 @@ | |||
_errors: | |||
resource: '@FrameworkBundle/Resources/config/routing/errors.xml' | |||
prefix: /_error |
@ -0,0 +1,7 @@ | |||
web_profiler_wdt: | |||
resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml' | |||
prefix: /_wdt | |||
web_profiler_profiler: | |||
resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml' | |||
prefix: /_profiler |
@ -0,0 +1,31 @@ | |||
# This file is the entry point to configure your own services. | |||
# Files in the packages/ subdirectory configure your dependencies. | |||
# Put parameters here that don't need to change on each machine where the app is deployed | |||
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration | |||
parameters: | |||
services: | |||
# default configuration for services in *this* file | |||
_defaults: | |||
autowire: true # Automatically injects dependencies in your services. | |||
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. | |||
# makes classes in src/ available to be used as services | |||
# this creates a service per class whose id is the fully-qualified class name | |||
App\: | |||
resource: '../src/' | |||
exclude: | |||
- '../src/DependencyInjection/' | |||
- '../src/Entity/' | |||
- '../src/Kernel.php' | |||
- '../src/Tests/' | |||
# controllers are imported separately to make sure services can be injected | |||
# as action arguments even if you don't extend any base controller class | |||
App\Controller\: | |||
resource: '../src/Controller/' | |||
tags: ['controller.service_arguments'] | |||
# add more service definitions when explicit configuration is needed | |||
# please note that last definitions always *replace* previous ones |
@ -0,0 +1,56 @@ | |||
################################################# | |||
# Step 1 : Build prod app container | |||
################################################# | |||
FROM registry.gitlab.com/profideo/php-fpm-nginx:php-7.4-fpm-nginx as prod | |||
ARG GITLAB_OAUTH_TOKEN | |||
ARG GITHUB_OAUTH_TOKEN | |||
# default config for PHP session handling | |||
ENV PHP_SESSION_SAVE_HANDLER=files PHP_SESSION_SAVE_PATH=/tmp/ | |||
RUN apt-get update && apt-get install -y \ | |||
openssl \ | |||
git \ | |||
acl \ | |||
unzip \ | |||
libzip-dev \ | |||
libicu-dev \ | |||
# keep certificates | |||
&& apt-get install -y --no-install-recommends --no-install-suggests apt-transport-https ca-certificates \ | |||
# clean apt cache | |||
&& rm -rf /var/lib/apt/lists/* | |||
RUN chown www-data /var/www | |||
WORKDIR /var/www | |||
COPY . symfony | |||
WORKDIR /var/www/symfony | |||
RUN make build | |||
COPY devops/docker/nginx.conf /etc/nginx/conf.d/default.conf | |||
COPY devops/docker/entrypoint.sh /usr/local/bin/entrypoint.sh | |||
################################################# | |||
# Step 2 : Build test image based on prod | |||
################################################# | |||
FROM prod as test | |||
RUN pecl install xdebug \ | |||
&& docker-php-ext-enable xdebug \ | |||
&& echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ | |||
&& echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ | |||
&& echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini | |||
RUN make build | |||
################################################# | |||
# Step 2 : Build dev image based on test | |||
################################################# | |||
FROM test as dev | |||
RUN make build | |||
COPY devops/docker/entrypoint-dev.sh /usr/local/bin/entrypoint.sh |
@ -0,0 +1,10 @@ | |||
#!/bin/bash | |||
trap 'kill $(jobs -p)' EXIT | |||
set -ex | |||
# deploy at runtime : some features are client slug related (which is set as env var at docker run) | |||
make install | |||
nginx | |||
/usr/local/bin/docker-php-entrypoint php-fpm |
@ -0,0 +1,10 @@ | |||
#!/bin/bash | |||
trap 'kill $(jobs -p)' EXIT | |||
set -ex | |||
# deploy at runtime : some features are client slug related (which is set as env var at docker run) | |||
make setup | |||
nginx | |||
/usr/local/bin/docker-php-entrypoint php-fpm |
@ -0,0 +1,82 @@ | |||
server { | |||
listen 80; | |||
server_name localhost; | |||
#charset koi8-r; | |||
#access_log /var/log/nginx/host.access.log main; | |||
#location / { | |||
# root /usr/share/nginx/html; | |||
# index index.html index.htm; | |||
#} | |||
#error_page 404 /404.html; | |||
# redirect server error pages to the static page /50x.html | |||
# | |||
error_page 500 502 503 504 /50x.html; | |||
#location = /50x.html { | |||
# root /usr/share/nginx/html; | |||
#} | |||
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 | |||
# | |||
#location ~ \.php$ { | |||
# proxy_pass http://127.0.0.1; | |||
#} | |||
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 | |||
# | |||
#location ~ \.php$ { | |||
# root html; | |||
# fastcgi_pass 127.0.0.1:9000; | |||
# fastcgi_index index.php; | |||
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; | |||
# include fastcgi_params; | |||
#} | |||
# deny access to .htaccess files, if Apache's document root | |||
# concurs with nginx's one | |||
# | |||
#location ~ /\.ht { | |||
# deny all; | |||
#} | |||
#server_name domain.tld www.domain.tld; | |||
root /var/www/symfony/public; | |||
location / { | |||
# try to serve file directly, fallback to index.php | |||
try_files $uri /index.php$is_args$args; | |||
} | |||
# PROD | |||
location ~ ^/index\.php(/|$) { | |||
#fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; | |||
fastcgi_pass 127.0.0.1:9000; | |||
fastcgi_split_path_info ^(.+\.php)(/.*)$; | |||
include fastcgi_params; | |||
# When you are using symlinks to link the document root to the | |||
# current version of your application, you should pass the real | |||
# application path instead of the path to the symlink to PHP | |||
# FPM. | |||
# Otherwise, PHP's OPcache may not properly detect changes to | |||
# your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126 | |||
# for more information). | |||
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; | |||
fastcgi_param DOCUMENT_ROOT $realpath_root; | |||
# Prevents URIs that include the front controller. This will 404: | |||
# http://domain.tld/app.php/some-path | |||
# Remove the internal directive to allow URIs like this | |||
internal; | |||
} | |||
# return 404 for all other php files not matching the front controller | |||
# this prevents access to other php files you don't want to be accessible. | |||
location ~ \.php$ { | |||
return 404; | |||
} | |||
error_log /var/log/nginx/project_error.log; | |||
access_log /var/log/nginx/project_access.log; | |||
} |
@ -0,0 +1,15 @@ | |||
version: '3.7' | |||
services: | |||
app: | |||
build: | |||
context: . | |||
dockerfile: ./devops/docker/Dockerfile | |||
target: dev | |||
environment: | |||
- APP_SECRET=2276279ba1983a82fa74501a9d0f3bce | |||
- APP_ENV=dev | |||
- COMPOSER_MEMORY_LIMIT=5G | |||
# values are read from the .env file => https://vsupalov.com/docker-arg-env-variable-guide/ | |||
volumes: | |||
- ./:/var/www/symfony:delegated |
@ -0,0 +1,40 @@ | |||
<?php | |||
declare(strict_types=1); | |||
namespace DoctrineMigrations; | |||
use Doctrine\DBAL\Schema\Schema; | |||
use Doctrine\DBAL\Types\Type; | |||
use Doctrine\Migrations\AbstractMigration; | |||
/** | |||
* Auto-generated Migration: Please modify to your needs! | |||
*/ | |||
final class Version20201105160138 extends AbstractMigration | |||
{ | |||
public function getDescription() : string | |||
{ | |||
return ''; | |||
} | |||
public function up(Schema $schema) : void | |||
{ | |||
if (!$schema->hasTable('artisan')) { | |||
$usageTable = $schema->createTable('artisan'); | |||
$usageTable->addColumn('id', Type::INTEGER, ['autoincrement' => true]); | |||
$usageTable->addColumn('name', Type::STRING); | |||
$usageTable->addColumn('description', Type::TEXT, ['notnull' => false]); | |||
$usageTable->addColumn('link', Type::TEXT, ['notnull' => false]); | |||
$usageTable->setPrimaryKey(['id']); | |||
} | |||
} | |||
public function down(Schema $schema) : void | |||
{ | |||
if ($schema->hasTable('artisan')) { | |||
$schema->dropTable('artisan'); | |||
} | |||
} | |||
} |
@ -0,0 +1,33 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html --> | |||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:noNamespaceSchemaLocation="bin/.phpunit/phpunit.xsd" | |||
backupGlobals="false" | |||
colors="true" | |||
bootstrap="tests/bootstrap.php" | |||
> | |||
<php> | |||
<ini name="error_reporting" value="-1" /> | |||
<server name="APP_ENV" value="test" force="true" /> | |||
<server name="SHELL_VERBOSITY" value="-1" /> | |||
<server name="SYMFONY_PHPUNIT_REMOVE" value="" /> | |||
<server name="SYMFONY_PHPUNIT_VERSION" value="7.5" /> | |||
</php> | |||
<testsuites> | |||
<testsuite name="Project Test Suite"> | |||
<directory>tests</directory> | |||
</testsuite> | |||
</testsuites> | |||
<filter> | |||
<whitelist processUncoveredFilesFromWhitelist="true"> | |||
<directory suffix=".php">src</directory> | |||
</whitelist> | |||
</filter> | |||
<listeners> | |||
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" /> | |||
</listeners> | |||
</phpunit> |
@ -0,0 +1,30 @@ | |||
<?php | |||
use App\Kernel; | |||
use Symfony\Component\Dotenv\Dotenv; | |||
use Symfony\Component\ErrorHandler\Debug; | |||
use Symfony\Component\HttpFoundation\Request; | |||
require dirname(__DIR__).'/vendor/autoload.php'; | |||
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env'); | |||
if ($_SERVER['APP_DEBUG']) { | |||
umask(0000); | |||
Debug::enable(); | |||
} | |||
if ($trustedProxies = $_SERVER['TRUSTED_PROXIES'] ?? false) { | |||
Request::setTrustedProxies(explode(',', $trustedProxies), Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO); | |||
} | |||
if ($trustedHosts = $_SERVER['TRUSTED_HOSTS'] ?? false) { | |||
Request::setTrustedHosts([$trustedHosts]); | |||
} | |||
$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); | |||
$request = Request::createFromGlobals(); | |||
$response = $kernel->handle($request); | |||
$response->send(); | |||
$kernel->terminate($request, $response); |
@ -0,0 +1,96 @@ | |||
<?php | |||
namespace App\Controller; | |||
use App\Entity\Artisan; | |||
use App\Form\ArtisanType; | |||
use App\Repository\ArtisanRepository; | |||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; | |||
use Symfony\Component\HttpFoundation\Request; | |||
use Symfony\Component\HttpFoundation\Response; | |||
use Symfony\Component\Routing\Annotation\Route; | |||
/** | |||
* @Route("/artisan") | |||
*/ | |||
class ArtisanController extends AbstractController | |||
{ | |||
/** | |||
* @Route("/", name="artisan_index", methods={"GET"}) | |||
* @param ArtisanRepository $artisanRepository | |||
* @return Response | |||
*/ | |||
public function index(ArtisanRepository $artisanRepository): Response | |||
{ | |||
return $this->render('artisan/index.html.twig', [ | |||
'artisans' => $artisanRepository->findAll(), | |||
]); | |||
} | |||
/** | |||
* @Route("/new", name="artisan_new", methods={"GET","POST"}) | |||
*/ | |||
public function new(Request $request): Response | |||
{ | |||
$artisan = new Artisan(); | |||
$form = $this->createForm(ArtisanType::class, $artisan); | |||
$form->handleRequest($request); | |||
if ($form->isSubmitted() && $form->isValid()) { | |||
$entityManager = $this->getDoctrine()->getManager(); | |||
$entityManager->persist($artisan); | |||
$entityManager->flush(); | |||
return $this->redirectToRoute('artisan_index'); | |||
} | |||
return $this->render('artisan/new.html.twig', [ | |||
'artisan' => $artisan, | |||
'form' => $form->createView(), | |||
]); | |||
} | |||
/** | |||
* @Route("/{id}", name="artisan_show", methods={"GET"}) | |||
*/ | |||
public function show(Artisan $artisan): Response | |||
{ | |||
return $this->render('artisan/show.html.twig', [ | |||
'artisan' => $artisan, | |||
]); | |||
} | |||
/** | |||
* @Route("/{id}/edit", name="artisan_edit", methods={"GET","POST"}) | |||
*/ | |||
public function edit(Request $request, Artisan $artisan): Response | |||
{ | |||
$form = $this->createForm(ArtisanType::class, $artisan); | |||
$form->handleRequest($request); | |||
if ($form->isSubmitted() && $form->isValid()) { | |||
$this->getDoctrine()->getManager()->flush(); | |||
return $this->redirectToRoute('artisan_index'); | |||
} | |||
return $this->render('artisan/edit.html.twig', [ | |||
'artisan' => $artisan, | |||
'form' => $form->createView(), | |||
]); | |||
} | |||
/** | |||
* @Route("/{id}", name="artisan_delete", methods={"DELETE"}) | |||
*/ | |||
public function delete(Request $request, Artisan $artisan): Response | |||
{ | |||
if ($this->isCsrfTokenValid('delete'.$artisan->getId(), $request->request->get('_token'))) { | |||
$entityManager = $this->getDoctrine()->getManager(); | |||
$entityManager->remove($artisan); | |||
$entityManager->flush(); | |||
} | |||
return $this->redirectToRoute('artisan_index'); | |||
} | |||
} |
@ -0,0 +1,119 @@ | |||
<?php | |||
namespace App\Entity; | |||
use Doctrine\ORM\Mapping as ORM; | |||
/** | |||
* @ORM\Table(name="artisan") | |||
* @ORM\Entity(repositoryClass="App\Repository\ArtisanRepository") | |||
**/ | |||
class Artisan | |||
{ | |||
/** | |||
* @var int | |||
* | |||
* @ORM\Column(name="id", type="integer") | |||
* @ORM\Id | |||
* @ORM\GeneratedValue(strategy="AUTO") | |||
*/ | |||
public $id; | |||
/** | |||
* @var string | |||
* | |||
* @ORM\Column(name="name", type="string") | |||
*/ | |||
public $name; | |||
/** | |||
* @var string | |||
* | |||
* @ORM\Column(name="description", type="string") | |||
*/ | |||
public $description; | |||
/** | |||
* @var string | |||
* | |||
* @ORM\Column(name="link", type="string") | |||
*/ | |||
public $link; | |||
/** | |||
* Artisan constructor. | |||
* @param $id | |||
* @param $name | |||
* @param $description | |||
* @param $link | |||
*/ | |||
public function __construct($id, $name, $description, $link) | |||
{ | |||
$this->id = $id; | |||
$this->name = $name; | |||
$this->description = $description; | |||
$this->link = $link; | |||
} | |||
/** | |||
* @return int | |||
*/ | |||
public function getId(): int | |||
{ | |||
return $this->id; | |||
} | |||
/** | |||
* @param int $id | |||
*/ | |||
public function setId(int $id): void | |||
{ | |||
$this->id = $id; | |||
} | |||
/** | |||
* @return string | |||
*/ | |||
public function getName(): string | |||
{ | |||
return $this->name; | |||
} | |||
/** | |||
* @param string $name | |||
*/ | |||
public function setName(string $name): void | |||
{ | |||
$this->name = $name; | |||
} | |||
/** | |||
* @return string | |||
*/ | |||
public function getDescription(): string | |||
{ | |||
return $this->description; | |||
} | |||
/** | |||
* @param string $description | |||
*/ | |||
public function setDescription(string $description): void | |||
{ | |||
$this->description = $description; | |||
} | |||
/** | |||
* @return string | |||
*/ | |||
public function getLink(): string | |||
{ | |||
return $this->link; | |||
} | |||
/** | |||
* @param string $link | |||
*/ | |||
public function setLink(string $link): void | |||
{ | |||
$this->link = $link; | |||
} | |||
} |
@ -0,0 +1,27 @@ | |||
<?php | |||
namespace App\Form; | |||
use App\Entity\Artisan; | |||
use Symfony\Component\Form\AbstractType; | |||
use Symfony\Component\Form\FormBuilderInterface; | |||
use Symfony\Component\OptionsResolver\OptionsResolver; | |||
class ArtisanType extends AbstractType | |||
{ | |||
public function buildForm(FormBuilderInterface $builder, array $options) | |||
{ | |||
$builder | |||
->add('name') | |||
->add('description') | |||
->add('link') | |||
; | |||
} | |||
public function configureOptions(OptionsResolver $resolver) | |||
{ | |||
$resolver->setDefaults([ | |||
'data_class' => Artisan::class, | |||
]); | |||
} | |||
} |
@ -0,0 +1,38 @@ | |||
<?php | |||
namespace App; | |||
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; | |||
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; | |||
use Symfony\Component\HttpKernel\Kernel as BaseKernel; | |||
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; | |||
class Kernel extends BaseKernel | |||
{ | |||
use MicroKernelTrait; | |||
protected function configureContainer(ContainerConfigurator $container): void | |||
{ | |||
$container->import('../config/{packages}/*.yaml'); | |||
$container->import('../config/{packages}/'.$this->environment.'/*.yaml'); | |||
if (is_file(\dirname(__DIR__).'/config/services.yaml')) { | |||
$container->import('../config/services.yaml'); | |||
$container->import('../config/{services}_'.$this->environment.'.yaml'); | |||
} elseif (is_file($path = \dirname(__DIR__).'/config/services.php')) { | |||
(require $path)($container->withPath($path), $this); | |||
} | |||
} | |||
protected function configureRoutes(RoutingConfigurator $routes): void | |||
{ | |||
$routes->import('../config/{routes}/'.$this->environment.'/*.yaml'); | |||
$routes->import('../config/{routes}/*.yaml'); | |||
if (is_file(\dirname(__DIR__).'/config/routes.yaml')) { | |||
$routes->import('../config/routes.yaml'); | |||
} elseif (is_file($path = \dirname(__DIR__).'/config/routes.php')) { | |||
(require $path)($routes->withPath($path), $this); | |||
} | |||
} | |||
} |
@ -0,0 +1,20 @@ | |||
<?php | |||
namespace App\Repository; | |||
use App\Entity\Artisan; | |||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; | |||
use Doctrine\ORM\EntityManagerInterface; | |||
use Doctrine\ORM\EntityRepository; | |||
use Doctrine\ORM\Mapping; | |||
use Doctrine\Persistence\ManagerRegistry; | |||
class ArtisanRepository extends ServiceEntityRepository | |||
{ | |||
public function __construct(ManagerRegistry $registry) | |||
{ | |||
parent::__construct($registry, Artisan::class); | |||
} | |||
} |
@ -0,0 +1,511 @@ | |||
{ | |||
"composer/package-versions-deprecated": { | |||
"version": "1.11.99" | |||
}, | |||
"doctrine/annotations": { | |||
"version": "1.0", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "1.0", | |||
"ref": "a2759dd6123694c8d901d0ec80006e044c2e6457" | |||
}, | |||
"files": [ | |||
"config/routes/annotations.yaml" | |||
] | |||
}, | |||
"doctrine/cache": { | |||
"version": "1.10.2" | |||
}, | |||
"doctrine/collections": { | |||
"version": "1.6.7" | |||
}, | |||
"doctrine/common": { | |||
"version": "3.0.2" | |||
}, | |||
"doctrine/dbal": { | |||
"version": "2.10.4" | |||
}, | |||
"doctrine/doctrine-bundle": { | |||
"version": "2.0", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "2.0", | |||
"ref": "a9f2463b9f73efe74482f831f03a204a41328555" | |||
}, | |||
"files": [ | |||
"config/packages/doctrine.yaml", | |||
"config/packages/prod/doctrine.yaml", | |||
"src/Entity/.gitignore", | |||
"src/Repository/.gitignore" | |||
] | |||
}, | |||
"doctrine/doctrine-migrations-bundle": { | |||
"version": "2.2", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "2.2", | |||
"ref": "baaa439e3e3179e69e3da84b671f0a3e4a2f56ad" | |||
}, | |||
"files": [ | |||
"config/packages/doctrine_migrations.yaml", | |||
"migrations/.gitignore" | |||
] | |||
}, | |||
"doctrine/event-manager": { | |||
"version": "1.1.1" | |||
}, | |||
"doctrine/inflector": { | |||
"version": "1.4.3" | |||
}, | |||
"doctrine/instantiator": { | |||
"version": "1.3.1" | |||
}, | |||
"doctrine/lexer": { | |||
"version": "1.2.1" | |||
}, | |||
"doctrine/migrations": { | |||
"version": "3.0.1" | |||
}, | |||
"doctrine/orm": { | |||
"version": "2.7.4" | |||
}, | |||
"doctrine/persistence": { | |||
"version": "2.1.0" | |||
}, | |||
"doctrine/sql-formatter": { | |||
"version": "1.1.1" | |||
}, | |||
"egulias/email-validator": { | |||
"version": "2.1.23" | |||
}, | |||
"monolog/monolog": { | |||
"version": "2.1.1" | |||
}, | |||
"nikic/php-parser": { | |||
"version": "v4.10.2" | |||
}, | |||
"ocramius/proxy-manager": { | |||
"version": "2.2.3" | |||
}, | |||
"phpdocumentor/reflection-common": { | |||
"version": "2.2.0" | |||
}, | |||
"phpdocumentor/reflection-docblock": { | |||
"version": "5.2.2" | |||
}, | |||
"phpdocumentor/type-resolver": { | |||
"version": "1.4.0" | |||
}, | |||
"psr/cache": { | |||
"version": "1.0.1" | |||
}, | |||
"psr/container": { | |||
"version": "1.0.0" | |||
}, | |||
"psr/event-dispatcher": { | |||
"version": "1.0.0" | |||
}, | |||
"psr/link": { | |||
"version": "1.0.0" | |||
}, | |||
"psr/log": { | |||
"version": "1.1.3" | |||
}, | |||
"sensio/framework-extra-bundle": { | |||
"version": "5.2", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "5.2", | |||
"ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b" | |||
}, | |||
"files": [ | |||
"config/packages/sensio_framework_extra.yaml" | |||
] | |||
}, | |||
"symfony/asset": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/browser-kit": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/cache": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/cache-contracts": { | |||
"version": "v2.2.0" | |||
}, | |||
"symfony/config": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/console": { | |||
"version": "5.1", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "5.1", | |||
"ref": "c6d02bdfba9da13c22157520e32a602dbee8a75c" | |||
}, | |||
"files": [ | |||
"bin/console" | |||
] | |||
}, | |||
"symfony/css-selector": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/debug-bundle": { | |||
"version": "4.1", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "4.1", | |||
"ref": "f8863cbad2f2e58c4b65fa1eac892ab189971bea" | |||
}, | |||
"files": [ | |||
"config/packages/dev/debug.yaml" | |||
] | |||
}, | |||
"symfony/debug-pack": { | |||
"version": "v1.0.9" | |||
}, | |||
"symfony/dependency-injection": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/deprecation-contracts": { | |||
"version": "v2.2.0" | |||
}, | |||
"symfony/doctrine-bridge": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/dom-crawler": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/dotenv": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/error-handler": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/event-dispatcher": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/event-dispatcher-contracts": { | |||
"version": "v2.2.0" | |||
}, | |||
"symfony/expression-language": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/filesystem": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/finder": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/flex": { | |||
"version": "1.0", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "1.0", | |||
"ref": "c0eeb50665f0f77226616b6038a9b06c03752d8e" | |||
}, | |||
"files": [ | |||
".env" | |||
] | |||
}, | |||
"symfony/form": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/framework-bundle": { | |||
"version": "5.1", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "5.1", | |||
"ref": "5f0d0fd82ffa3580fe0ce8e3b2d18506ebf37a0e" | |||
}, | |||
"files": [ | |||
"config/packages/cache.yaml", | |||
"config/packages/framework.yaml", | |||
"config/packages/test/framework.yaml", | |||
"config/preload.php", | |||
"config/routes/dev/framework.yaml", | |||
"config/services.yaml", | |||
"public/index.php", | |||
"src/Controller/.gitignore", | |||
"src/Kernel.php" | |||
] | |||
}, | |||
"symfony/http-client": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/http-client-contracts": { | |||
"version": "v2.3.1" | |||
}, | |||
"symfony/http-foundation": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/http-kernel": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/intl": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/mailer": { | |||
"version": "4.3", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "4.3", | |||
"ref": "15658c2a0176cda2e7dba66276a2030b52bd81b2" | |||
}, | |||
"files": [ | |||
"config/packages/mailer.yaml" | |||
] | |||
}, | |||
"symfony/maker-bundle": { | |||
"version": "1.0", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "1.0", | |||
"ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" | |||
} | |||
}, | |||
"symfony/mime": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/monolog-bridge": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/monolog-bundle": { | |||
"version": "3.3", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "3.3", | |||
"ref": "d7249f7d560f6736115eee1851d02a65826f0a56" | |||
}, | |||
"files": [ | |||
"config/packages/dev/monolog.yaml", | |||
"config/packages/prod/deprecations.yaml", | |||
"config/packages/prod/monolog.yaml", | |||
"config/packages/test/monolog.yaml" | |||
] | |||
}, | |||
"symfony/notifier": { | |||
"version": "5.0", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "5.0", | |||
"ref": "c31585e252b32fe0e1f30b1f256af553f4a06eb9" | |||
}, | |||
"files": [ | |||
"config/packages/notifier.yaml" | |||
] | |||
}, | |||
"symfony/options-resolver": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/orm-pack": { | |||
"version": "v2.0.0" | |||
}, | |||
"symfony/phpunit-bridge": { | |||
"version": "4.3", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "4.3", | |||
"ref": "6d0e35f749d5f4bfe1f011762875275cd3f9874f" | |||
}, | |||
"files": [ | |||
".env.test", | |||
"bin/phpunit", | |||
"phpunit.xml.dist", | |||
"tests/bootstrap.php" | |||
] | |||
}, | |||
"symfony/polyfill-intl-grapheme": { | |||
"version": "v1.20.0" | |||
}, | |||
"symfony/polyfill-intl-icu": { | |||
"version": "v1.20.0" | |||
}, | |||
"symfony/polyfill-intl-idn": { | |||
"version": "v1.20.0" | |||
}, | |||
"symfony/polyfill-intl-normalizer": { | |||
"version": "v1.20.0" | |||
}, | |||
"symfony/polyfill-mbstring": { | |||
"version": "v1.20.0" | |||
}, | |||
"symfony/polyfill-php73": { | |||
"version": "v1.20.0" | |||
}, | |||
"symfony/polyfill-php80": { | |||
"version": "v1.20.0" | |||
}, | |||
"symfony/process": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/profiler-pack": { | |||
"version": "v1.0.5" | |||
}, | |||
"symfony/property-access": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/property-info": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/routing": { | |||
"version": "5.1", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "5.1", | |||
"ref": "b4f3e7c95e38b606eef467e8a42a8408fc460c43" | |||
}, | |||
"files": [ | |||
"config/packages/prod/routing.yaml", | |||
"config/packages/routing.yaml", | |||
"config/routes.yaml" | |||
] | |||
}, | |||
"symfony/security-bundle": { | |||
"version": "5.1", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "5.1", | |||
"ref": "0a4bae19389d3b9cba1ca0102e3b2bccea724603" | |||
}, | |||
"files": [ | |||
"config/packages/security.yaml" | |||
] | |||
}, | |||
"symfony/security-core": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/security-csrf": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/security-guard": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/security-http": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/serializer": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/serializer-pack": { | |||
"version": "v1.0.4" | |||
}, | |||
"symfony/service-contracts": { | |||
"version": "v2.2.0" | |||
}, | |||
"symfony/stopwatch": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/string": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/test-pack": { | |||
"version": "v1.0.7" | |||
}, | |||
"symfony/translation": { | |||
"version": "3.3", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "3.3", | |||
"ref": "2ad9d2545bce8ca1a863e50e92141f0b9d87ffcd" | |||
}, | |||
"files": [ | |||
"config/packages/translation.yaml", | |||
"translations/.gitignore" | |||
] | |||
}, | |||
"symfony/translation-contracts": { | |||
"version": "v2.3.0" | |||
}, | |||
"symfony/twig-bridge": { | |||
"version": "v5.1.8" | |||
}, | |||
"symfony/twig-bundle": { | |||
"version": "5.0", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "5.0", | |||
"ref": "fab9149bbaa4d5eca054ed93f9e1b66cc500895d" | |||
}, | |||
"files": [ | |||
"config/packages/test/twig.yaml", | |||
"config/packages/twig.yaml", | |||
"templates/base.html.twig" | |||
] | |||
}, | |||
"symfony/twig-pack": { | |||
"version": "v1.0.2" | |||
}, | |||
"symfony/validator": { | |||
"version": "4.3", | |||
"recipe": { | |||
"repo": "github.com/symfony/recipes", | |||
"branch": "master", | |||
"version": "4.3", | |||
"ref": "d902da3e4952f18d3bf05aab29512eb61cabd869" | |||
}, | |||
"files": [ | |||
"config/packages/test/validator.yaml", | |||
"config/packages/validator.yaml" | |||
] | |||
}, | |||
"symfony/var-dumper": { | |||
"version": "v5.1.8" | |||