From 9ab4cdf9286042b44864e0166dae029501a57951 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Thu, 29 Apr 2021 00:18:37 +0700 Subject: [PATCH 1/9] WIP --- docker-compose.override.yaml | 85 +- docker-compose.prod.yaml | 19 +- docker-compose.yaml | 30 +- docker/Dockerfile | 146 - docker/nginx/conf.d/default.conf | 44 - docker/nginx/default.conf | 33 + docker/nginx/docker-entrypoint.sh | 9 - docker/nginx/docker-healthcheck.sh | 8 - docker/php/Dockerfile | 67 + docker/php/conf.d/prod.ini | 3 +- docker/php/docker-entrypoint.sh | 36 +- docker/php/docker-healthcheck.sh | 16 +- docker/php/supervisord/base.conf | 24 - docker/php/supervisord/consumers/async.conf | 10 - symfony/.env | 33 - symfony/.gitignore | 10 - symfony/bin/console | 43 - symfony/composer.json | 77 - symfony/composer.lock | 5879 ----------------- symfony/config/bundles.php | 12 - symfony/config/packages/cache.yaml | 19 - symfony/config/packages/dev/debug.yaml | 4 - symfony/config/packages/dev/monolog.yaml | 20 - symfony/config/packages/dev/web_profiler.yaml | 6 - symfony/config/packages/doctrine.yaml | 18 - .../config/packages/doctrine_migrations.yaml | 5 - symfony/config/packages/framework.yaml | 17 - symfony/config/packages/mailer.yaml | 3 - symfony/config/packages/messenger.yaml | 14 - .../config/packages/prod/deprecations.yaml | 8 - symfony/config/packages/prod/doctrine.yaml | 20 - symfony/config/packages/prod/monolog.yaml | 17 - symfony/config/packages/prod/routing.yaml | 3 - symfony/config/packages/routing.yaml | 7 - symfony/config/packages/test/framework.yaml | 4 - symfony/config/packages/test/monolog.yaml | 12 - symfony/config/packages/test/twig.yaml | 2 - .../config/packages/test/web_profiler.yaml | 6 - symfony/config/packages/twig.yaml | 2 - symfony/config/preload.php | 5 - symfony/config/routes.yaml | 3 - symfony/config/routes/annotations.yaml | 7 - symfony/config/routes/dev/framework.yaml | 3 - symfony/config/routes/dev/web_profiler.yaml | 7 - symfony/config/services.yaml | 32 - symfony/migrations/.gitignore | 0 symfony/public/index.php | 30 - symfony/src/Controller/.gitignore | 0 symfony/src/Entity/.gitignore | 0 symfony/src/Kernel.php | 38 - symfony/src/Repository/.gitignore | 0 symfony/symfony.lock | 371 -- symfony/templates/base.html.twig | 12 - 53 files changed, 135 insertions(+), 7144 deletions(-) delete mode 100644 docker/Dockerfile delete mode 100644 docker/nginx/conf.d/default.conf create mode 100644 docker/nginx/default.conf delete mode 100755 docker/nginx/docker-entrypoint.sh delete mode 100644 docker/nginx/docker-healthcheck.sh create mode 100644 docker/php/Dockerfile delete mode 100644 docker/php/supervisord/base.conf delete mode 100644 docker/php/supervisord/consumers/async.conf delete mode 100644 symfony/.env delete mode 100644 symfony/.gitignore delete mode 100755 symfony/bin/console delete mode 100644 symfony/composer.json delete mode 100644 symfony/composer.lock delete mode 100644 symfony/config/bundles.php delete mode 100644 symfony/config/packages/cache.yaml delete mode 100644 symfony/config/packages/dev/debug.yaml delete mode 100755 symfony/config/packages/dev/monolog.yaml delete mode 100644 symfony/config/packages/dev/web_profiler.yaml delete mode 100644 symfony/config/packages/doctrine.yaml delete mode 100644 symfony/config/packages/doctrine_migrations.yaml delete mode 100644 symfony/config/packages/framework.yaml delete mode 100644 symfony/config/packages/mailer.yaml delete mode 100755 symfony/config/packages/messenger.yaml delete mode 100644 symfony/config/packages/prod/deprecations.yaml delete mode 100644 symfony/config/packages/prod/doctrine.yaml delete mode 100755 symfony/config/packages/prod/monolog.yaml delete mode 100644 symfony/config/packages/prod/routing.yaml delete mode 100644 symfony/config/packages/routing.yaml delete mode 100644 symfony/config/packages/test/framework.yaml delete mode 100644 symfony/config/packages/test/monolog.yaml delete mode 100644 symfony/config/packages/test/twig.yaml delete mode 100644 symfony/config/packages/test/web_profiler.yaml delete mode 100644 symfony/config/packages/twig.yaml delete mode 100644 symfony/config/preload.php delete mode 100644 symfony/config/routes.yaml delete mode 100644 symfony/config/routes/annotations.yaml delete mode 100644 symfony/config/routes/dev/framework.yaml delete mode 100644 symfony/config/routes/dev/web_profiler.yaml delete mode 100644 symfony/config/services.yaml delete mode 100644 symfony/migrations/.gitignore delete mode 100644 symfony/public/index.php delete mode 100644 symfony/src/Controller/.gitignore delete mode 100644 symfony/src/Entity/.gitignore delete mode 100644 symfony/src/Kernel.php delete mode 100644 symfony/src/Repository/.gitignore delete mode 100644 symfony/symfony.lock delete mode 100644 symfony/templates/base.html.twig diff --git a/docker-compose.override.yaml b/docker-compose.override.yaml index 1a28c37..1a69d0b 100644 --- a/docker-compose.override.yaml +++ b/docker-compose.override.yaml @@ -5,26 +5,15 @@ x-build: APP_ENV: 'dev' APP_DEBUG: '1' - &build-cache - - ${PHP_IMAGE:-vuongxuongminh/docker-helm-symfony-php}:dev - - ${NGINX_IMAGE:-vuongxuongminh/docker-helm-symfony-nginx}:dev + - ${SYMFONY_IMAGE:-vuongxuongminh/docker-helm-symfony}:dev services: - mysql: - image: mysql:8 - command: ['--default-authentication-plugin=mysql_native_password'] - environment: - MYSQL_DATABASE: 'test' - MYSQL_ROOT_PASSWORD: 'root' - volumes: - - db-data:/var/lib/mysql - setup: - image: ${PHP_IMAGE:-vuongxuongminh/docker-helm-symfony-php}:dev + image: ${SYMFONY_IMAGE:-vuongxuongminh/docker-helm-symfony}:dev command: ['setup'] build: context: . - dockerfile: ./docker/Dockerfile - target: php + dockerfile: ./docker/php/Dockerfile cache_from: *build-cache args: << : *build-args @@ -32,8 +21,6 @@ services: << : *build-args volumes: - ./symfony:/symfony:rw - depends_on: - - mysql fpm: image: ${PHP_IMAGE:-vuongxuongminh/docker-helm-symfony-php}:dev @@ -45,66 +32,12 @@ services: << : *build-args volumes: - ./symfony:/symfony:rw,cached - - fpm-log-data:/symfony/var/log:rw - depends_on: - - rabbitmq - - mailhog - - mysql - - supervisor: - image: ${PHP_IMAGE:-vuongxuongminh/docker-helm-symfony-php}:dev - build: - cache_from: *build-cache - args: - << : *build-args - environment: - << : *build-args - SUPERVISOR_USERNAME: root - SUPERVISOR_PASSWORD: root - volumes: - - ./symfony:/symfony:rw,cached - - supervisor-log-data:/symfony/var/log:rw - ports: - - target: 9000 - published: 9000 - protocol: tcp - depends_on: - - rabbitmq - - mailhog - - mysql + - log-data:/symfony/var/log:rw nginx: - image: ${NGINX_IMAGE:-vuongxuongminh/docker-helm-symfony-nginx}:dev - build: - cache_from: *build-cache - args: - << : *build-args - environment: - # `fpm` container name use to pass request via `fastcgi_pass`, it useful when you want to change `fpm` service name or container name of it. - FPM_SERVICE: fpm volumes: - ./symfony/public:/symfony/public:rw,cached - - nginx-log-data:/var/log/nginx:rw - ports: - - target: 80 - published: 80 - protocol: tcp - depends_on: - - fpm - - mailhog: - image: mailhog/mailhog - ports: - - target: 8025 - published: 8025 - protocol: tcp - - rabbitmq: - image: rabbitmq:3.8-management-alpine - ports: - - target: 15672 - published: 15672 - protocol: tcp + - ./docker/nginx/default.conf:/opt/bitnami/nginx/conf/server_blocks/default.conf:ro grafana: image: grafana/grafana @@ -131,15 +64,11 @@ services: depends_on: - loki volumes: - - fpm-log-data:/var/log/fpm - - nginx-log-data:/var/log/nginx - - supervisor-log-data:/var/log/supervisor + - log-data:/app/var/log - ./docker/promtail:/etc/promtail:ro command: -config.file=/etc/promtail/config.yaml volumes: db-data: {} grafana-data: {} - fpm-log-data: {} - nginx-log-data: {} - supervisor-log-data: {} + log-data: {} \ No newline at end of file diff --git a/docker-compose.prod.yaml b/docker-compose.prod.yaml index e799bbb..5857716 100644 --- a/docker-compose.prod.yaml +++ b/docker-compose.prod.yaml @@ -5,26 +5,11 @@ x-build: APP_ENV: 'prod' APP_DEBUG: '0' - &build-cache - - ${PHP_IMAGE:-vuongxuongminh/docker-helm-symfony-php}:prod - - ${NGINX_IMAGE:-vuongxuongminh/docker-helm-symfony-nginx}:prod + - ${SYMFONY_IMAGE:-vuongxuongminh/docker-helm-symfony}:prod services: fpm: - image: ${PHP_IMAGE:-vuongxuongminh/docker-helm-symfony-php}:prod - build: - cache_from: *build-cache - args: - << : *build-args - - supervisor: - image: ${PHP_IMAGE:-vuongxuongminh/docker-helm-symfony-php}:prod - build: - cache_from: *build-cache - args: - << : *build-args - - nginx: - image: ${NGINX_IMAGE:-vuongxuongminh/docker-helm-symfony-nginx}:prod + image: ${SYMFONY_IMAGE:-vuongxuongminh/docker-helm-symfony}:prod build: cache_from: *build-cache args: diff --git a/docker-compose.yaml b/docker-compose.yaml index 69d593a..a9c7201 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -5,38 +5,24 @@ services: command: ['fpm'] build: context: . - dockerfile: ./docker/Dockerfile - target: php + dockerfile: ./docker/php/Dockerfile healthcheck: test: ['CMD', 'docker-healthcheck', 'fpm'] interval: 10s timeout: 3s retries: 3 start_period: 30s - - supervisor: - command: ['supervisor'] - build: - context: . - dockerfile: ./docker/Dockerfile - target: php - healthcheck: - test: ['CMD', 'docker-healthcheck', 'supervisor'] - interval: 10s - timeout: 3s - retries: 3 - start_period: 30s + network_mode: service:nginx nginx: - build: - context: . - dockerfile: ./docker/Dockerfile - target: nginx + image: bitnami/nginx healthcheck: - test: ['CMD', 'docker-healthcheck'] + test: ['CMD', 'curl', '-f', 'http://localhost/status'] interval: 10s timeout: 3s retries: 3 start_period: 30s - depends_on: - - fpm \ No newline at end of file + ports: + - target: 8080 + published: 80 + protocol: tcp \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index 43429bc..0000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,146 +0,0 @@ -ARG PHP_VERSION='7.4.12' -ARG NGINX_VERSION='1.17' - -# "php" stage -FROM php:${PHP_VERSION}-fpm-alpine AS php - -ARG APP_ENV -ARG APP_DEBUG - -# extensions default version -ARG APCU_VERSION=5.1.18 -ARG AMQP_VERSION=1.9.4 - -RUN apk add --no-cache \ - git \ - acl \ - fcgi \ - file \ - gettext \ - py3-pip \ - ; - -RUN set -eux; \ - apk add --no-cache --virtual .build-deps \ - $PHPIZE_DEPS \ - icu-dev \ - libzip-dev \ - zlib-dev \ - rabbitmq-c-dev \ - ; \ - pip3 install supervisor; \ - docker-php-ext-configure zip; \ - docker-php-ext-install -j$(nproc) \ - intl \ - zip \ - pdo_mysql \ - ; \ - pecl install \ - apcu-${APCU_VERSION} \ - amqp-${AMQP_VERSION} \ - ; \ - pecl clear-cache; \ - docker-php-ext-enable \ - apcu \ - opcache \ - amqp \ - ; \ - \ - runDeps="$( \ - scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \ - | tr ',' '\n' \ - | sort -u \ - | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ - )"; \ - apk add --no-cache --virtual .api-phpexts-rundeps $runDeps; \ - apk del .build-deps - -COPY --from=composer:2 /usr/bin/composer /usr/bin/composer - -RUN chmod +x /usr/bin/composer; sync - -RUN if [ "${APP_ENV}" = 'prod' ]; then \ - ln -sf $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini; \ - else \ - ln -sf $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini; \ - fi - -COPY /docker/php/conf.d/$APP_ENV.ini $PHP_INI_DIR/conf.d/config.ini -COPY /docker/php/supervisord /var/supervisord - -WORKDIR /symfony - -# Copy needed resources of app. -COPY /symfony/composer.json /symfony/composer.json -COPY /symfony/composer.lock /symfony/composer.lock -COPY /symfony/symfony.lock /symfony/symfony.lock -COPY /symfony/.env /symfony/.env -COPY /symfony/bin /symfony/bin -COPY /symfony/config /symfony/config -COPY /symfony/src /symfony/src -COPY /symfony/migrations /symfony/migrations -COPY /symfony/public /symfony/public - -# Install Symfony Flex globally to speed up download of Composer packages (parallelized prefetching) -RUN set -eux; \ - composer global require "symfony/flex" --prefer-dist --no-progress --no-suggest --classmap-authoritative; \ - composer clear-cache - -ENV PATH="${PATH}:/root/.composer/vendor/bin" - -RUN if [ "${APP_ENV}" = 'prod' ]; then \ - composer install --prefer-dist --no-dev --no-scripts --no-progress --no-suggest; \ - else \ - composer install --prefer-dist --no-scripts --no-progress --no-suggest; \ - fi - -# do not use .env files -RUN composer clear-cache; \ - composer dump-env $APP_ENV; \ - rm .env - -RUN mkdir -p /symfony/var/cache /symfony/var/log; - -RUN if [ "$APP_ENV" = 'prod' ]; then \ - composer dump-autoload --classmap-authoritative --no-dev; \ - composer run-script --no-dev post-install-cmd; \ - else \ - composer dump-autoload --classmap-authoritative; \ - composer run-script post-install-cmd; \ - fi - -VOLUME /symfony/var - -RUN chmod +x bin/console; sync - -RUN set -eux; \ - { \ - echo '[www]'; \ - echo 'ping.path = /ping'; \ - } | tee /usr/local/etc/php-fpm.d/docker-healthcheck.conf - -COPY /docker/php/docker-entrypoint.sh /usr/local/bin/docker-entrypoint -COPY /docker/php/docker-healthcheck.sh /usr/local/bin/docker-healthcheck - -RUN chmod +x /usr/local/bin/docker-entrypoint /usr/local/bin/docker-healthcheck - -ENTRYPOINT ["docker-entrypoint"] - -# "nginx" stage -FROM nginx:${NGINX_VERSION}-alpine AS nginx - -# Add curl for health check. -RUN set -eux; \ - apk add curl --no-cache - -WORKDIR /symfony/public - -COPY /docker/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.stuff -COPY /docker/nginx/docker-entrypoint.sh /usr/local/bin/docker-entrypoint -COPY /docker/nginx/docker-healthcheck.sh /usr/local/bin/docker-healthcheck -COPY --from=php /symfony/public /symfony/public - -RUN chmod +x /usr/local/bin/docker-entrypoint /usr/local/bin/docker-healthcheck - -ENTRYPOINT ["docker-entrypoint"] -CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/docker/nginx/conf.d/default.conf b/docker/nginx/conf.d/default.conf deleted file mode 100644 index 670936f..0000000 --- a/docker/nginx/conf.d/default.conf +++ /dev/null @@ -1,44 +0,0 @@ -server { - root /symfony/public; - - location /healthcheck { - access_log off; - return 200 "healthy"; - } - - location / { - # try to serve file directly, fallback to index.php - try_files $uri /index.php$is_args$args; - } - - location ~ ^/index\.php(/|$) { - fastcgi_pass ${FPM_SERVICE}: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/index.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/symfony_error.log; - access_log /var/log/nginx/symfony_access.log; -} \ No newline at end of file diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf new file mode 100644 index 0000000..9b5bdb5 --- /dev/null +++ b/docker/nginx/default.conf @@ -0,0 +1,33 @@ +server { + listen 0.0.0.0:8080; + + root /symfony/public; + + + location / { + # try to serve file directly, fallback to index.php + try_files $uri /index.php$is_args$args; + } + + location ~ ^/index\.php(/|$) { + fastcgi_pass 0.0.0.0:9000; + + include fastcgi_params; + + fastcgi_param SCRIPT_FILENAME /symfony/public/index.php; + fastcgi_param DOCUMENT_ROOT /symfony/public; + } + + # 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; + } + + location /status { + stub_status on; + access_log off; + allow 127.0.0.1; + deny all; + } +} \ No newline at end of file diff --git a/docker/nginx/docker-entrypoint.sh b/docker/nginx/docker-entrypoint.sh deleted file mode 100755 index 8c872f8..0000000 --- a/docker/nginx/docker-entrypoint.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -set -e - -if [ "$1" = "nginx" ]; then - export FPM_SERVICE=${FPM_SERVICE:-fpm} - envsubst '\$FPM_SERVICE' < /etc/nginx/conf.d/default.conf.stuff > /etc/nginx/conf.d/default.conf -fi - -exec "$@" \ No newline at end of file diff --git a/docker/nginx/docker-healthcheck.sh b/docker/nginx/docker-healthcheck.sh deleted file mode 100644 index 592e130..0000000 --- a/docker/nginx/docker-healthcheck.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -set -e - -if [ $(curl -sS 'http://localhost/healthcheck') = 'healthy' ]; then - exit 0 -fi - -exit 1 \ No newline at end of file diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile new file mode 100644 index 0000000..f0b35bc --- /dev/null +++ b/docker/php/Dockerfile @@ -0,0 +1,67 @@ +ARG PHP_VERSION='8.0' + +FROM php:${PHP_VERSION}-fpm-alpine + +RUN apk add --no-cache \ + git \ + acl \ + fcgi \ + file \ + gettext \ + ; + +COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/ + +ARG APP_ENV +ARG APP_DEBUG + +RUN set -exu; \ + install-php-extensions gd intl zip pcntl apcu opcache @composer; \ + if [ "${APP_DEBUG}" = "1" ]; then \ + install-php-extensions xdebug; \ + fi; \ + if [ "${APP_ENV}" = "dev" ]; then \ + ln -sf $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini; \ + else \ + ln -sf $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini; \ + fi; \ + rm /usr/local/bin/install-php-extensions; + +COPY /docker/php/conf.d/$APP_ENV.ini $PHP_INI_DIR/conf.d/config.ini + +WORKDIR /symfony + +## Remove it and copy your source here. +RUN if [ "${APP_ENV}" = 'prod' ]; then \ + composer create-project symfony/skeleton . --prefer-dist --no-dev --no-progress --no-interaction; \ + else \ + composer create-project symfony/skeleton . --prefer-dist --no-progress --no-interaction; \ + fi + +RUN mkdir -p var/cache var/log; +RUN if [ "${APP_ENV}" = 'prod' ]; then \ + composer install --prefer-dist --no-dev --no-scripts --no-progress --no-suggest; \ + composer dump-autoload --classmap-authoritative --no-dev; \ + else \ + composer install --prefer-dist --no-scripts --no-progress --no-suggest; \ + composer dump-autoload --classmap-authoritative; \ + fi + +RUN set -eux; \ + composer symfony:dump-env "${APP_ENV}"; \ + composer run-script --no-dev post-install-cmd; \ + chmod +x bin/console; sync; +RUN { \ + echo '[www]'; \ + echo 'ping.path = /ping'; \ + } | tee /usr/local/etc/php-fpm.d/docker-healthcheck.conf + +VOLUME /symfony/var + +COPY /docker/php/docker-entrypoint.sh /usr/local/bin/docker-entrypoint +COPY /docker/php/docker-healthcheck.sh /usr/local/bin/docker-healthcheck + +RUN chmod +x /usr/local/bin/docker-entrypoint /usr/local/bin/docker-healthcheck + +ENTRYPOINT ["docker-entrypoint"] +CMD ["fpm"] \ No newline at end of file diff --git a/docker/php/conf.d/prod.ini b/docker/php/conf.d/prod.ini index fb0eb3c..48f3228 100644 --- a/docker/php/conf.d/prod.ini +++ b/docker/php/conf.d/prod.ini @@ -2,6 +2,7 @@ apc.enable_cli = 1 date.timezone = UTC session.auto_start = Off short_open_tag = Off +expose_php = Off # https://symfony.com/doc/current/performance.html opcache.interned_strings_buffer = 16 @@ -12,5 +13,5 @@ realpath_cache_size = 4096K realpath_cache_ttl = 600 # https://symfony.com/blog/new-in-symfony-4-4-preloading-symfony-applications-in-php-7-4 -opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php +opcache.preload=/symfony/config/preload.php opcache.preload_user=www-data \ No newline at end of file diff --git a/docker/php/docker-entrypoint.sh b/docker/php/docker-entrypoint.sh index 96bb824..0718d0d 100755 --- a/docker/php/docker-entrypoint.sh +++ b/docker/php/docker-entrypoint.sh @@ -1,42 +1,28 @@ #!/bin/sh set -e -if [ "$1" = 'fpm' ] || [ "$1" = 'supervisor' ] || [ "$1" = 'setup' ]; then +if [ "$1" = 'fpm' ] || [ "$1" = 'setup' ]; then mkdir -p /symfony/var/cache /symfony/var/log setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX /symfony/var setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX /symfony/var - if [ "$1" = 'supervisor' ]; then - cp /var/supervisord/base.conf /var/supervisord/supervisord.conf - { \ - echo '[inet_http_server]'; \ - echo 'port = *:9000'; \ - echo "username = ${SUPERVISOR_USERNAME:-root}"; \ - echo "password = ${SUPERVISOR_PASSWORD:-root}"; \ - } >> /var/supervisord/supervisord.conf - - set -- supervisord -c /var/supervisord/supervisord.conf - - setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX /var/supervisord - setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX /var/supervisord - elif [ "$1" = 'fpm' ]; then + if [ "$1" = 'fpm' ]; then set -- php-fpm elif [ "$1" = 'setup' ]; then - # Install composer package & run migrate on dev env. - - composer install --prefer-dist --no-progress --no-suggest --no-interaction + umask 0000 - echo "Waiting for db to be ready..." + # First time we need to create project + if [ ! -f composer.json ]; then + composer create-project symfony/skeleton tmp/ --prefer-dist --no-dev --no-progress --no-interaction; + cp -Rp tmp/. . + rm -Rf tmp/ + fi - until bin/console doctrine:query:sql "SELECT 1" > /dev/null 2>&1; do - sleep 1 - done + # Next time just ensure dependencies are up to date. - if ls -A src/Migrations/*.php > /dev/null 2>&1; then - bin/console doctrine:migrations:migrate --no-interaction - fi + composer install --prefer-dist --no-progress --no-interaction exit 0 fi diff --git a/docker/php/docker-healthcheck.sh b/docker/php/docker-healthcheck.sh index e717ffb..f15b998 100755 --- a/docker/php/docker-healthcheck.sh +++ b/docker/php/docker-healthcheck.sh @@ -1,18 +1,12 @@ #!/bin/sh set -e -if [ "$1" = 'fpm' ]; then - export SCRIPT_NAME=/ping - export SCRIPT_FILENAME=/ping - export REQUEST_METHOD=GET +export SCRIPT_NAME=/ping +export SCRIPT_FILENAME=/ping +export REQUEST_METHOD=GET - if cgi-fcgi -bind -connect 127.0.0.1:9000; then - exit 0 - fi -elif [ "$1" = 'supervisor' ]; then - if curl -I http://localhost:9000; then - exit 0 - fi +if cgi-fcgi -bind -connect 127.0.0.1:9000; then + exit 0 fi exit 1 diff --git a/docker/php/supervisord/base.conf b/docker/php/supervisord/base.conf deleted file mode 100644 index b819043..0000000 --- a/docker/php/supervisord/base.conf +++ /dev/null @@ -1,24 +0,0 @@ -[unix_http_server] -file=/var/supervisord/supervisord.sock -chmod=0700 -chown=www-data:www-data - -[supervisorctl] -serverurl=unix:///var/supervisord/supervisord.sock - -[supervisord] -logfile=/var/supervisord/supervisord.log -pidfile=/var/supervisord/supervisord.pid -nodaemon=true -minfds=1024 -minprocs=200 -user=www-data -umask=022 -strip_ansi=false - -[rpcinterface:supervisor] -supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface - -[include] -files=/var/supervisord/consumers/*.conf - diff --git a/docker/php/supervisord/consumers/async.conf b/docker/php/supervisord/consumers/async.conf deleted file mode 100644 index 9610ba5..0000000 --- a/docker/php/supervisord/consumers/async.conf +++ /dev/null @@ -1,10 +0,0 @@ -[program:async] -command=/symfony/bin/console messenger:consume async -numprocs=1 -process_name=%(program_name)s_%(process_num)02d -autostart=true -autorestart = true -startsecs = 0 -startretries = 1 -stopwaitsecs = 60 -user = www-data diff --git a/symfony/.env b/symfony/.env deleted file mode 100644 index a888c94..0000000 --- a/symfony/.env +++ /dev/null @@ -1,33 +0,0 @@ -# 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=d606114b19c9cc51fddb4efc4c3f3744 -#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/messenger ### -MESSENGER_TRANSPORT_DSN=amqp://guest:guest@rabbitmq:5672/%2f/messages -###< symfony/messenger ### - -###> symfony/mailer ### -MAILER_DSN=smtp://mailhog:1025 -###< symfony/mailer ### - -###> doctrine/doctrine-bundle ### -DATABASE_URL=mysql://root:root@mysql:3306/test?serverVersion=8 -###< doctrine/doctrine-bundle ### \ No newline at end of file diff --git a/symfony/.gitignore b/symfony/.gitignore deleted file mode 100644 index a67f91e..0000000 --- a/symfony/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ - -###> symfony/framework-bundle ### -/.env.local -/.env.local.php -/.env.*.local -/config/secrets/prod/prod.decrypt.private.php -/public/bundles/ -/var/ -/vendor/ -###< symfony/framework-bundle ### diff --git a/symfony/bin/console b/symfony/bin/console deleted file mode 100755 index 8fe9d49..0000000 --- a/symfony/bin/console +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env php -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); diff --git a/symfony/composer.json b/symfony/composer.json deleted file mode 100644 index bc9d990..0000000 --- a/symfony/composer.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "type": "project", - "license": "proprietary", - "require": { - "php": ">=7.2.5", - "ext-ctype": "*", - "ext-iconv": "*", - "composer/package-versions-deprecated": "1.11.99.1", - "doctrine/doctrine-bundle": "^2.2", - "doctrine/doctrine-migrations-bundle": "^3.0", - "doctrine/orm": "^2.7", - "symfony/console": "5.1.*", - "symfony/dotenv": "5.1.*", - "symfony/flex": "^1.3.1", - "symfony/framework-bundle": "5.1.*", - "symfony/mailer": "5.1.*", - "symfony/messenger": "5.1.*", - "symfony/monolog-bundle": "^3.6", - "symfony/twig-bundle": "5.1.*", - "symfony/yaml": "5.1.*", - "twig/extra-bundle": "^2.12|^3.0", - "twig/twig": "^2.12|^3.0" - }, - "require-dev": { - "symfony/debug-bundle": "^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.*" - } - } -} diff --git a/symfony/composer.lock b/symfony/composer.lock deleted file mode 100644 index b27f905..0000000 --- a/symfony/composer.lock +++ /dev/null @@ -1,5879 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "ab4b3d50e5caba005e5847627eeb5bc7", - "packages": [ - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.1", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6", - "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2020-11-11T10:22:58+00:00" - }, - { - "name": "doctrine/annotations", - "version": "1.11.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", - "shasum": "" - }, - "require": { - "doctrine/lexer": "1.*", - "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/cache": "1.*", - "doctrine/coding-standard": "^6.0 || ^8.1", - "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/1.11.1" - }, - "time": "2020-10-26T10:28:16+00:00" - }, - { - "name": "doctrine/cache", - "version": "1.10.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", - "shasum": "" - }, - "require": { - "php": "~7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", - "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" - }, - "suggest": { - "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", - "homepage": "https://www.doctrine-project.org/projects/cache.html", - "keywords": [ - "abstraction", - "apcu", - "cache", - "caching", - "couchdb", - "memcached", - "php", - "redis", - "xcache" - ], - "support": { - "issues": "https://github.com/doctrine/cache/issues", - "source": "https://github.com/doctrine/cache/tree/1.10.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", - "type": "tidelift" - } - ], - "time": "2020-07-07T18:54:01+00:00" - }, - { - "name": "doctrine/collections", - "version": "1.6.7", - "source": { - "type": "git", - "url": "https://github.com/doctrine/collections.git", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "reference": "55f8b799269a1a472457bd1a41b4f379d4cfba4a", - "shasum": "" - }, - "require": { - "php": "^7.1.3 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan-shim": "^0.9.2", - "phpunit/phpunit": "^7.0", - "vimeo/psalm": "^3.8.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", - "homepage": "https://www.doctrine-project.org/projects/collections.html", - "keywords": [ - "array", - "collections", - "iterators", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/collections/issues", - "source": "https://github.com/doctrine/collections/tree/1.6.7" - }, - "time": "2020-07-27T17:53:49+00:00" - }, - { - "name": "doctrine/common", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/doctrine/common.git", - "reference": "a3c6479858989e242a2465972b4f7a8642baf0d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/a3c6479858989e242a2465972b4f7a8642baf0d4", - "reference": "a3c6479858989e242a2465972b4f7a8642baf0d4", - "shasum": "" - }, - "require": { - "doctrine/persistence": "^2.0", - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^1.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpunit/phpunit": "^7.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/phpunit-bridge": "^4.0.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", - "homepage": "https://www.doctrine-project.org/projects/common.html", - "keywords": [ - "common", - "doctrine", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/common/issues", - "source": "https://github.com/doctrine/common/tree/3.0.2" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcommon", - "type": "tidelift" - } - ], - "time": "2020-06-05T16:59:53+00:00" - }, - { - "name": "doctrine/dbal", - "version": "2.12.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/dbal.git", - "reference": "adce7a954a1c2f14f85e94aed90c8489af204086" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/adce7a954a1c2f14f85e94aed90c8489af204086", - "reference": "adce7a954a1c2f14f85e94aed90c8489af204086", - "shasum": "" - }, - "require": { - "doctrine/cache": "^1.0", - "doctrine/event-manager": "^1.0", - "ext-pdo": "*", - "php": "^7.3 || ^8" - }, - "require-dev": { - "doctrine/coding-standard": "^8.1", - "jetbrains/phpstorm-stubs": "^2019.1", - "phpstan/phpstan": "^0.12.40", - "phpunit/phpunit": "^9.4", - "psalm/plugin-phpunit": "^0.10.0", - "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "^3.17.2" - }, - "suggest": { - "symfony/console": "For helpful console commands such as SQL execution and import of files." - }, - "bin": [ - "bin/doctrine-dbal" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - } - ], - "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", - "homepage": "https://www.doctrine-project.org/projects/dbal.html", - "keywords": [ - "abstraction", - "database", - "db2", - "dbal", - "mariadb", - "mssql", - "mysql", - "oci8", - "oracle", - "pdo", - "pgsql", - "postgresql", - "queryobject", - "sasql", - "sql", - "sqlanywhere", - "sqlite", - "sqlserver", - "sqlsrv" - ], - "support": { - "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/2.12.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", - "type": "tidelift" - } - ], - "time": "2020-11-14T20:26:58+00:00" - }, - { - "name": "doctrine/doctrine-bundle", - "version": "2.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "9e07bb1ff35d35d9ec4597b79e5d05502d7d4d43" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/9e07bb1ff35d35d9ec4597b79e5d05502d7d4d43", - "reference": "9e07bb1ff35d35d9ec4597b79e5d05502d7d4d43", - "shasum": "" - }, - "require": { - "doctrine/dbal": "^2.9.0|^3.0", - "doctrine/persistence": "^1.3.3|^2.0", - "doctrine/sql-formatter": "^1.0.1", - "php": "^7.1 || ^8.0", - "symfony/cache": "^4.3.3|^5.0", - "symfony/config": "^4.3.3|^5.0", - "symfony/console": "^3.4.30|^4.3.3|^5.0", - "symfony/dependency-injection": "^4.3.3|^5.0", - "symfony/doctrine-bridge": "^4.3.7|^5.0", - "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0", - "symfony/service-contracts": "^1.1.1|^2.0" - }, - "conflict": { - "doctrine/orm": "<2.6", - "twig/twig": "<1.34|>=2.0,<2.4" - }, - "require-dev": { - "doctrine/coding-standard": "^8.0", - "doctrine/orm": "^2.6", - "ocramius/proxy-manager": "^2.1", - "phpunit/phpunit": "^7.5 || ^9.3", - "symfony/phpunit-bridge": "^4.2", - "symfony/property-info": "^4.3.3|^5.0", - "symfony/proxy-manager-bridge": "^3.4|^4.3.3|^5.0", - "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", - "symfony/validator": "^3.4.30|^4.3.3|^5.0", - "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", - "symfony/yaml": "^3.4.30|^4.3.3|^5.0", - "twig/twig": "^1.34|^2.12|^3.0" - }, - "suggest": { - "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", - "symfony/web-profiler-bundle": "To use the data collector." - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\DoctrineBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org/" - } - ], - "description": "Symfony DoctrineBundle", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "database", - "dbal", - "orm", - "persistence" - ], - "support": { - "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.2.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle", - "type": "tidelift" - } - ], - "time": "2020-11-10T20:42:15+00:00" - }, - { - "name": "doctrine/doctrine-migrations-bundle", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "96e730b0ffa0bb39c0f913c1966213f1674bf249" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/96e730b0ffa0bb39c0f913c1966213f1674bf249", - "reference": "96e730b0ffa0bb39c0f913c1966213f1674bf249", - "shasum": "" - }, - "require": { - "doctrine/doctrine-bundle": "~1.0|~2.0", - "doctrine/migrations": "~3.0", - "php": "^7.2", - "symfony/framework-bundle": "~3.4|~4.0|~5.0" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "doctrine/orm": "^2.6", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-deprecation-rules": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^6.4|^7.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Bundle\\MigrationsBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Doctrine Project", - "homepage": "http://www.doctrine-project.org" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony DoctrineMigrationsBundle", - "homepage": "https://www.doctrine-project.org", - "keywords": [ - "dbal", - "migrations", - "schema" - ], - "support": { - "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues", - "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.0.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle", - "type": "tidelift" - } - ], - "time": "2020-06-15T06:04:38+00:00" - }, - { - "name": "doctrine/event-manager", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/event-manager.git", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", - "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.9@dev" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", - "homepage": "https://www.doctrine-project.org/projects/event-manager.html", - "keywords": [ - "event", - "event dispatcher", - "event manager", - "event system", - "events" - ], - "support": { - "issues": "https://github.com/doctrine/event-manager/issues", - "source": "https://github.com/doctrine/event-manager/tree/1.1.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", - "type": "tidelift" - } - ], - "time": "2020-05-29T18:28:51+00:00" - }, - { - "name": "doctrine/inflector", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector", - "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", - "homepage": "https://www.doctrine-project.org/projects/inflector.html", - "keywords": [ - "inflection", - "inflector", - "lowercase", - "manipulation", - "php", - "plural", - "singular", - "strings", - "uppercase", - "words" - ], - "support": { - "issues": "https://github.com/doctrine/inflector/issues", - "source": "https://github.com/doctrine/inflector/tree/1.4.x" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", - "type": "tidelift" - } - ], - "time": "2020-05-29T07:19:59+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^8.0", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2020-11-10T18:47:58+00:00" - }, - { - "name": "doctrine/lexer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/lexer.git", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", - "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^6.0", - "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", - "homepage": "https://www.doctrine-project.org/projects/lexer.html", - "keywords": [ - "annotations", - "docblock", - "lexer", - "parser", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/lexer/issues", - "source": "https://github.com/doctrine/lexer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], - "time": "2020-05-25T17:44:05+00:00" - }, - { - "name": "doctrine/migrations", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/migrations.git", - "reference": "69eaf2ca5bc48357b43ddbdc31ccdffc0e2a0882" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/69eaf2ca5bc48357b43ddbdc31ccdffc0e2a0882", - "reference": "69eaf2ca5bc48357b43ddbdc31ccdffc0e2a0882", - "shasum": "" - }, - "require": { - "doctrine/dbal": "^2.10", - "doctrine/event-manager": "^1.0", - "ocramius/package-versions": "^1.3", - "ocramius/proxy-manager": "^2.0.2", - "php": "^7.2", - "psr/log": "^1.1.3", - "symfony/console": "^3.4||^4.0||^5.0", - "symfony/stopwatch": "^3.4||^4.0||^5.0" - }, - "require-dev": { - "doctrine/coding-standard": "^7.0", - "doctrine/orm": "^2.6", - "doctrine/persistence": "^1.3||^2.0", - "doctrine/sql-formatter": "^1.0", - "ext-pdo_sqlite": "*", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-deprecation-rules": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpstan/phpstan-strict-rules": "^0.12", - "phpstan/phpstan-symfony": "^0.12", - "phpunit/phpunit": "^8.4", - "symfony/process": "^3.4||^4.0||^5.0", - "symfony/yaml": "^3.4||^4.0||^5.0" - }, - "suggest": { - "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.", - "symfony/yaml": "Allows the use of yaml for migration configuration files." - }, - "bin": [ - "bin/doctrine-migrations" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Migrations\\": "lib/Doctrine/Migrations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Michael Simonson", - "email": "contact@mikesimonson.com" - } - ], - "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.", - "homepage": "https://www.doctrine-project.org/projects/migrations.html", - "keywords": [ - "database", - "dbal", - "migrations", - "php" - ], - "support": { - "issues": "https://github.com/doctrine/migrations/issues", - "source": "https://github.com/doctrine/migrations/tree/3.0.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations", - "type": "tidelift" - } - ], - "time": "2020-06-21T08:55:42+00:00" - }, - { - "name": "doctrine/orm", - "version": "2.7.4", - "source": { - "type": "git", - "url": "https://github.com/doctrine/orm.git", - "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/7d84a4998091ece4d645253ac65de9f879eeed2f", - "reference": "7d84a4998091ece4d645253ac65de9f879eeed2f", - "shasum": "" - }, - "require": { - "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "^1.8", - "doctrine/cache": "^1.9.1", - "doctrine/collections": "^1.5", - "doctrine/common": "^2.11 || ^3.0", - "doctrine/dbal": "^2.9.3", - "doctrine/event-manager": "^1.1", - "doctrine/inflector": "^1.0", - "doctrine/instantiator": "^1.3", - "doctrine/lexer": "^1.0", - "doctrine/persistence": "^1.3.3 || ^2.0", - "ext-pdo": "*", - "php": "^7.1", - "symfony/console": "^3.0|^4.0|^5.0" - }, - "require-dev": { - "doctrine/coding-standard": "^5.0", - "phpstan/phpstan": "^0.12.18", - "phpunit/phpunit": "^7.5", - "symfony/yaml": "^3.4|^4.0|^5.0", - "vimeo/psalm": "^3.11" - }, - "suggest": { - "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" - }, - "bin": [ - "bin/doctrine" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\ORM\\": "lib/Doctrine/ORM" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "Object-Relational-Mapper for PHP", - "homepage": "https://www.doctrine-project.org/projects/orm.html", - "keywords": [ - "database", - "orm" - ], - "support": { - "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/2.7.4" - }, - "time": "2020-10-10T17:11:26+00:00" - }, - { - "name": "doctrine/persistence", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/persistence.git", - "reference": "9899c16934053880876b920a3b8b02ed2337ac1d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/persistence/zipball/9899c16934053880876b920a3b8b02ed2337ac1d", - "reference": "9899c16934053880876b920a3b8b02ed2337ac1d", - "shasum": "" - }, - "require": { - "doctrine/annotations": "^1.0", - "doctrine/cache": "^1.0", - "doctrine/collections": "^1.0", - "doctrine/event-manager": "^1.0", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/common": "<2.10@dev" - }, - "require-dev": { - "composer/package-versions-deprecated": "^1.11", - "doctrine/coding-standard": "^6.0 || ^8.0", - "doctrine/common": "^3.0", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^7.5.20 || ^8.0 || ^9.0", - "vimeo/psalm": "^3.11" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\": "lib/Doctrine/Common", - "Doctrine\\Persistence\\": "lib/Doctrine/Persistence" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - }, - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - } - ], - "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", - "homepage": "https://doctrine-project.org/projects/persistence.html", - "keywords": [ - "mapper", - "object", - "odm", - "orm", - "persistence" - ], - "support": { - "issues": "https://github.com/doctrine/persistence/issues", - "source": "https://github.com/doctrine/persistence/tree/2.1.0" - }, - "time": "2020-10-24T22:13:54+00:00" - }, - { - "name": "doctrine/sql-formatter", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/sql-formatter.git", - "reference": "56070bebac6e77230ed7d306ad13528e60732871" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/56070bebac6e77230ed7d306ad13528e60732871", - "reference": "56070bebac6e77230ed7d306ad13528e60732871", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4" - }, - "bin": [ - "bin/sql-formatter" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\SqlFormatter\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jeremy Dorn", - "email": "jeremy@jeremydorn.com", - "homepage": "http://jeremydorn.com/" - } - ], - "description": "a PHP SQL highlighting library", - "homepage": "https://github.com/doctrine/sql-formatter/", - "keywords": [ - "highlight", - "sql" - ], - "support": { - "issues": "https://github.com/doctrine/sql-formatter/issues", - "source": "https://github.com/doctrine/sql-formatter/tree/1.1.x" - }, - "time": "2020-07-30T16:57:33+00:00" - }, - { - "name": "egulias/email-validator", - "version": "2.1.24", - "source": { - "type": "git", - "url": "https://github.com/egulias/EmailValidator.git", - "reference": "ca90a3291eee1538cd48ff25163240695bd95448" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ca90a3291eee1538cd48ff25163240695bd95448", - "reference": "ca90a3291eee1538cd48ff25163240695bd95448", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" - }, - "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" - }, - "suggest": { - "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Egulias\\EmailValidator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Eduardo Gulias Davis" - } - ], - "description": "A library for validating emails against several RFCs", - "homepage": "https://github.com/egulias/EmailValidator", - "keywords": [ - "email", - "emailvalidation", - "emailvalidator", - "validation", - "validator" - ], - "support": { - "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/2.1.24" - }, - "funding": [ - { - "url": "https://github.com/egulias", - "type": "github" - } - ], - "time": "2020-11-14T15:56:27+00:00" - }, - { - "name": "laminas/laminas-code", - "version": "3.5.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-code.git", - "reference": "cb90ef428da9260c2deaa827b037c20695f968ae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/cb90ef428da9260c2deaa827b037c20695f968ae", - "reference": "cb90ef428da9260c2deaa827b037c20695f968ae", - "shasum": "" - }, - "require": { - "laminas/laminas-eventmanager": "^3.3", - "laminas/laminas-zendframework-bridge": "^1.1", - "php": "^7.3 || ~8.0.0" - }, - "conflict": { - "phpspec/prophecy": "<1.9.0" - }, - "replace": { - "zendframework/zend-code": "^3.4.1" - }, - "require-dev": { - "doctrine/annotations": "^1.10.4", - "ext-phar": "*", - "laminas/laminas-coding-standard": "^1.0.0", - "laminas/laminas-stdlib": "^3.3.0", - "phpunit/phpunit": "^9.4.2" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component" - }, - "type": "library", - "autoload": { - "psr-4": { - "Laminas\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "homepage": "https://laminas.dev", - "keywords": [ - "code", - "laminas" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-code/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-code/issues", - "rss": "https://github.com/laminas/laminas-code/releases.atom", - "source": "https://github.com/laminas/laminas-code" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-11-11T22:11:27+00:00" - }, - { - "name": "laminas/laminas-eventmanager", - "version": "3.3.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-eventmanager.git", - "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/1940ccf30e058b2fd66f5a9d696f1b5e0027b082", - "reference": "1940ccf30e058b2fd66f5a9d696f1b5e0027b082", - "shasum": "" - }, - "require": { - "laminas/laminas-zendframework-bridge": "^1.0", - "php": "^7.3 || ^8.0" - }, - "replace": { - "zendframework/zend-eventmanager": "^3.2.1" - }, - "require-dev": { - "container-interop/container-interop": "^1.1", - "laminas/laminas-coding-standard": "~1.0.0", - "laminas/laminas-stdlib": "^2.7.3 || ^3.0", - "phpbench/phpbench": "^0.17.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "container-interop/container-interop": "^1.1, to use the lazy listeners feature", - "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3.x-dev", - "dev-develop": "3.4.x-dev" - } - }, - "autoload": { - "psr-4": { - "Laminas\\EventManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Trigger and listen to events within a PHP application", - "homepage": "https://laminas.dev", - "keywords": [ - "event", - "eventmanager", - "events", - "laminas" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-eventmanager/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-eventmanager/issues", - "rss": "https://github.com/laminas/laminas-eventmanager/releases.atom", - "source": "https://github.com/laminas/laminas-eventmanager" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-08-25T11:10:44+00:00" - }, - { - "name": "laminas/laminas-zendframework-bridge", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-zendframework-bridge.git", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642", - "reference": "6ede70583e101030bcace4dcddd648f760ddf642", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3", - "squizlabs/php_codesniffer": "^3.5" - }, - "type": "library", - "extra": { - "laminas": { - "module": "Laminas\\ZendFrameworkBridge" - } - }, - "autoload": { - "files": [ - "src/autoload.php" - ], - "psr-4": { - "Laminas\\ZendFrameworkBridge\\": "src//" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Alias legacy ZF class names to Laminas Project equivalents.", - "keywords": [ - "ZendFramework", - "autoloading", - "laminas", - "zf" - ], - "support": { - "forum": "https://discourse.laminas.dev/", - "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues", - "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom", - "source": "https://github.com/laminas/laminas-zendframework-bridge" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2020-09-14T14:23:00+00:00" - }, - { - "name": "monolog/monolog", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f9eee5cec93dfb313a38b6b288741e84e53f02d5", - "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/log": "^1.0.1" - }, - "provide": { - "psr/log-implementation": "1.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^6.0", - "graylog2/gelf-php": "^1.4.2", - "php-amqplib/php-amqplib": "~2.4", - "php-console/php-console": "^3.1.3", - "php-parallel-lint/php-parallel-lint": "^1.0", - "phpspec/prophecy": "^1.6.1", - "phpunit/phpunit": "^8.5", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90 <3.0", - "swiftmailer/swiftmailer": "^5.3|^6.0" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "http://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.1.1" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2020-07-23T08:41:23+00:00" - }, - { - "name": "ocramius/proxy-manager", - "version": "2.10.0", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", - "reference": "f65ae0f9dcbdd9d6ad3abb721a9e09c3d7d868a4", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.0.0", - "laminas/laminas-code": "^3.4.1", - "php": "~7.4.1", - "webimpress/safe-writer": "^2.0.1" - }, - "conflict": { - "doctrine/annotations": "<1.6.1", - "laminas/laminas-stdlib": "<3.2.1", - "zendframework/zend-stdlib": "<3.2.1" - }, - "require-dev": { - "codelicia/xulieta": "^0.1.2", - "doctrine/coding-standard": "^8.1.0", - "ext-phar": "*", - "infection/infection": "^0.16.4", - "nikic/php-parser": "^4.6.0", - "phpbench/phpbench": "^0.17.1", - "phpunit/phpunit": "^9.2.5", - "slevomat/coding-standard": "^6.3.10", - "squizlabs/php_codesniffer": "^3.5.5", - "vimeo/psalm": "^3.12.2" - }, - "suggest": { - "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", - "laminas/laminas-soap": "To have the Soap adapter (Remote Object feature)", - "laminas/laminas-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)", - "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "ProxyManager\\": "src/ProxyManager" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.io/" - } - ], - "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", - "homepage": "https://github.com/Ocramius/ProxyManager", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "support": { - "issues": "https://github.com/Ocramius/ProxyManager/issues", - "source": "https://github.com/Ocramius/ProxyManager/tree/2.10.0" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", - "type": "tidelift" - } - ], - "time": "2020-11-12T17:04:46+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/container", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/master" - }, - "time": "2017-02-14T16:28:37+00:00" - }, - { - "name": "psr/event-dispatcher", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/event-dispatcher.git", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", - "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\EventDispatcher\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Standard interfaces for event handling.", - "keywords": [ - "events", - "psr", - "psr-14" - ], - "support": { - "issues": "https://github.com/php-fig/event-dispatcher/issues", - "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" - }, - "time": "2019-01-08T18:20:26+00:00" - }, - { - "name": "psr/log", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.3" - }, - "time": "2020-03-23T09:12:05+00:00" - }, - { - "name": "symfony/amqp-messenger", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/amqp-messenger.git", - "reference": "daa895ff04c3a692b8ca3568445a46b44796e254" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/daa895ff04c3a692b8ca3568445a46b44796e254", - "reference": "daa895ff04c3a692b8ca3568445a46b44796e254", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/messenger": "^5.1" - }, - "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Component\\Messenger\\Bridge\\Amqp\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony AMQP extension Messenger Bridge", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/amqp-messenger/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-27T10:11:13+00:00" - }, - { - "name": "symfony/cache", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache.git", - "reference": "d7bc33e9f9028f49f87057e7944c076d9593f046" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d7bc33e9f9028f49f87057e7944c076d9593f046", - "reference": "d7bc33e9f9028f49f87057e7944c076d9593f046", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "~1.0", - "psr/log": "~1.0", - "symfony/cache-contracts": "^1.1.7|^2", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "conflict": { - "doctrine/dbal": "<2.5", - "symfony/dependency-injection": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/var-dumper": "<4.4" - }, - "provide": { - "psr/cache-implementation": "1.0", - "psr/simple-cache-implementation": "1.0", - "symfony/cache-implementation": "1.0" - }, - "require-dev": { - "cache/integration-tests": "dev-master", - "doctrine/cache": "^1.6", - "doctrine/dbal": "^2.5|^3.0", - "predis/predis": "^1.1", - "psr/simple-cache": "^1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/filesystem": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Cache\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Cache component with PSR-6, PSR-16, and tags", - "homepage": "https://symfony.com", - "keywords": [ - "caching", - "psr6" - ], - "support": { - "source": "https://github.com/symfony/cache/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-25T23:21:56+00:00" - }, - { - "name": "symfony/cache-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/cache-contracts.git", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/8034ca0b61d4dd967f3698aaa1da2507b631d0cb", - "reference": "8034ca0b61d4dd967f3698aaa1da2507b631d0cb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/cache": "^1.0" - }, - "suggest": { - "symfony/cache-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Cache\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to caching", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/config", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "11baeefa4c179d6908655a7b6be728f62367c193" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/11baeefa4c179d6908655a7b6be728f62367c193", - "reference": "11baeefa4c179d6908655a7b6be728f62367c193", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/filesystem": "^4.4|^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/finder": "<4.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Config Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/console", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e", - "reference": "e0b2c29c0fa6a69089209bbe8fcff4df2a313d0e", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Console Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/console/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/dependency-injection", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/dependency-injection.git", - "reference": "829ca6bceaf68036a123a13a979f3c89289eae78" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/829ca6bceaf68036a123a13a979f3c89289eae78", - "reference": "829ca6bceaf68036a123a13a979f3c89289eae78", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1.6|^2" - }, - "conflict": { - "symfony/config": "<5.1", - "symfony/finder": "<4.4", - "symfony/proxy-manager-bridge": "<4.4", - "symfony/yaml": "<4.4" - }, - "provide": { - "psr/container-implementation": "1.0", - "symfony/service-implementation": "1.0" - }, - "require-dev": { - "symfony/config": "^5.1", - "symfony/expression-language": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "symfony/config": "", - "symfony/expression-language": "For using expressions in service container configuration", - "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", - "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", - "symfony/yaml": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\DependencyInjection\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DependencyInjection Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-27T10:11:13+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/master" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/doctrine-bridge", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "d01f0ec8b1225bd955d079f007c25191d93867d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/d01f0ec8b1225bd955d079f007c25191d93867d0", - "reference": "d01f0ec8b1225bd955d079f007c25191d93867d0", - "shasum": "" - }, - "require": { - "doctrine/event-manager": "~1.0", - "doctrine/persistence": "^1.3|^2", - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/dependency-injection": "<4.4", - "symfony/form": "<5.1", - "symfony/http-kernel": "<5", - "symfony/messenger": "<4.4", - "symfony/property-info": "<5", - "symfony/security-bundle": "<5", - "symfony/security-core": "<5", - "symfony/validator": "<5.0.2" - }, - "require-dev": { - "composer/package-versions-deprecated": "^1.8", - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.6", - "doctrine/collections": "~1.0", - "doctrine/data-fixtures": "^1.1", - "doctrine/dbal": "~2.4|^3.0", - "doctrine/orm": "^2.6.3", - "doctrine/reflection": "~1.0", - "symfony/cache": "^5.1", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/doctrine-messenger": "^5.1", - "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^5.1.3", - "symfony/http-kernel": "^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.0", - "symfony/property-info": "^5.0", - "symfony/proxy-manager-bridge": "^4.4|^5.0", - "symfony/security-core": "^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/validator": "^5.0.2", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "doctrine/data-fixtures": "", - "doctrine/dbal": "", - "doctrine/orm": "", - "symfony/form": "", - "symfony/property-info": "", - "symfony/validator": "" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Doctrine\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Doctrine Bridge", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/doctrine-messenger", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "dbff2dc94784923d91be06bf2296a9fdeb7d329d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/dbff2dc94784923d91be06bf2296a9fdeb7d329d", - "reference": "dbff2dc94784923d91be06bf2296a9fdeb7d329d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/messenger": "^5.1", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "doctrine/persistence": "<1.3" - }, - "require-dev": { - "doctrine/dbal": "^2.6|^3.0", - "doctrine/persistence": "^1.3|^2", - "symfony/property-access": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Component\\Messenger\\Bridge\\Doctrine\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Doctrine Messenger Bridge", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/dotenv", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/dotenv.git", - "reference": "29ac2a3e538da61780a769827c716738ce7accbb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/29ac2a3e538da61780a769827c716738ce7accbb", - "reference": "29ac2a3e538da61780a769827c716738ce7accbb", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1" - }, - "require-dev": { - "symfony/process": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Dotenv\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Registers environment variables from a .env file", - "homepage": "https://symfony.com", - "keywords": [ - "dotenv", - "env", - "environment" - ], - "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/error-handler", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "a154f2b12fd1ec708559ba73ed58bd1304e55718" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/a154f2b12fd1ec708559ba73ed58bd1304e55718", - "reference": "a154f2b12fd1ec708559ba73ed58bd1304e55718", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/log": "^1.0", - "symfony/polyfill-php80": "^1.15", - "symfony/var-dumper": "^4.4|^5.0" - }, - "require-dev": { - "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\ErrorHandler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony ErrorHandler Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/event-dispatcher", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "26f4edae48c913fc183a3da0553fe63bdfbd361a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/26f4edae48c913fc183a3da0553fe63bdfbd361a", - "reference": "26f4edae48c913fc183a3da0553fe63bdfbd361a", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/dependency-injection": "<4.4" - }, - "provide": { - "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/event-dispatcher-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2", - "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/event-dispatcher": "^1" - }, - "suggest": { - "symfony/event-dispatcher-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to dispatching event", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.2.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "df08650ea7aee2d925380069c131a66124d79177" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/df08650ea7aee2d925380069c131a66124d79177", - "reference": "df08650ea7aee2d925380069c131a66124d79177", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "e70eb5a69c2ff61ea135a13d2266e8914a67b3a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/e70eb5a69c2ff61ea135a13d2266e8914a67b3a0", - "reference": "e70eb5a69c2ff61ea135a13d2266e8914a67b3a0", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Finder Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/flex", - "version": "v1.10.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/flex.git", - "reference": "e38520236bdc911c2f219634b485bc328746e980" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/flex/zipball/e38520236bdc911c2f219634b485bc328746e980", - "reference": "e38520236bdc911c2f219634b485bc328746e980", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": ">=7.1" - }, - "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "symfony/dotenv": "^4.4|^5.0", - "symfony/phpunit-bridge": "^4.4|^5.0", - "symfony/process": "^3.4|^4.4|^5.0" - }, - "type": "composer-plugin", - "extra": { - "branch-alias": { - "dev-main": "1.9-dev" - }, - "class": "Symfony\\Flex\\Flex" - }, - "autoload": { - "psr-4": { - "Symfony\\Flex\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien.potencier@gmail.com" - } - ], - "description": "Composer plugin for Symfony", - "support": { - "issues": "https://github.com/symfony/flex/issues", - "source": "https://github.com/symfony/flex/tree/v1.10.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-11-05T10:56:45+00:00" - }, - { - "name": "symfony/framework-bundle", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/framework-bundle.git", - "reference": "b5f961afc6cd1923c49cac0993c65bf5eee27d86" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/b5f961afc6cd1923c49cac0993c65bf5eee27d86", - "reference": "b5f961afc6cd1923c49cac0993c65bf5eee27d86", - "shasum": "" - }, - "require": { - "ext-xml": "*", - "php": ">=7.2.5", - "symfony/cache": "^4.4|^5.0", - "symfony/config": "^5.0", - "symfony/dependency-injection": "^5.1", - "symfony/error-handler": "^4.4.1|^5.0.1", - "symfony/event-dispatcher": "^5.1", - "symfony/filesystem": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15", - "symfony/routing": "^5.1" - }, - "conflict": { - "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.0", - "phpdocumentor/type-resolver": "<0.2.1", - "phpunit/phpunit": "<5.4.3", - "symfony/asset": "<5.1", - "symfony/browser-kit": "<4.4", - "symfony/console": "<4.4", - "symfony/dom-crawler": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/form": "<4.4", - "symfony/http-client": "<4.4", - "symfony/lock": "<4.4", - "symfony/mailer": "<4.4", - "symfony/messenger": "<4.4", - "symfony/mime": "<4.4", - "symfony/property-info": "<4.4", - "symfony/serializer": "<4.4", - "symfony/stopwatch": "<4.4", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<4.4", - "symfony/twig-bundle": "<4.4", - "symfony/validator": "<4.4", - "symfony/web-profiler-bundle": "<4.4", - "symfony/workflow": "<4.4" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "paragonie/sodium_compat": "^1.8", - "phpdocumentor/reflection-docblock": "^3.0|^4.0", - "symfony/asset": "^5.1", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dom-crawler": "^4.4|^5.0", - "symfony/dotenv": "^5.1", - "symfony/expression-language": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/mailer": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^4.4|^5.0", - "symfony/property-info": "^4.4|^5.0", - "symfony/security-bundle": "^5.1", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/string": "^5.0", - "symfony/translation": "^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "symfony/validator": "^4.4|^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0", - "twig/twig": "^2.10|^3.0" - }, - "suggest": { - "ext-apcu": "For best performance of the system caches", - "symfony/console": "For using the console commands", - "symfony/form": "For using forms", - "symfony/property-info": "For using the property_info service", - "symfony/serializer": "For using the serializer service", - "symfony/validator": "For using validation", - "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", - "symfony/yaml": "For using the debug:config and lint:yaml commands" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\FrameworkBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony FrameworkBundle", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/http-client-implementation": "" - }, - "type": "library", - "extra": { - "branch-version": "2.3", - "branch-alias": { - "dev-main": "2.3-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-14T17:08:19+00:00" - }, - { - "name": "symfony/http-foundation", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-foundation.git", - "reference": "a2860ec970404b0233ab1e59e0568d3277d32b6f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a2860ec970404b0233ab1e59e0568d3277d32b6f", - "reference": "a2860ec970404b0233ab1e59e0568d3277d32b6f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" - }, - "suggest": { - "symfony/mime": "To use the file extension guesser" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpFoundation\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpFoundation Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/http-kernel", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-kernel.git", - "reference": "a13b3c4d994a4fd051f4c6800c5e33c9508091dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a13b3c4d994a4fd051f4c6800c5e33c9508091dd", - "reference": "a13b3c4d994a4fd051f4c6800c5e33c9508091dd", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/log": "~1.0", - "symfony/deprecation-contracts": "^2.1", - "symfony/error-handler": "^4.4|^5.0", - "symfony/event-dispatcher": "^5.0", - "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/browser-kit": "<4.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<4.4", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", - "twig/twig": "<2.4" - }, - "provide": { - "psr/log-implementation": "1.0" - }, - "require-dev": { - "psr/cache": "~1.0", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/config": "^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/dom-crawler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.4|^3.0" - }, - "suggest": { - "symfony/browser-kit": "", - "symfony/config": "", - "symfony/console": "", - "symfony/dependency-injection": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\HttpKernel\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony HttpKernel Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-28T05:55:23+00:00" - }, - { - "name": "symfony/mailer", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/mailer.git", - "reference": "fa5cc9f894a5d082e7e46bfdd44f5dd83529f0ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/fa5cc9f894a5d082e7e46bfdd44f5dd83529f0ba", - "reference": "fa5cc9f894a5d082e7e46bfdd44f5dd83529f0ba", - "shasum": "" - }, - "require": { - "egulias/email-validator": "^2.1.10", - "php": ">=7.2.5", - "psr/log": "~1.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "symfony/http-kernel": "<4.4" - }, - "require-dev": { - "symfony/amazon-mailer": "^4.4|^5.0", - "symfony/google-mailer": "^4.4|^5.0", - "symfony/http-client-contracts": "^1.1|^2", - "symfony/mailchimp-mailer": "^4.4|^5.0", - "symfony/mailgun-mailer": "^4.4|^5.0", - "symfony/messenger": "^4.4|^5.0", - "symfony/postmark-mailer": "^4.4|^5.0", - "symfony/sendgrid-mailer": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mailer\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Mailer Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/mailer/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/messenger", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/messenger.git", - "reference": "800acfc4dfc954aea6e6adc192e82b44c84520fe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/800acfc4dfc954aea6e6adc192e82b44c84520fe", - "reference": "800acfc4dfc954aea6e6adc192e82b44c84520fe", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/log": "~1.0", - "symfony/amqp-messenger": "^5.1", - "symfony/deprecation-contracts": "^2.1", - "symfony/doctrine-messenger": "^5.1", - "symfony/polyfill-php80": "^1.15", - "symfony/redis-messenger": "^5.1" - }, - "conflict": { - "symfony/event-dispatcher": "<4.4", - "symfony/framework-bundle": "<4.4", - "symfony/http-kernel": "<4.4" - }, - "require-dev": { - "psr/cache": "~1.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/validator": "^4.4|^5.0" - }, - "suggest": { - "enqueue/messenger-adapter": "For using the php-enqueue library as a transport." - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Messenger\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Samuel Roze", - "email": "samuel.roze@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Messenger Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/messenger/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/mime", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "f5485a92c24d4bcfc2f3fc648744fb398482ff1b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/f5485a92c24d4bcfc2f3fc648744fb398482ff1b", - "reference": "f5485a92c24d4bcfc2f3fc648744fb398482ff1b", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/mailer": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Mime\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A library to manipulate MIME messages", - "homepage": "https://symfony.com", - "keywords": [ - "mime", - "mime-type" - ], - "support": { - "source": "https://github.com/symfony/mime/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/monolog-bridge", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "0c507eddb704a3154b53f066cc0b587c4586c868" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/0c507eddb704a3154b53f066cc0b587c4586c868", - "reference": "0c507eddb704a3154b53f066cc0b587c4586c868", - "shasum": "" - }, - "require": { - "monolog/monolog": "^1.25.1|^2", - "php": ">=7.2.5", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "symfony/console": "<4.4", - "symfony/http-foundation": "<4.4" - }, - "require-dev": { - "symfony/console": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/mailer": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings.", - "symfony/http-kernel": "For using the debugging handlers together with the response life cycle of the HTTP kernel.", - "symfony/var-dumper": "For using the debugging handlers like the console handler or the log server handler." - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Monolog\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Monolog Bridge", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/monolog-bundle", - "version": "v3.6.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "e495f5c7e4e672ffef4357d4a4d85f010802f940" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/e495f5c7e4e672ffef4357d4a4d85f010802f940", - "reference": "e495f5c7e4e672ffef4357d4a4d85f010802f940", - "shasum": "" - }, - "require": { - "monolog/monolog": "~1.22 || ~2.0", - "php": ">=5.6", - "symfony/config": "~3.4 || ~4.0 || ^5.0", - "symfony/dependency-injection": "~3.4.10 || ^4.0.10 || ^5.0", - "symfony/http-kernel": "~3.4 || ~4.0 || ^5.0", - "symfony/monolog-bridge": "~3.4 || ~4.0 || ^5.0" - }, - "require-dev": { - "symfony/console": "~3.4 || ~4.0 || ^5.0", - "symfony/phpunit-bridge": "^4.4 || ^5.0", - "symfony/yaml": "~3.4 || ~4.0 || ^5.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Bundle\\MonologBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - } - ], - "description": "Symfony MonologBundle", - "homepage": "http://symfony.com", - "keywords": [ - "log", - "logging" - ], - "support": { - "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v3.6.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-06T15:12:11+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", - "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117", - "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "727d1096295d807c309fb01a851577302394c897" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", - "reference": "727d1096295d807c309fb01a851577302394c897", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.20.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.20-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-23T14:02:19+00:00" - }, - { - "name": "symfony/redis-messenger", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/redis-messenger.git", - "reference": "0c62cc7e04f391fa88fca55dc50d8e5c6b4d4909" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/0c62cc7e04f391fa88fca55dc50d8e5c6b4d4909", - "reference": "0c62cc7e04f391fa88fca55dc50d8e5c6b4d4909", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/messenger": "^5.1" - }, - "require-dev": { - "symfony/property-access": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Component\\Messenger\\Bridge\\Redis\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Redis extension Messenger Bridge", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/redis-messenger/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/routing", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "d6ceee2a37b61b41079005207bf37746d1bfe71f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/d6ceee2a37b61b41079005207bf37746d1bfe71f", - "reference": "d6ceee2a37b61b41079005207bf37746d1bfe71f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "symfony/config": "<5.0", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" - }, - "require-dev": { - "doctrine/annotations": "~1.2", - "psr/log": "~1.0", - "symfony/config": "^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "suggest": { - "doctrine/annotations": "For using the annotation loader", - "symfony/config": "For using the all-in-one router or any loader", - "symfony/expression-language": "For using expression matching", - "symfony/http-foundation": "For using a Symfony Request object", - "symfony/yaml": "For using the YAML loader" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Routing Component", - "homepage": "https://symfony.com", - "keywords": [ - "router", - "routing", - "uri", - "url" - ], - "support": { - "source": "https://github.com/symfony/routing/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.2.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.0" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/master" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-07T11:33:47+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "3d9f57c89011f0266e6b1d469e5c0110513859d5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/3d9f57c89011f0266e6b1d469e5c0110513859d5", - "reference": "3d9f57c89011f0266e6b1d469e5c0110513859d5", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/service-contracts": "^1.0|^2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Stopwatch Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/string", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "a97573e960303db71be0dd8fda9be3bca5e0feea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a97573e960303db71be0dd8fda9be3bca5e0feea", - "reference": "a97573e960303db71be0dd8fda9be3bca5e0feea", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "files": [ - "Resources/functions.php" - ], - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony String component", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/translation-contracts", - "version": "v2.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/translation-contracts.git", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/translation-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Translation\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to translation", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-09-28T13:05:58+00:00" - }, - { - "name": "symfony/twig-bridge", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bridge.git", - "reference": "874735a8c97963af2009e0eaee55b17fc0846db2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/874735a8c97963af2009e0eaee55b17fc0846db2", - "reference": "874735a8c97963af2009e0eaee55b17fc0846db2", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15", - "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/console": "<4.4", - "symfony/form": "<5.1", - "symfony/http-foundation": "<4.4", - "symfony/http-kernel": "<4.4", - "symfony/translation": "<5.0", - "symfony/workflow": "<4.4" - }, - "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/asset": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^5.1", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/routing": "^4.4|^5.0", - "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^4.4|^5.0", - "symfony/security-csrf": "^4.4|^5.0", - "symfony/security-http": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/workflow": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0", - "twig/cssinliner-extra": "^2.12", - "twig/inky-extra": "^2.12", - "twig/markdown-extra": "^2.12" - }, - "suggest": { - "symfony/asset": "For using the AssetExtension", - "symfony/expression-language": "For using the ExpressionExtension", - "symfony/finder": "", - "symfony/form": "For using the FormExtension", - "symfony/http-kernel": "For using the HttpKernelExtension", - "symfony/routing": "For using the RoutingExtension", - "symfony/security-core": "For using the SecurityExtension", - "symfony/security-csrf": "For using the CsrfExtension", - "symfony/security-http": "For using the LogoutUrlExtension", - "symfony/stopwatch": "For using the StopwatchExtension", - "symfony/translation": "For using the TranslationExtension", - "symfony/var-dumper": "For using the DumpExtension", - "symfony/web-link": "For using the WebLinkExtension", - "symfony/yaml": "For using the YamlExtension" - }, - "type": "symfony-bridge", - "autoload": { - "psr-4": { - "Symfony\\Bridge\\Twig\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Twig Bridge", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/twig-bundle", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/twig-bundle.git", - "reference": "370bb30a9e8dc2b0c29791eec300b0b529bd783f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/370bb30a9e8dc2b0c29791eec300b0b529bd783f", - "reference": "370bb30a9e8dc2b0c29791eec300b0b529bd783f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/twig-bridge": "^5.0", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/framework-bundle": "<5.0", - "symfony/translation": "<5.0" - }, - "require-dev": { - "doctrine/annotations": "~1.7", - "doctrine/cache": "~1.0", - "symfony/asset": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/form": "^4.4|^5.0", - "symfony/framework-bundle": "^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^5.0", - "symfony/web-link": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\TwigBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony TwigBundle", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/var-dumper", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "4e13f3fcefb1fcaaa5efb5403581406f4e840b9a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/4e13f3fcefb1fcaaa5efb5403581406f4e840b9a", - "reference": "4e13f3fcefb1fcaaa5efb5403581406f4e840b9a", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.15" - }, - "conflict": { - "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" - }, - "require-dev": { - "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "twig/twig": "^2.4|^3.0" - }, - "suggest": { - "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" - }, - "bin": [ - "Resources/bin/var-dump-server" - ], - "type": "library", - "autoload": { - "files": [ - "Resources/functions/dump.php" - ], - "psr-4": { - "Symfony\\Component\\VarDumper\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony mechanism for exploring and dumping PHP variables", - "homepage": "https://symfony.com", - "keywords": [ - "debug", - "dump" - ], - "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-27T10:11:13+00:00" - }, - { - "name": "symfony/var-exporter", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/var-exporter.git", - "reference": "b4048bfc6248413592462c029381bdb2f7b6525f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/b4048bfc6248413592462c029381bdb2f7b6525f", - "reference": "b4048bfc6248413592462c029381bdb2f7b6525f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.15" - }, - "require-dev": { - "symfony/var-dumper": "^4.4.9|^5.0.9" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\VarExporter\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", - "homepage": "https://symfony.com", - "keywords": [ - "clone", - "construct", - "export", - "hydrate", - "instantiate", - "serialize" - ], - "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/yaml", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "f284e032c3cefefb9943792132251b79a6127ca6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/f284e032c3cefefb9943792132251b79a6127ca6", - "reference": "f284e032c3cefefb9943792132251b79a6127ca6", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<4.4" - }, - "require-dev": { - "symfony/console": "^4.4|^5.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:03:25+00:00" - }, - { - "name": "twig/extra-bundle", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/twigphp/twig-extra-bundle.git", - "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/a7c5799cf742ab0827f5d32df37528ee8bf5a233", - "reference": "a7c5799cf742ab0827f5d32df37528ee8bf5a233", - "shasum": "" - }, - "require": { - "php": "^7.1.3|^8.0", - "symfony/framework-bundle": "^4.3|^5.0", - "symfony/twig-bundle": "^4.3|^5.0", - "twig/twig": "^2.4|^3.0" - }, - "require-dev": { - "twig/cssinliner-extra": "^2.12|^3.0", - "twig/html-extra": "^2.12|^3.0", - "twig/inky-extra": "^2.12|^3.0", - "twig/intl-extra": "^2.12|^3.0", - "twig/markdown-extra": "^2.12|^3.0" - }, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\Extra\\TwigExtraBundle\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - } - ], - "description": "A Symfony bundle for extra Twig extensions", - "homepage": "https://twig.symfony.com", - "keywords": [ - "bundle", - "extra", - "twig" - ], - "support": { - "source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.1.1" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2020-05-21T09:56:39+00:00" - }, - { - "name": "twig/twig", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/twigphp/Twig.git", - "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/b02fa41f3783a2616eccef7b92fbc2343ffed737", - "reference": "b02fa41f3783a2616eccef7b92fbc2343ffed737", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-mbstring": "^1.3" - }, - "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "psr-4": { - "Twig\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Twig Team", - "role": "Contributors" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "https://twig.symfony.com", - "keywords": [ - "templating" - ], - "support": { - "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.1.1" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/twig/twig", - "type": "tidelift" - } - ], - "time": "2020-10-27T19:28:23+00:00" - }, - { - "name": "webimpress/safe-writer", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/webimpress/safe-writer.git", - "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/5cfafdec5873c389036f14bf832a5efc9390dcdd", - "reference": "5cfafdec5873c389036f14bf832a5efc9390dcdd", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.8 || ^9.3.7", - "vimeo/psalm": "^3.14.2", - "webimpress/coding-standard": "^1.1.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1.x-dev", - "dev-develop": "2.2.x-dev", - "dev-release-1.0": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Webimpress\\SafeWriter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "description": "Tool to write files safely, to avoid race conditions", - "keywords": [ - "concurrent write", - "file writer", - "race condition", - "safe writer", - "webimpress" - ], - "support": { - "issues": "https://github.com/webimpress/safe-writer/issues", - "source": "https://github.com/webimpress/safe-writer/tree/master" - }, - "funding": [ - { - "url": "https://github.com/michalbundyra", - "type": "github" - } - ], - "time": "2020-08-25T07:21:11+00:00" - } - ], - "packages-dev": [ - { - "name": "symfony/debug-bundle", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/debug-bundle.git", - "reference": "183a36bdb251eeeeff640ffbceea3403ac5c8d40" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/183a36bdb251eeeeff640ffbceea3403ac5c8d40", - "reference": "183a36bdb251eeeeff640ffbceea3403ac5c8d40", - "shasum": "" - }, - "require": { - "ext-xml": "*", - "php": ">=7.2.5", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/twig-bridge": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "conflict": { - "symfony/config": "<4.4", - "symfony/dependency-injection": "<4.4" - }, - "require-dev": { - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/web-profiler-bundle": "^4.4|^5.0" - }, - "suggest": { - "symfony/config": "For service container configuration", - "symfony/dependency-injection": "For using as a service from the container" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\DebugBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DebugBundle", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - }, - { - "name": "symfony/web-profiler-bundle", - "version": "v5.1.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "d94865ad9365ee4ac0d9bd24d9e90410e7ec6185" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/d94865ad9365ee4ac0d9bd24d9e90410e7ec6185", - "reference": "d94865ad9365ee4ac0d9bd24d9e90410e7ec6185", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/config": "^4.4|^5.0", - "symfony/framework-bundle": "^5.1", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/twig-bundle": "^4.4|^5.0", - "twig/twig": "^2.10|^3.0" - }, - "conflict": { - "symfony/form": "<4.4", - "symfony/messenger": "<4.4" - }, - "require-dev": { - "symfony/browser-kit": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0" - }, - "type": "symfony-bundle", - "autoload": { - "psr-4": { - "Symfony\\Bundle\\WebProfilerBundle\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony WebProfilerBundle", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.1.8" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-10-24T12:01:57+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=7.2.5", - "ext-ctype": "*", - "ext-iconv": "*" - }, - "platform-dev": [], - "plugin-api-version": "2.0.0" -} diff --git a/symfony/config/bundles.php b/symfony/config/bundles.php deleted file mode 100644 index 987cc80..0000000 --- a/symfony/config/bundles.php +++ /dev/null @@ -1,12 +0,0 @@ - ['all' => true], - Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], - Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], - Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], - Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], - Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true], - Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], - Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true], -]; diff --git a/symfony/config/packages/cache.yaml b/symfony/config/packages/cache.yaml deleted file mode 100644 index 6899b72..0000000 --- a/symfony/config/packages/cache.yaml +++ /dev/null @@ -1,19 +0,0 @@ -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 diff --git a/symfony/config/packages/dev/debug.yaml b/symfony/config/packages/dev/debug.yaml deleted file mode 100644 index 26d4e53..0000000 --- a/symfony/config/packages/dev/debug.yaml +++ /dev/null @@ -1,4 +0,0 @@ -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)%" diff --git a/symfony/config/packages/dev/monolog.yaml b/symfony/config/packages/dev/monolog.yaml deleted file mode 100755 index 7bfdabd..0000000 --- a/symfony/config/packages/dev/monolog.yaml +++ /dev/null @@ -1,20 +0,0 @@ -monolog: - handlers: - main: - type: stream - path: "%kernel.logs_dir%/%kernel.environment%.log" - level: debug - channels: ["!event"] - formatter: 'monolog.formatter.json' - # 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"] diff --git a/symfony/config/packages/dev/web_profiler.yaml b/symfony/config/packages/dev/web_profiler.yaml deleted file mode 100644 index e92166a..0000000 --- a/symfony/config/packages/dev/web_profiler.yaml +++ /dev/null @@ -1,6 +0,0 @@ -web_profiler: - toolbar: true - intercept_redirects: false - -framework: - profiler: { only_exceptions: false } diff --git a/symfony/config/packages/doctrine.yaml b/symfony/config/packages/doctrine.yaml deleted file mode 100644 index c319176..0000000 --- a/symfony/config/packages/doctrine.yaml +++ /dev/null @@ -1,18 +0,0 @@ -doctrine: - dbal: - 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: '13' - 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 diff --git a/symfony/config/packages/doctrine_migrations.yaml b/symfony/config/packages/doctrine_migrations.yaml deleted file mode 100644 index 61e6612..0000000 --- a/symfony/config/packages/doctrine_migrations.yaml +++ /dev/null @@ -1,5 +0,0 @@ -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' diff --git a/symfony/config/packages/framework.yaml b/symfony/config/packages/framework.yaml deleted file mode 100644 index cad7f78..0000000 --- a/symfony/config/packages/framework.yaml +++ /dev/null @@ -1,17 +0,0 @@ -# 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 diff --git a/symfony/config/packages/mailer.yaml b/symfony/config/packages/mailer.yaml deleted file mode 100644 index 56a650d..0000000 --- a/symfony/config/packages/mailer.yaml +++ /dev/null @@ -1,3 +0,0 @@ -framework: - mailer: - dsn: '%env(MAILER_DSN)%' diff --git a/symfony/config/packages/messenger.yaml b/symfony/config/packages/messenger.yaml deleted file mode 100755 index 13e40f2..0000000 --- a/symfony/config/packages/messenger.yaml +++ /dev/null @@ -1,14 +0,0 @@ -framework: - messenger: - # Uncomment this (and the failed transport below) to send failed messages to this transport for later handling. - # failure_transport: failed - - transports: - # https://symfony.com/doc/current/messenger.html#transport-configuration - async: '%env(MESSENGER_TRANSPORT_DSN)%' - # failed: 'doctrine://default?queue_name=failed' - # sync: 'sync://' - - routing: - # Route your messages to the transports - # 'App\Message\YourMessage': async diff --git a/symfony/config/packages/prod/deprecations.yaml b/symfony/config/packages/prod/deprecations.yaml deleted file mode 100644 index 920a061..0000000 --- a/symfony/config/packages/prod/deprecations.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# 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" diff --git a/symfony/config/packages/prod/doctrine.yaml b/symfony/config/packages/prod/doctrine.yaml deleted file mode 100644 index 084f59a..0000000 --- a/symfony/config/packages/prod/doctrine.yaml +++ /dev/null @@ -1,20 +0,0 @@ -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 diff --git a/symfony/config/packages/prod/monolog.yaml b/symfony/config/packages/prod/monolog.yaml deleted file mode 100755 index 2ce8a16..0000000 --- a/symfony/config/packages/prod/monolog.yaml +++ /dev/null @@ -1,17 +0,0 @@ -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 - formatter: 'monolog.formatter.json' - console: - type: console - process_psr_3_messages: false - channels: ["!event", "!doctrine"] diff --git a/symfony/config/packages/prod/routing.yaml b/symfony/config/packages/prod/routing.yaml deleted file mode 100644 index b3e6a0a..0000000 --- a/symfony/config/packages/prod/routing.yaml +++ /dev/null @@ -1,3 +0,0 @@ -framework: - router: - strict_requirements: null diff --git a/symfony/config/packages/routing.yaml b/symfony/config/packages/routing.yaml deleted file mode 100644 index b45c1ce..0000000 --- a/symfony/config/packages/routing.yaml +++ /dev/null @@ -1,7 +0,0 @@ -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 diff --git a/symfony/config/packages/test/framework.yaml b/symfony/config/packages/test/framework.yaml deleted file mode 100644 index d051c84..0000000 --- a/symfony/config/packages/test/framework.yaml +++ /dev/null @@ -1,4 +0,0 @@ -framework: - test: true - session: - storage_id: session.storage.mock_file diff --git a/symfony/config/packages/test/monolog.yaml b/symfony/config/packages/test/monolog.yaml deleted file mode 100644 index fc40641..0000000 --- a/symfony/config/packages/test/monolog.yaml +++ /dev/null @@ -1,12 +0,0 @@ -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 diff --git a/symfony/config/packages/test/twig.yaml b/symfony/config/packages/test/twig.yaml deleted file mode 100644 index 8c6e0b4..0000000 --- a/symfony/config/packages/test/twig.yaml +++ /dev/null @@ -1,2 +0,0 @@ -twig: - strict_variables: true diff --git a/symfony/config/packages/test/web_profiler.yaml b/symfony/config/packages/test/web_profiler.yaml deleted file mode 100644 index 03752de..0000000 --- a/symfony/config/packages/test/web_profiler.yaml +++ /dev/null @@ -1,6 +0,0 @@ -web_profiler: - toolbar: false - intercept_redirects: false - -framework: - profiler: { collect: false } diff --git a/symfony/config/packages/twig.yaml b/symfony/config/packages/twig.yaml deleted file mode 100644 index b3cdf30..0000000 --- a/symfony/config/packages/twig.yaml +++ /dev/null @@ -1,2 +0,0 @@ -twig: - default_path: '%kernel.project_dir%/templates' diff --git a/symfony/config/preload.php b/symfony/config/preload.php deleted file mode 100644 index 5ebcdb2..0000000 --- a/symfony/config/preload.php +++ /dev/null @@ -1,5 +0,0 @@ -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); diff --git a/symfony/src/Controller/.gitignore b/symfony/src/Controller/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/symfony/src/Entity/.gitignore b/symfony/src/Entity/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/symfony/src/Kernel.php b/symfony/src/Kernel.php deleted file mode 100644 index 655e796..0000000 --- a/symfony/src/Kernel.php +++ /dev/null @@ -1,38 +0,0 @@ -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); - } - } -} diff --git a/symfony/src/Repository/.gitignore b/symfony/src/Repository/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/symfony/symfony.lock b/symfony/symfony.lock deleted file mode 100644 index 795463d..0000000 --- a/symfony/symfony.lock +++ /dev/null @@ -1,371 +0,0 @@ -{ - "composer/package-versions-deprecated": { - "version": "1.11.99.1" - }, - "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.12.1" - }, - "doctrine/doctrine-bundle": { - "version": "2.0", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "2.0", - "ref": "368794356c1fb634e58b38ad2addb36933f2e73e" - }, - "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.4.0" - }, - "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.24" - }, - "laminas/laminas-code": { - "version": "3.5.0" - }, - "laminas/laminas-eventmanager": { - "version": "3.3.0" - }, - "laminas/laminas-zendframework-bridge": { - "version": "1.1.1" - }, - "monolog/monolog": { - "version": "2.1.1" - }, - "ocramius/proxy-manager": { - "version": "2.10.0" - }, - "psr/cache": { - "version": "1.0.1" - }, - "psr/container": { - "version": "1.0.0" - }, - "psr/event-dispatcher": { - "version": "1.0.0" - }, - "psr/log": { - "version": "1.1.3" - }, - "symfony/amqp-messenger": { - "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/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/doctrine-messenger": { - "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/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/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-contracts": { - "version": "v2.3.1" - }, - "symfony/http-foundation": { - "version": "v5.1.8" - }, - "symfony/http-kernel": { - "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/messenger": { - "version": "4.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "4.3", - "ref": "e9a414b113ceadbf4e52abe37bf8f1b443f06ccb" - }, - "files": [ - "config/packages/messenger.yaml" - ] - }, - "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/orm-pack": { - "version": "v2.0.0" - }, - "symfony/polyfill-intl-grapheme": { - "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/profiler-pack": { - "version": "v1.0.5" - }, - "symfony/redis-messenger": { - "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/service-contracts": { - "version": "v2.2.0" - }, - "symfony/stopwatch": { - "version": "v5.1.8" - }, - "symfony/string": { - "version": "v5.1.8" - }, - "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.1" - }, - "symfony/var-dumper": { - "version": "v5.1.8" - }, - "symfony/var-exporter": { - "version": "v5.1.8" - }, - "symfony/web-profiler-bundle": { - "version": "3.3", - "recipe": { - "repo": "github.com/symfony/recipes", - "branch": "master", - "version": "3.3", - "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" - }, - "files": [ - "config/packages/dev/web_profiler.yaml", - "config/packages/test/web_profiler.yaml", - "config/routes/dev/web_profiler.yaml" - ] - }, - "symfony/yaml": { - "version": "v5.1.8" - }, - "twig/extra-bundle": { - "version": "v3.1.1" - }, - "twig/twig": { - "version": "v3.1.1" - }, - "webimpress/safe-writer": { - "version": "2.1.0" - } -} diff --git a/symfony/templates/base.html.twig b/symfony/templates/base.html.twig deleted file mode 100644 index 043f42d..0000000 --- a/symfony/templates/base.html.twig +++ /dev/null @@ -1,12 +0,0 @@ - - - - - {% block title %}Welcome!{% endblock %} - {% block stylesheets %}{% endblock %} - - - {% block body %}{% endblock %} - {% block javascripts %}{% endblock %} - - From 4202af53084c6c41c20c91476d9f4561341f569b Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 30 Apr 2021 00:28:21 +0700 Subject: [PATCH 2/9] Refactor Helm chart. --- docker-compose.yaml | 2 +- docker/{php => fpm}/Dockerfile | 4 +- docker/{php => fpm}/conf.d/dev.ini | 0 docker/{php => fpm}/conf.d/prod.ini | 0 docker/{php => fpm}/docker-entrypoint.sh | 0 docker/{php => fpm}/docker-healthcheck.sh | 0 docker/nginx/default.conf | 11 +- helm-chart/Chart.lock | 6 + {helm/symfony => helm-chart}/Chart.yaml | 11 +- .../templates/NOTES.txt | 0 .../templates/_helpers.tpl | 28 ---- helm-chart/templates/fpm/configmap.yaml | 11 ++ helm-chart/templates/fpm/secret.yaml | 9 ++ helm-chart/templates/nginx/configmap.yaml | 37 ++++++ helm-chart/values.yaml | 59 +++++++++ helm/symfony/Chart.lock | 9 -- helm/symfony/templates/fpm/deployment.yaml | 73 ---------- helm/symfony/templates/fpm/service.yaml | 15 --- helm/symfony/templates/hook/job.yaml | 42 ------ helm/symfony/templates/ingress/ingress.yaml | 36 ----- helm/symfony/templates/nginx/deployment.yaml | 65 --------- helm/symfony/templates/nginx/service.yaml | 15 --- helm/symfony/templates/php/configmap.yaml | 11 -- helm/symfony/templates/php/secret.yaml | 11 -- .../templates/supervisor/deployment.yaml | 75 ----------- helm/symfony/templates/supervisor/secret.yaml | 10 -- .../symfony/templates/supervisor/service.yaml | 15 --- helm/symfony/values.yaml | 125 ------------------ 28 files changed, 132 insertions(+), 548 deletions(-) rename docker/{php => fpm}/Dockerfile (93%) rename docker/{php => fpm}/conf.d/dev.ini (100%) rename docker/{php => fpm}/conf.d/prod.ini (100%) rename docker/{php => fpm}/docker-entrypoint.sh (100%) mode change 100755 => 100644 rename docker/{php => fpm}/docker-healthcheck.sh (100%) mode change 100755 => 100644 create mode 100644 helm-chart/Chart.lock rename {helm/symfony => helm-chart}/Chart.yaml (79%) rename {helm/symfony => helm-chart}/templates/NOTES.txt (100%) rename {helm/symfony => helm-chart}/templates/_helpers.tpl (55%) create mode 100644 helm-chart/templates/fpm/configmap.yaml create mode 100644 helm-chart/templates/fpm/secret.yaml create mode 100644 helm-chart/templates/nginx/configmap.yaml create mode 100644 helm-chart/values.yaml delete mode 100644 helm/symfony/Chart.lock delete mode 100644 helm/symfony/templates/fpm/deployment.yaml delete mode 100644 helm/symfony/templates/fpm/service.yaml delete mode 100644 helm/symfony/templates/hook/job.yaml delete mode 100644 helm/symfony/templates/ingress/ingress.yaml delete mode 100644 helm/symfony/templates/nginx/deployment.yaml delete mode 100644 helm/symfony/templates/nginx/service.yaml delete mode 100644 helm/symfony/templates/php/configmap.yaml delete mode 100644 helm/symfony/templates/php/secret.yaml delete mode 100644 helm/symfony/templates/supervisor/deployment.yaml delete mode 100644 helm/symfony/templates/supervisor/secret.yaml delete mode 100644 helm/symfony/templates/supervisor/service.yaml delete mode 100644 helm/symfony/values.yaml diff --git a/docker-compose.yaml b/docker-compose.yaml index a9c7201..99f40a7 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -5,7 +5,7 @@ services: command: ['fpm'] build: context: . - dockerfile: ./docker/php/Dockerfile + dockerfile: ./docker/fpm/Dockerfile healthcheck: test: ['CMD', 'docker-healthcheck', 'fpm'] interval: 10s diff --git a/docker/php/Dockerfile b/docker/fpm/Dockerfile similarity index 93% rename from docker/php/Dockerfile rename to docker/fpm/Dockerfile index f0b35bc..8876430 100644 --- a/docker/php/Dockerfile +++ b/docker/fpm/Dockerfile @@ -58,8 +58,8 @@ RUN { \ VOLUME /symfony/var -COPY /docker/php/docker-entrypoint.sh /usr/local/bin/docker-entrypoint -COPY /docker/php/docker-healthcheck.sh /usr/local/bin/docker-healthcheck +COPY /docker/fpm/docker-entrypoint.sh /usr/local/bin/docker-entrypoint +COPY /docker/fpm/docker-healthcheck.sh /usr/local/bin/docker-healthcheck RUN chmod +x /usr/local/bin/docker-entrypoint /usr/local/bin/docker-healthcheck diff --git a/docker/php/conf.d/dev.ini b/docker/fpm/conf.d/dev.ini similarity index 100% rename from docker/php/conf.d/dev.ini rename to docker/fpm/conf.d/dev.ini diff --git a/docker/php/conf.d/prod.ini b/docker/fpm/conf.d/prod.ini similarity index 100% rename from docker/php/conf.d/prod.ini rename to docker/fpm/conf.d/prod.ini diff --git a/docker/php/docker-entrypoint.sh b/docker/fpm/docker-entrypoint.sh old mode 100755 new mode 100644 similarity index 100% rename from docker/php/docker-entrypoint.sh rename to docker/fpm/docker-entrypoint.sh diff --git a/docker/php/docker-healthcheck.sh b/docker/fpm/docker-healthcheck.sh old mode 100755 new mode 100644 similarity index 100% rename from docker/php/docker-healthcheck.sh rename to docker/fpm/docker-healthcheck.sh diff --git a/docker/nginx/default.conf b/docker/nginx/default.conf index 9b5bdb5..3a5a9d6 100644 --- a/docker/nginx/default.conf +++ b/docker/nginx/default.conf @@ -12,16 +12,13 @@ server { location ~ ^/index\.php(/|$) { fastcgi_pass 0.0.0.0:9000; + fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; - fastcgi_param SCRIPT_FILENAME /symfony/public/index.php; - fastcgi_param DOCUMENT_ROOT /symfony/public; - } + fastcgi_param DOCUMENT_ROOT $realpath_root; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - # 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; + internal; } location /status { diff --git a/helm-chart/Chart.lock b/helm-chart/Chart.lock new file mode 100644 index 0000000..36e3808 --- /dev/null +++ b/helm-chart/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: nginx + repository: https://charts.bitnami.com/bitnami + version: 8.8.4 +digest: sha256:389516a07dd11fc4af3fe93c67e99559ac2652a3886d07a80dbb1d9b05895788 +generated: "2021-04-29T23:59:03.530114366+07:00" diff --git a/helm/symfony/Chart.yaml b/helm-chart/Chart.yaml similarity index 79% rename from helm/symfony/Chart.yaml rename to helm-chart/Chart.yaml index bde9585..f0bf06c 100644 --- a/helm/symfony/Chart.yaml +++ b/helm-chart/Chart.yaml @@ -21,11 +21,6 @@ version: 1.0.0 appVersion: 1.0.0 dependencies: - - name: mysql - version: ~1.6.2 - repository: https://charts.helm.sh/stable - condition: mysql.internal - - name: rabbitmq - version: ~6.18.9 - repository: https://charts.bitnami.com/bitnami - condition: rabbitmq.internal + - name: nginx + version: ^8.8 + repository: https://charts.bitnami.com/bitnami \ No newline at end of file diff --git a/helm/symfony/templates/NOTES.txt b/helm-chart/templates/NOTES.txt similarity index 100% rename from helm/symfony/templates/NOTES.txt rename to helm-chart/templates/NOTES.txt diff --git a/helm/symfony/templates/_helpers.tpl b/helm-chart/templates/_helpers.tpl similarity index 55% rename from helm/symfony/templates/_helpers.tpl rename to helm-chart/templates/_helpers.tpl index 30b599d..162c625 100644 --- a/helm/symfony/templates/_helpers.tpl +++ b/helm-chart/templates/_helpers.tpl @@ -37,38 +37,10 @@ release: {{ .Release.Name }} app: "{{ template "name" . }}" {{- end -}} -{{- define "php" -}} - {{- printf "%s-php" (include "fullname" .) -}} -{{- end -}} - {{- define "fpm" -}} {{- printf "%s-fpm" (include "fullname" .) -}} {{- end -}} -{{- define "supervisor" -}} - {{- printf "%s-supervisor" (include "fullname" .) -}} -{{- end -}} - {{- define "nginx" -}} {{- printf "%s-nginx" (include "fullname" .) -}} -{{- end -}} - -{{- define "hook" -}} - {{- printf "%s-hook" (include "fullname" .) -}} -{{- end -}} - -{{- define "databaseDsn" -}} - {{- if .Values.mysql.internal }} - {{- printf "mysql://%s:%s@%s/%s?serverVersion=5.7" (.Values.mysql.mysqlUser) (.Values.mysql.mysqlPassword) (.Values.mysql.fullnameOverride) (.Values.mysql.mysqlDatabase) -}} - {{- else }} - {{- .Values.mysql.externalDsn -}} - {{- end }} -{{- end -}} - -{{- define "messengerTransportDsn" -}} - {{- if .Values.rabbitmq.internal }} - {{- printf "amqp://%s:%s@%s:%s/%s" (.Values.rabbitmq.rabbitmq.username) (.Values.rabbitmq.rabbitmq.password) (.Values.rabbitmq.fullnameOverride) (.Values.rabbitmq.service.port | toString) "%2f" -}} - {{- else }} - {{- .Values.rabbitmq.externalDsn -}} - {{- end }} {{- end -}} \ No newline at end of file diff --git a/helm-chart/templates/fpm/configmap.yaml b/helm-chart/templates/fpm/configmap.yaml new file mode 100644 index 0000000..ea1b96f --- /dev/null +++ b/helm-chart/templates/fpm/configmap.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "fpm" . }} + labels: + {{- include "labels" . | nindent 4 }} +data: + APP_ENV: {{ .Values.global.fpm.env | quote }} + APP_DEBUG: {{ .Values.global.fpm.debug | quote }} + TRUSTED_HOSTS: {{ .Values.global.fpm.trustedHosts | quote }} + TRUSTED_PROXIES: {{ join "," .Values.global.fpm.trustedProxies | quote }} \ No newline at end of file diff --git a/helm-chart/templates/fpm/secret.yaml b/helm-chart/templates/fpm/secret.yaml new file mode 100644 index 0000000..47e5d35 --- /dev/null +++ b/helm-chart/templates/fpm/secret.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "fpm" . }} + labels: + {{- include "labels" . | nindent 4 }} +type: Opaque +data: + APP_SECRET: {{ .Values.global.fpm.secret | b64enc | quote }} \ No newline at end of file diff --git a/helm-chart/templates/nginx/configmap.yaml b/helm-chart/templates/nginx/configmap.yaml new file mode 100644 index 0000000..ee7174b --- /dev/null +++ b/helm-chart/templates/nginx/configmap.yaml @@ -0,0 +1,37 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ .Values.nginx.existingServerBlockConfigmap }} + labels: + {{- include "labels" . | nindent 4 }} +data: + server.conf: | + server { + listen 0.0.0.0:8080; + + root /symfony/public; + + location / { + # try to serve file directly, fallback to index.php + try_files $uri /index.php$is_args$args; + } + + location ~ ^/index\.php(/|$) { + fastcgi_pass 0.0.0.0:9000; + + fastcgi_split_path_info ^(.+\.php)(/.*)$; + include fastcgi_params; + + fastcgi_param DOCUMENT_ROOT $realpath_root; + fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; + + internal; + } + + location /status { + stub_status on; + access_log off; + allow 127.0.0.1; + deny all; + } + } diff --git a/helm-chart/values.yaml b/helm-chart/values.yaml new file mode 100644 index 0000000..10c8c40 --- /dev/null +++ b/helm-chart/values.yaml @@ -0,0 +1,59 @@ +# Use this set to assign a list of default pullSecrets +# - name: docker-registry-secret +# - name: internal-registry-secret +global: + fpm: + image: + repository: vuongxuongminh/docker-helm-symfony + tag: prod + pullSecrets: [] + pullPolicy: Always + env: 'prod' + debug: '0' + secret: '!ChangeMe!' + trustedHosts: '^.*\\.example$' + trustedProxies: + - 10.0.0.0/8 + - 172.16.0.0/12 + - 192.168.0.0/16 + +nginx: + replicaCount: 1 + existingServerBlockConfigmap: nginx-server-block + extraVolumes: + - name: bundle-assets + emptyDir: {} + extraVolumeMounts: + - name: bundle-assets + mountPath: /symfony/public/bundles/ + sidecars: + - name: fpm + image: '{{ .Values.global.fpm.image.repository }}:{{ .Values.global.fpm.image.tag }}' + imagePullPolicy: '{{ .Values.global.fpm.image.pullPolicy }}' + command: + - docker-entrypoint + args: + - fpm + livenessProbe: + exec: + command: + - docker-healthcheck + initialDelaySeconds: 10 + periodSeconds: 5 + readinessProbe: + exec: + command: + - docker-healthcheck + initialDelaySeconds: 10 + timeoutSeconds: 5 + envFrom: + - configMapRef: + name: '{{ template "fpm" . }}' + - secretRef: + name: '{{ template "fpm" . }}' + ports: + - name: fpm + containerPort: 9000 + volumeMounts: + - name: bundle-assets + mountPath: /symfony/public/bundles/ \ No newline at end of file diff --git a/helm/symfony/Chart.lock b/helm/symfony/Chart.lock deleted file mode 100644 index 1332320..0000000 --- a/helm/symfony/Chart.lock +++ /dev/null @@ -1,9 +0,0 @@ -dependencies: -- name: mysql - repository: https://charts.helm.sh/stable - version: 1.6.9 -- name: rabbitmq - repository: https://charts.bitnami.com/bitnami - version: 6.18.9 -digest: sha256:8b1b4689a2d032e29dace81ca0f14e04af465470f990361d5502478caedbdd7f -generated: "2020-12-01T23:40:27.008321715+07:00" diff --git a/helm/symfony/templates/fpm/deployment.yaml b/helm/symfony/templates/fpm/deployment.yaml deleted file mode 100644 index 94a9db7..0000000 --- a/helm/symfony/templates/fpm/deployment.yaml +++ /dev/null @@ -1,73 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "fpm" . }} - labels: - {{- include "labels" . | nindent 4 }} - component: fpm -spec: - replicas: {{ .Values.php.fpm.replicaCount }} - selector: - matchLabels: - {{- include "matchLabels" . | nindent 6 }} - component: fpm - template: - metadata: - labels: - {{- include "labels" . | nindent 8 }} - component: fpm - {{- with .Values.php.fpm.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: fpm - image: {{ .Values.php.image.repository }}:{{ .Values.php.image.tag }} - imagePullPolicy: {{ .Values.imagePullPolicy }} - command: - - docker-entrypoint - args: - - fpm - livenessProbe: - exec: - command: - - docker-healthcheck - - fpm - initialDelaySeconds: 30 - periodSeconds: 5 - readinessProbe: - exec: - command: - - docker-healthcheck - - fpm - initialDelaySeconds: 10 - timeoutSeconds: 5 - envFrom: - - configMapRef: - name: {{ template "php" . }} - - secretRef: - name: {{ template "php" . }} - {{- with .Values.php.fpm.resources }} - resources: - {{- toYaml . | nindent 10 }} - {{- end }} - ports: - - containerPort: 9000 - name: fpm - {{- with .Values.php.fpm.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.php.fpm.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.php.fpm.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} \ No newline at end of file diff --git a/helm/symfony/templates/fpm/service.yaml b/helm/symfony/templates/fpm/service.yaml deleted file mode 100644 index 7198bf5..0000000 --- a/helm/symfony/templates/fpm/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "fpm" . }} - labels: - {{- include "labels" . | nindent 4 }} -spec: - type: ClusterIP - ports: - - name: fpm - port: 9000 - targetPort: 9000 - selector: - {{- include "matchLabels" . | nindent 4 }} - component: fpm \ No newline at end of file diff --git a/helm/symfony/templates/hook/job.yaml b/helm/symfony/templates/hook/job.yaml deleted file mode 100644 index 9e60f3f..0000000 --- a/helm/symfony/templates/hook/job.yaml +++ /dev/null @@ -1,42 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: {{ template "hook" . }} - labels: - {{- include "labels" . | nindent 4 }} - annotations: - # This is what defines this resource as a hook. Without this line, the - # job is considered part of the release. - "helm.sh/hook": "post-install,post-upgrade" - "helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded" - "helm.sh/hook-weight": "0" -spec: - # Because if we use internal database, in first time install chart database need time to boot up for that reason job may be fail, - # we should give it retry more time. - backoffLimit: 5 - template: - metadata: - labels: - {{- include "labels" . | nindent 8 }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - restartPolicy: Never - containers: - - name: job - image: "{{ .Values.php.image.repository }}:{{ .Values.php.image.tag }}" - command: - - docker-entrypoint - args: - - "bin/console" - - "doctrine:migrations:migrate" - - "latest" - - "--no-interaction" - - "--allow-no-migration" - envFrom: - - configMapRef: - name: {{ template "php" . }} - - secretRef: - name: {{ template "php" . }} \ No newline at end of file diff --git a/helm/symfony/templates/ingress/ingress.yaml b/helm/symfony/templates/ingress/ingress.yaml deleted file mode 100644 index f536f95..0000000 --- a/helm/symfony/templates/ingress/ingress.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: networking.k8s.io/v1beta1 -kind: Ingress -metadata: - name: ingress - labels: - {{- include "labels" . | nindent 4 }} - component: ingress - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if .Values.ingress.tls }} - tls: - - hosts: - - {{ .Values.ingress.nginx.hostName | quote }} - secretName: {{ .Values.ingress.nginx.tlsSecret | quote }} - - hosts: - - {{ .Values.ingress.supervisor.hostName | quote }} - secretName: {{ .Values.ingress.supervisor.tlsSecret | quote }} -{{- end }} - rules: - - http: - paths: - - path: / - backend: - serviceName: {{ template "nginx" . }} - servicePort: 80 - host: {{ .Values.ingress.nginx.hostName | quote }} - - http: - paths: - - path: / - backend: - serviceName: {{ template "supervisor" . }} - servicePort: 9000 - host: {{ .Values.ingress.supervisor.hostName | quote }} \ No newline at end of file diff --git a/helm/symfony/templates/nginx/deployment.yaml b/helm/symfony/templates/nginx/deployment.yaml deleted file mode 100644 index 12b38f7..0000000 --- a/helm/symfony/templates/nginx/deployment.yaml +++ /dev/null @@ -1,65 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "nginx" . }} - labels: - {{- include "labels" . | nindent 4 }} - component: nginx -spec: - replicas: {{ .Values.nginx.replicaCount }} - selector: - matchLabels: - {{- include "matchLabels" . | nindent 6 }} - component: nginx - template: - metadata: - labels: - {{- include "labels" . | nindent 8 }} - component: nginx - {{- with .Values.nginx.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: supervisor - image: {{ .Values.nginx.image.repository }}:{{ .Values.nginx.image.tag }} - imagePullPolicy: {{ .Values.imagePullPolicy }} - livenessProbe: - exec: - command: - - docker-healthcheck - initialDelaySeconds: 30 - periodSeconds: 5 - readinessProbe: - exec: - command: - - docker-healthcheck - initialDelaySeconds: 10 - timeoutSeconds: 5 - env: - - name: FPM_SERVICE - value: {{ template "fpm" . }} - {{- with .Values.nginx.resources }} - resources: - {{- toYaml . | nindent 10 }} - {{- end }} - ports: - - containerPort: 80 - name: http - {{- with .Values.nginx.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.nginx.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.nginx.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} \ No newline at end of file diff --git a/helm/symfony/templates/nginx/service.yaml b/helm/symfony/templates/nginx/service.yaml deleted file mode 100644 index dcd6475..0000000 --- a/helm/symfony/templates/nginx/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "nginx" . }} - labels: - {{- include "labels" . | nindent 4 }} -spec: - type: ClusterIP - ports: - - name: http - port: 80 - targetPort: 80 - selector: - {{- include "matchLabels" . | nindent 4 }} - component: nginx diff --git a/helm/symfony/templates/php/configmap.yaml b/helm/symfony/templates/php/configmap.yaml deleted file mode 100644 index 1a98812..0000000 --- a/helm/symfony/templates/php/configmap.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "php" . }} - labels: - {{- include "labels" . | nindent 4 }} -data: - APP_ENV: {{ .Values.php.env | quote }} - APP_DEBUG: {{ .Values.php.debug | quote }} - TRUSTED_HOSTS: {{ .Values.php.trustedHosts | quote }} - TRUSTED_PROXIES: {{ join "," .Values.php.trustedProxies | quote }} \ No newline at end of file diff --git a/helm/symfony/templates/php/secret.yaml b/helm/symfony/templates/php/secret.yaml deleted file mode 100644 index 275a749..0000000 --- a/helm/symfony/templates/php/secret.yaml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "php" . }} - labels: - {{- include "labels" . | nindent 4 }} -type: Opaque -data: - APP_SECRET: {{ .Values.php.secret | b64enc | quote }} - DATABASE_URL: {{ include "databaseDsn" . | b64enc | quote }} - MESSENGER_TRANSPORT_DSN: {{ include "messengerTransportDsn" . | b64enc | quote }} \ No newline at end of file diff --git a/helm/symfony/templates/supervisor/deployment.yaml b/helm/symfony/templates/supervisor/deployment.yaml deleted file mode 100644 index 095f3a6..0000000 --- a/helm/symfony/templates/supervisor/deployment.yaml +++ /dev/null @@ -1,75 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "supervisor" . }} - labels: - {{- include "labels" . | nindent 4 }} - component: supervisor -spec: - replicas: {{ .Values.php.supervisor.replicaCount }} - selector: - matchLabels: - {{- include "matchLabels" . | nindent 6 }} - component: supervisor - template: - metadata: - labels: - {{- include "labels" . | nindent 8 }} - component: supervisor - {{- with .Values.php.supervisor.podAnnotations }} - annotations: - {{- toYaml . | nindent 8 }} - {{- end }} - spec: - {{- with .Values.imagePullSecrets }} - imagePullSecrets: - {{- toYaml . | nindent 8 }} - {{- end }} - containers: - - name: supervisor - image: {{ .Values.php.image.repository }}:{{ .Values.php.image.tag }} - imagePullPolicy: {{ .Values.imagePullPolicy }} - command: - - docker-entrypoint - args: - - supervisor - livenessProbe: - exec: - command: - - docker-healthcheck - - supervisor - initialDelaySeconds: 30 - periodSeconds: 5 - readinessProbe: - exec: - command: - - docker-healthcheck - - supervisor - initialDelaySeconds: 10 - timeoutSeconds: 5 - envFrom: - - configMapRef: - name: {{ template "php" . }} - - secretRef: - name: {{ template "php" . }} - - secretRef: - name: {{ template "supervisor" . }} - {{- with .Values.php.supervisor.resources }} - resources: - {{- toYaml . | nindent 10 }} - {{- end }} - ports: - - containerPort: 9000 - name: supervisor - {{- with .Values.php.supervisor.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.php.supervisor.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.php.supervisor.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} \ No newline at end of file diff --git a/helm/symfony/templates/supervisor/secret.yaml b/helm/symfony/templates/supervisor/secret.yaml deleted file mode 100644 index f269f6a..0000000 --- a/helm/symfony/templates/supervisor/secret.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "supervisor" . }} - labels: - {{- include "labels" . | nindent 4 }} -type: Opaque -data: - SUPERVISOR_USERNAME: {{ .Values.php.supervisor.basicAuth.username | b64enc | quote }} - SUPERVISOR_PASSWORD: {{ .Values.php.supervisor.basicAuth.password | b64enc | quote }} \ No newline at end of file diff --git a/helm/symfony/templates/supervisor/service.yaml b/helm/symfony/templates/supervisor/service.yaml deleted file mode 100644 index 15073ae..0000000 --- a/helm/symfony/templates/supervisor/service.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "supervisor" . }} - labels: - {{- include "labels" . | nindent 4 }} -spec: - type: ClusterIP - ports: - - name: supervisor - port: 9000 - targetPort: 9000 - selector: - {{- include "matchLabels" . | nindent 4 }} - component: supervisor \ No newline at end of file diff --git a/helm/symfony/values.yaml b/helm/symfony/values.yaml deleted file mode 100644 index c7e5809..0000000 --- a/helm/symfony/values.yaml +++ /dev/null @@ -1,125 +0,0 @@ -# Use this set to assign a list of default pullSecrets -# - name: docker-registry-secret -# - name: internal-registry-secret -imagePullSecrets: [] - -imagePullPolicy: Always - -php: - image: - repository: vuongxuongminh/docker-helm-symfony-php - tag: prod - supervisor: - basicAuth: - username: 'user' - password: '!ChangeMe!' - replicaCount: 1 - nodeSelector: {} - tolerations: [] - affinity: {} - ## Additional deployment annotations - podAnnotations: {} - resources: {} - # requests: - # cpu: 100m - # memory: 256Mi - fpm: - replicaCount: 1 - nodeSelector: {} - tolerations: [] - affinity: {} - ## Additional deployment annotations - podAnnotations: {} - resources: {} - # requests: - # cpu: 100m - # memory: 256Mi - env: 'prod' - debug: '0' - secret: '!ChangeMe!' - trustedHosts: '^.*\\.example$' - trustedProxies: - - 10.0.0.0/8 - - 172.16.0.0/12 - - 192.168.0.0/16 - -nginx: - image: - repository: vuongxuongminh/docker-helm-symfony-nginx - tag: prod - replicaCount: 1 - nodeSelector: {} - tolerations: [] - affinity: {} - ## Additional deployment annotations - podAnnotations: {} - resources: {} - # requests: - # cpu: 100m - # memory: 256Mi - -ingress: - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - tls: false - nginx: - hostName: 'nginx.example' - # Tls secret name only affect when `tls` bellow is true. - tlsSecret: 'nginx-tls' - supervisor: - hostName: 'supervisor.example' - # Tls secret name only affect when `tls` bellow is true. - tlsSecret: 'supervisor-tls' - -mysql: - internal: true - # TODO: Move it to _helpers.tpl when issue: https://github.com/helm/helm/issues/3920 solved - fullnameOverride: 'sub-chart-mysql' - mysqlDatabase: test - mysqlUser: user - mysqlPassword: '!ChangeMe!' -# mysqlRootPassword: 'root' - # Persist data to a persistent volume - persistence: - enabled: false - nodeSelector: {} - tolerations: [] - ## Additional deployment annotations - podAnnotations: {} - resources: {} - # See more config at https://github.com/helm/charts/tree/master/stable/mysql - - # Set when you want to use external MySQL. Affect only `mysql.internal` is false. - externalDsn: '' - -rabbitmq: - internal: true - # TODO: Move it to _helpers.tpl when issue: https://github.com/helm/helm/issues/3920 solved - fullnameOverride: 'sub-chart-rabbitmq' - updateStrategy: - type: 'OnDelete' - persistence: - enabled: false - service: - port: 5672 - rabbitmq: - username: user - password: '!ChangeMe!' - ingress: - enabled: true - tls: false - # Tls secret only affect when `tls` bellow is true. - tlsSecret: 'rabbitmq-tls' - hostName: 'rabbitmq.example' - annotations: {} - nodeSelector: {} - tolerations: [] - affinity: {} - ## Additional deployment annotations - podAnnotations: {} - resources: {} - # See more config at https://github.com/bitnami/charts/blob/master/bitnami/rabbitmq - - # Set when you want to use external RabbitMQ. Affect only `rabbitmq.internal` is false. - externalDsn: '' \ No newline at end of file From f48f14a55b2c5e0063876d486d712c099c70c319 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 30 Apr 2021 00:29:18 +0700 Subject: [PATCH 3/9] Refactor Helm chart. --- helm-chart/values.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/helm-chart/values.yaml b/helm-chart/values.yaml index 10c8c40..8afeda6 100644 --- a/helm-chart/values.yaml +++ b/helm-chart/values.yaml @@ -1,6 +1,3 @@ -# Use this set to assign a list of default pullSecrets -# - name: docker-registry-secret -# - name: internal-registry-secret global: fpm: image: From 2d2c01aaca0ffbf51f00cb365fc94f8eaa301726 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 30 Apr 2021 00:45:42 +0700 Subject: [PATCH 4/9] Clean up. --- docker-compose.override.yaml | 1 - docker/fpm/Dockerfile | 2 +- docker/fpm/docker-entrypoint.sh | 16 +++++++--------- helm-chart/templates/NOTES.txt | 7 ------- helm-chart/values.yaml | 2 +- 5 files changed, 9 insertions(+), 19 deletions(-) delete mode 100644 helm-chart/templates/NOTES.txt diff --git a/docker-compose.override.yaml b/docker-compose.override.yaml index 1a69d0b..693299f 100644 --- a/docker-compose.override.yaml +++ b/docker-compose.override.yaml @@ -69,6 +69,5 @@ services: command: -config.file=/etc/promtail/config.yaml volumes: - db-data: {} grafana-data: {} log-data: {} \ No newline at end of file diff --git a/docker/fpm/Dockerfile b/docker/fpm/Dockerfile index 8876430..08f08d7 100644 --- a/docker/fpm/Dockerfile +++ b/docker/fpm/Dockerfile @@ -27,7 +27,7 @@ RUN set -exu; \ fi; \ rm /usr/local/bin/install-php-extensions; -COPY /docker/php/conf.d/$APP_ENV.ini $PHP_INI_DIR/conf.d/config.ini +COPY /docker/fpm/conf.d/$APP_ENV.ini $PHP_INI_DIR/conf.d/config.ini WORKDIR /symfony diff --git a/docker/fpm/docker-entrypoint.sh b/docker/fpm/docker-entrypoint.sh index 0718d0d..70d3aed 100644 --- a/docker/fpm/docker-entrypoint.sh +++ b/docker/fpm/docker-entrypoint.sh @@ -1,16 +1,12 @@ #!/bin/sh set -e -if [ "$1" = 'fpm' ] || [ "$1" = 'setup' ]; then - mkdir -p /symfony/var/cache /symfony/var/log +mkdir -p /symfony/var/cache /symfony/var/log - setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX /symfony/var - setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX /symfony/var +setfacl -R -m u:www-data:rwX -m u:"$(whoami)":rwX /symfony/var +setfacl -dR -m u:www-data:rwX -m u:"$(whoami)":rwX /symfony/var - - if [ "$1" = 'fpm' ]; then - set -- php-fpm - elif [ "$1" = 'setup' ]; then +if [ "$1" = 'setup' ]; then umask 0000 # First time we need to create project @@ -25,8 +21,10 @@ if [ "$1" = 'fpm' ] || [ "$1" = 'setup' ]; then composer install --prefer-dist --no-progress --no-interaction exit 0 - fi +fi +if [ "$1" = 'fpm' ]; then + set -- php-fpm fi exec docker-php-entrypoint "$@" \ No newline at end of file diff --git a/helm-chart/templates/NOTES.txt b/helm-chart/templates/NOTES.txt deleted file mode 100644 index 01d9e68..0000000 --- a/helm-chart/templates/NOTES.txt +++ /dev/null @@ -1,7 +0,0 @@ -Now you can access: - -Your Symfony app: {{ .Values.ingress.nginx.hostName }} -Supervisor management: {{ .Values.ingress.supervisor.hostName }} -{{- if .Values.rabbitmq.ingress.enabled }} -RabbitMQ management: {{ .Values.rabbitmq.ingress.hostName }} -{{- end }} \ No newline at end of file diff --git a/helm-chart/values.yaml b/helm-chart/values.yaml index 8afeda6..15ee4f9 100644 --- a/helm-chart/values.yaml +++ b/helm-chart/values.yaml @@ -4,7 +4,7 @@ global: repository: vuongxuongminh/docker-helm-symfony tag: prod pullSecrets: [] - pullPolicy: Always + pullPolicy: IfNotPresent env: 'prod' debug: '0' secret: '!ChangeMe!' From 4cc48eba83c11d54cc60fa285bfe2640673cf280 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 30 Apr 2021 13:33:04 +0700 Subject: [PATCH 5/9] Minimal dependencies. --- .gitattributes | 3 +- .../workflows/{dockerpublish.yml => ci.yaml} | 38 +++--- docker-compose.override.yaml | 42 +------ docker/fpm/Dockerfile | 17 +-- .../{dev.ini => custom.ini-development} | 0 .../{prod.ini => custom.ini-production} | 0 docker/grafana/dashboards/dashboards.yaml | 9 -- docker/grafana/dashboards/default.json | 108 ------------------ docker/grafana/datasources/loki.yaml | 9 -- docker/promtail/config.yaml | 28 ----- helm-chart/Chart.lock | 6 +- helm-chart/values.yaml | 25 ++-- screenshots/dashboard.png | Bin 38710 -> 0 bytes 13 files changed, 58 insertions(+), 227 deletions(-) rename .github/workflows/{dockerpublish.yml => ci.yaml} (50%) rename docker/fpm/conf.d/{dev.ini => custom.ini-development} (100%) rename docker/fpm/conf.d/{prod.ini => custom.ini-production} (100%) delete mode 100644 docker/grafana/dashboards/dashboards.yaml delete mode 100644 docker/grafana/dashboards/default.json delete mode 100644 docker/grafana/datasources/loki.yaml delete mode 100644 docker/promtail/config.yaml delete mode 100644 screenshots/dashboard.png diff --git a/.gitattributes b/.gitattributes index 9377e98..7c8cbb0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,2 @@ /.github export-ignore -/.gitattributes export-ignore -/screenshots export-ignore \ No newline at end of file +/.gitattributes export-ignore \ No newline at end of file diff --git a/.github/workflows/dockerpublish.yml b/.github/workflows/ci.yaml similarity index 50% rename from .github/workflows/dockerpublish.yml rename to .github/workflows/ci.yaml index 6036a20..d2726c3 100644 --- a/.github/workflows/dockerpublish.yml +++ b/.github/workflows/ci.yaml @@ -1,32 +1,40 @@ -name: Docker +name: CI + +on: push -on: - push: - branches: - - master env: - PHP_IMAGE: vuongxuongminh/docker-helm-symfony-php - NGINX_IMAGE: vuongxuongminh/docker-helm-symfony-nginx + IMAGE: vuongxuongminh/docker-helm-symfony jobs: - # Run tests. - # See also https://docs.docker.com/docker-hub/builds/automated-testing/ + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Run setup + run: docker-compose run --rm setup + - name: Up services + run: docker-compose up -d + - name: Wait seconds + run: sleep 5 + - name: Test with curl + run: curl http://localhost | grep "Welcome to Symfony!" build: + if: ${{ github.ref == 'refs/heads/main' }} + needs: [test-setup] runs-on: ubuntu-latest - steps: - uses: actions/checkout@v2 - name: Log into registry run: echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u ${{ github.actor }} --password-stdin - + - name: Build images run: | - docker-compose -f docker-compose.yaml -f docker-compose.override.yaml build - docker-compose -f docker-compose.yaml -f docker-compose.prod.yaml build + docker-compose -f docker-compose.yaml -f docker-compose.override.yaml build fpm + docker-compose -f docker-compose.yaml -f docker-compose.prod.yaml build fpm - name: Push image run: | - docker-compose -f docker-compose.yaml -f docker-compose.override.yaml push - docker-compose -f docker-compose.yaml -f docker-compose.prod.yaml push + docker-compose -f docker-compose.yaml -f docker-compose.override.yaml push fpm + docker-compose -f docker-compose.yaml -f docker-compose.prod.yaml push fpm diff --git a/docker-compose.override.yaml b/docker-compose.override.yaml index 693299f..bddf6e9 100644 --- a/docker-compose.override.yaml +++ b/docker-compose.override.yaml @@ -13,14 +13,14 @@ services: command: ['setup'] build: context: . - dockerfile: ./docker/php/Dockerfile + dockerfile: ./docker/fpm/Dockerfile cache_from: *build-cache args: << : *build-args environment: << : *build-args volumes: - - ./symfony:/symfony:rw + - ./symfony:/symfony fpm: image: ${PHP_IMAGE:-vuongxuongminh/docker-helm-symfony-php}:dev @@ -31,43 +31,9 @@ services: environment: << : *build-args volumes: - - ./symfony:/symfony:rw,cached - - log-data:/symfony/var/log:rw + - ./symfony:/symfony nginx: volumes: - - ./symfony/public:/symfony/public:rw,cached + - ./symfony/public:/symfony/public - ./docker/nginx/default.conf:/opt/bitnami/nginx/conf/server_blocks/default.conf:ro - - grafana: - image: grafana/grafana - environment: - GF_SECURITY_ADMIN_USER: admin - GF_SECURITY_ADMIN_PASSWORD: admin - volumes: - - grafana-data:/var/lib/grafana - - ./docker/grafana/datasources:/etc/grafana/provisioning/datasources:ro - - ./docker/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro - depends_on: - - promtail - ports: - - target: 3000 - published: 3000 - protocol: tcp - - loki: - image: grafana/loki - command: -config.file=/etc/loki/local-config.yaml - - promtail: - image: grafana/promtail - depends_on: - - loki - volumes: - - log-data:/app/var/log - - ./docker/promtail:/etc/promtail:ro - command: -config.file=/etc/promtail/config.yaml - -volumes: - grafana-data: {} - log-data: {} \ No newline at end of file diff --git a/docker/fpm/Dockerfile b/docker/fpm/Dockerfile index 08f08d7..db4c9ab 100644 --- a/docker/fpm/Dockerfile +++ b/docker/fpm/Dockerfile @@ -15,31 +15,31 @@ COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr ARG APP_ENV ARG APP_DEBUG +COPY /docker/fpm/conf.d/ $PHP_INI_DIR/conf.d/ + RUN set -exu; \ - install-php-extensions gd intl zip pcntl apcu opcache @composer; \ - if [ "${APP_DEBUG}" = "1" ]; then \ - install-php-extensions xdebug; \ - fi; \ if [ "${APP_ENV}" = "dev" ]; then \ ln -sf $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini; \ + ln -sf $PHP_INI_DIR/conf.d/custom.ini-development $PHP_INI_DIR/custom.ini; \ else \ ln -sf $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini; \ + ln -sf $PHP_INI_DIR/conf.d/custom.ini-production $PHP_INI_DIR/custom.ini; \ fi; \ + install-php-extensions gd intl zip pcntl apcu opcache @composer; \ rm /usr/local/bin/install-php-extensions; -COPY /docker/fpm/conf.d/$APP_ENV.ini $PHP_INI_DIR/conf.d/config.ini - WORKDIR /symfony ## Remove it and copy your source here. -RUN if [ "${APP_ENV}" = 'prod' ]; then \ +RUN if [ "${APP_ENV}" = "prod" ]; then \ composer create-project symfony/skeleton . --prefer-dist --no-dev --no-progress --no-interaction; \ else \ composer create-project symfony/skeleton . --prefer-dist --no-progress --no-interaction; \ fi RUN mkdir -p var/cache var/log; -RUN if [ "${APP_ENV}" = 'prod' ]; then \ + +RUN if [ "${APP_ENV}" = "prod" ]; then \ composer install --prefer-dist --no-dev --no-scripts --no-progress --no-suggest; \ composer dump-autoload --classmap-authoritative --no-dev; \ else \ @@ -64,4 +64,5 @@ COPY /docker/fpm/docker-healthcheck.sh /usr/local/bin/docker-healthcheck RUN chmod +x /usr/local/bin/docker-entrypoint /usr/local/bin/docker-healthcheck ENTRYPOINT ["docker-entrypoint"] + CMD ["fpm"] \ No newline at end of file diff --git a/docker/fpm/conf.d/dev.ini b/docker/fpm/conf.d/custom.ini-development similarity index 100% rename from docker/fpm/conf.d/dev.ini rename to docker/fpm/conf.d/custom.ini-development diff --git a/docker/fpm/conf.d/prod.ini b/docker/fpm/conf.d/custom.ini-production similarity index 100% rename from docker/fpm/conf.d/prod.ini rename to docker/fpm/conf.d/custom.ini-production diff --git a/docker/grafana/dashboards/dashboards.yaml b/docker/grafana/dashboards/dashboards.yaml deleted file mode 100644 index 4adc55a..0000000 --- a/docker/grafana/dashboards/dashboards.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: 1 - -providers: - - name: dashboards - type: file - updateIntervalSeconds: 30 - options: - path: /etc/grafana/provisioning/dashboards - foldersFromFilesStructure: true \ No newline at end of file diff --git a/docker/grafana/dashboards/default.json b/docker/grafana/dashboards/default.json deleted file mode 100644 index e642a19..0000000 --- a/docker/grafana/dashboards/default.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": 1, - "links": [], - "panels": [ - { - "datasource": "Loki", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 4, - "options": { - "showLabels": false, - "showTime": false, - "sortOrder": "Descending", - "wrapLogMessage": false - }, - "pluginVersion": "7.3.2", - "targets": [ - { - "expr": "{container=\"supervisor\"} | json | level=\"500\"", - "legendFormat": "", - "queryType": "randomWalk", - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Supervisor error logs", - "type": "logs" - }, - { - "datasource": "Loki", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 2, - "options": { - "showLabels": false, - "showTime": false, - "sortOrder": "Descending", - "wrapLogMessage": false - }, - "pluginVersion": "7.3.2", - "targets": [ - { - "expr": "{container=\"fpm\"} | json | level=\"500\"", - "legendFormat": "", - "queryType": "randomWalk", - "refId": "A" - } - ], - "timeFrom": null, - "timeShift": null, - "title": "FPM error logs", - "type": "logs" - } - ], - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-6h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Dashboard", - "uid": "7W_RWMAMz", - "version": 3 -} \ No newline at end of file diff --git a/docker/grafana/datasources/loki.yaml b/docker/grafana/datasources/loki.yaml deleted file mode 100644 index 23e6367..0000000 --- a/docker/grafana/datasources/loki.yaml +++ /dev/null @@ -1,9 +0,0 @@ -apiVersion: 1 - -datasources: - - name: Loki - type: loki - access: proxy - url: http://loki:3100 - jsonData: - maxLines: 1000 \ No newline at end of file diff --git a/docker/promtail/config.yaml b/docker/promtail/config.yaml deleted file mode 100644 index bb95cb0..0000000 --- a/docker/promtail/config.yaml +++ /dev/null @@ -1,28 +0,0 @@ -server: - http_listen_port: 9080 - grpc_listen_port: 0 - -positions: - filename: /tmp/positions.yaml - -clients: - - url: http://loki:3100/loki/api/v1/push - -scrape_configs: - - job_name: local - static_configs: - - targets: - - localhost - labels: - container: supervisor - __path__: /var/log/supervisor/*log - - targets: - - localhost - labels: - container: fpm - __path__: /var/log/fpm/*log - - targets: - - localhost - labels: - container: nginx - __path__: /var/log/nginx/*log \ No newline at end of file diff --git a/helm-chart/Chart.lock b/helm-chart/Chart.lock index 36e3808..ba118be 100644 --- a/helm-chart/Chart.lock +++ b/helm-chart/Chart.lock @@ -1,6 +1,6 @@ dependencies: - name: nginx repository: https://charts.bitnami.com/bitnami - version: 8.8.4 -digest: sha256:389516a07dd11fc4af3fe93c67e99559ac2652a3886d07a80dbb1d9b05895788 -generated: "2021-04-29T23:59:03.530114366+07:00" + version: 8.8.5 +digest: sha256:3f27710a56ef2c508e09111dc1b3ac3dd92e5d0f33e6dcf502f0237a3fbf1a20 +generated: "2021-04-30T09:53:15.152606796+07:00" diff --git a/helm-chart/values.yaml b/helm-chart/values.yaml index 15ee4f9..bf2752e 100644 --- a/helm-chart/values.yaml +++ b/helm-chart/values.yaml @@ -18,19 +18,30 @@ nginx: replicaCount: 1 existingServerBlockConfigmap: nginx-server-block extraVolumes: - - name: bundle-assets + - name: asset-bundles emptyDir: {} extraVolumeMounts: - - name: bundle-assets + - name: asset-bundles mountPath: /symfony/public/bundles/ + initContainers: + - name: publish-asset-bundles + image: '{{ .Values.global.fpm.image.repository }}:{{ .Values.global.fpm.image.tag }}' + imagePullPolicy: '{{ .Values.global.fpm.image.pullPolicy }}' + args: + - composer + - auto-scripts + envFrom: + - configMapRef: + name: '{{ template "fpm" . }}' + - secretRef: + name: '{{ template "fpm" . }}' + volumeMounts: + - name: asset-bundles + mountPath: /symfony/public/bundles/ sidecars: - name: fpm image: '{{ .Values.global.fpm.image.repository }}:{{ .Values.global.fpm.image.tag }}' imagePullPolicy: '{{ .Values.global.fpm.image.pullPolicy }}' - command: - - docker-entrypoint - args: - - fpm livenessProbe: exec: command: @@ -52,5 +63,5 @@ nginx: - name: fpm containerPort: 9000 volumeMounts: - - name: bundle-assets + - name: asset-bundles mountPath: /symfony/public/bundles/ \ No newline at end of file diff --git a/screenshots/dashboard.png b/screenshots/dashboard.png deleted file mode 100644 index 94a2d1169a801525ddc2f94b80bbd4f6092d57c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38710 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 Date: Fri, 30 Apr 2021 13:35:29 +0700 Subject: [PATCH 6/9] Fix CI job name. --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d2726c3..f48ecee 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ jobs: run: curl http://localhost | grep "Welcome to Symfony!" build: if: ${{ github.ref == 'refs/heads/main' }} - needs: [test-setup] + needs: [test] runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 From a0ddeaae5f8b2e9c48e790f1422755b8bfbe70c4 Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 30 Apr 2021 13:47:16 +0700 Subject: [PATCH 7/9] Change docker image env. --- docker-compose.override.yaml | 6 +++--- docker-compose.prod.yaml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docker-compose.override.yaml b/docker-compose.override.yaml index bddf6e9..fbe1b6e 100644 --- a/docker-compose.override.yaml +++ b/docker-compose.override.yaml @@ -5,11 +5,11 @@ x-build: APP_ENV: 'dev' APP_DEBUG: '1' - &build-cache - - ${SYMFONY_IMAGE:-vuongxuongminh/docker-helm-symfony}:dev + - ${IMAGE:-vuongxuongminh/docker-helm-symfony}:dev services: setup: - image: ${SYMFONY_IMAGE:-vuongxuongminh/docker-helm-symfony}:dev + image: ${IMAGE:-vuongxuongminh/docker-helm-symfony}:dev command: ['setup'] build: context: . @@ -23,7 +23,7 @@ services: - ./symfony:/symfony fpm: - image: ${PHP_IMAGE:-vuongxuongminh/docker-helm-symfony-php}:dev + image: ${IMAGE:-vuongxuongminh/docker-helm-symfony-php}:dev build: cache_from: *build-cache args: diff --git a/docker-compose.prod.yaml b/docker-compose.prod.yaml index 5857716..567391b 100644 --- a/docker-compose.prod.yaml +++ b/docker-compose.prod.yaml @@ -5,11 +5,11 @@ x-build: APP_ENV: 'prod' APP_DEBUG: '0' - &build-cache - - ${SYMFONY_IMAGE:-vuongxuongminh/docker-helm-symfony}:prod + - ${IMAGE:-vuongxuongminh/docker-helm-symfony}:prod services: fpm: - image: ${SYMFONY_IMAGE:-vuongxuongminh/docker-helm-symfony}:prod + image: ${IMAGE:-vuongxuongminh/docker-helm-symfony}:prod build: cache_from: *build-cache args: From 018cfeeffcc8a59594533b1d2a2a679c3f39bc0e Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 30 Apr 2021 14:18:12 +0700 Subject: [PATCH 8/9] Update doc. --- README.md | 145 ++++-------------------- docker-compose.yaml | 6 +- helm-chart/templates/fpm/configmap.yaml | 4 +- helm-chart/values.yaml | 6 - 4 files changed, 27 insertions(+), 134 deletions(-) diff --git a/README.md b/README.md index c7c9890..e4e5ea0 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,10 @@ # Modern containerize template for Symfony -![Build Status](https://github.com/vuongxuongminh/docker-helm-symfony/workflows/Docker/badge.svg) +![Build Status](https://github.com/vuongxuongminh/docker-helm-symfony/workflows/CI/badge.svg) ## About it -This is a clean template base on `symfony/skeleton` (Symfony 5) with common Symfony packages: - -+ Debug (dev env). -+ Mailer. -+ Messenger. -+ ORM. -+ Twig. - -And set of Docker services, include basic Helm chart help you save time and easy to deploy it in your Kubernetes cluster. +This is a clean template base on `symfony/skeleton` project template and set of Docker services, include basic Helm chart help you save time and easy to deploy it in your Kubernetes cluster. ## Prerequisites @@ -28,7 +20,8 @@ Start by downloading [distribution .tar.gz file](https://github.com/vuongxuongmi After download and extract, open a terminal, and navigate to the directory containing your project. Run the following command to start all services using Docker Compose: ```shell script -$ docker-compose pull # Download the latest versions of the pre-built images +$ docker-compose pull # Download the latest versions of the pre-built images. +$ docker-compose run --rm setup # Setup project (first time only). $ docker-compose up -d # Running in detached mode ``` @@ -37,57 +30,29 @@ This starts the following services: | Name | Description | Ports | Environments | |---------------|---------------------------------------------------------------------|------ |--------------| | fpm | FastCGI process manager with PHP-FPM 7.4.12, Composer. | n/a | all | -| supervisor | Process control system with PHP 7.4.12, Supervisor 4.1.0, Composer | 9000 | all | | nginx | Reverse proxy handle request with NGINX 1.17 | 80 | all | | setup | Setup service help run migration & install Composer package | n/a | dev | -| promtail | Ship logs of Nginx & FPM & Supervisor services to Loki | n/a | dev | -| loki | Logs datasource | n/a | dev | -| grafana | Logs visualization | 3000 | dev | -| rabbitmq | Message broker | 15672 | dev | -| mysql | Mysql database server | 3306 | dev | -| mailhog | Mail server mock | 8025 | dev | This results in the following running containers: ```shell script $ docker-compose ps - Name Command State Ports ---------------------------------------------------------------------------------------------------------------------------------------------------------------- -docker-helm-symfony_fpm_1 docker-entrypoint fpm Up (healthy) 9000/tcp -docker-helm-symfony_grafana_1 /run.sh Up 0.0.0.0:3000->3000/tcp -docker-helm-symfony_loki_1 /usr/bin/loki -config.file ... Up 3100/tcp -docker-helm-symfony_mailhog_1 MailHog Up 1025/tcp, 0.0.0.0:8025->8025/tcp -docker-helm-symfony_mysql_1 docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp -docker-helm-symfony_nginx_1 docker-entrypoint nginx -g ... Up (healthy) 0.0.0.0:80->80/tcp -docker-helm-symfony_promtail_1 /usr/bin/promtail -config. ... Up -docker-helm-symfony_rabbitmq_1 docker-entrypoint.sh rabbi ... Up 15671/tcp, 0.0.0.0:15672->15672/tcp, 25672/tcp, 4369/tcp, 5671/tcp, 5672/tcp -docker-helm-symfony_setup_1 docker-entrypoint setup Exit 0 -docker-helm-symfony_supervisor_1 docker-entrypoint supervisor Up (healthy) 0.0.0.0:9000->9000/tcp + Name Command State Ports +------------------------------------------------------------------------------------------------------------ +docker-helm-symfony_fpm_1 docker-entrypoint fpm Up (healthy) +docker-helm-symfony_nginx_1 /opt/bitnami/scripts/nginx ... Up (healthy) 0.0.0.0:80->8080/tcp, 8443/tcp +docker-helm-symfony_setup_1 docker-entrypoint setup Exit 0 ``` -If you want to change a PHP or Nginx version, open `docker-compose.yaml` and add build args: - -+ `PHP_VERSION` for change php version (ex: `PHP_VERSION: '7.3'`). -+ `NGINX_VERSION` for change nginx version (ex: `NGINX_VERSION: '1.16'`). - -Open [Dockerfile](/docker/Dockerfile) to see more build args. - -Now you can visiting: +If you want to change a PHP version, open `docker-compose.yaml` and add build args: -+ Your Symfony app: http://localhost -+ Supervisor: http://localhost:9000 (Username: `root`, Password: `root` you can set it in `docker-compose.override.yaml`) -+ RabbitMQ: http://localhost:15672 (Username: `guest`, Password: `guest` you can set it in `docker-compose.override.yaml`) -+ Grafana: http://localhost:3000/dashboards (Username: `admin`, Password: `admin` you can set it in `docker-compose.override.yaml`) -+ Mailhog: http://localhost:8025 ++ `PHP_VERSION` for change php version (ex: `PHP_VERSION: '7.4'`). -And access MySQL via port 3306 (Username: `root`, Password: `root` you can set it in `docker-compose.override.yaml`) -### Grafana dashboards - -+ Logs visualization +Open [Dockerfile](/docker/Dockerfile) to see more build args. -![Logs visualization](./screenshots/dashboard.png) +Now you can visiting your Symfony app: http://localhost ## Deploy project into Kubernetes cluster @@ -96,13 +61,13 @@ And access MySQL via port 3306 (Username: `root`, Password: `root` you can set i Firstly you need to update helm dependencies by running: ```shell script -$ helm dep update ./helm/symfony +$ helm dep update ./helm-chart/ ``` And install chart: ```shell script -$ helm install app ./helm/symfony +$ helm install app ./helm-chart/ ``` The command deploys your project on the Kubernetes cluster in the default configuration. The [Parameters](#parameters) section lists the parameters that can be configured during installation. @@ -122,79 +87,20 @@ The following table lists the configurable parameters of this chart and their de | Parameter | Description | Default | |----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------| | imagePullSecrets | Docker registry secret names as an array. | `[]` | -| imagePullPolicy | Image pull policy. | `Always` | -| php.image.repository | PHP image name. | `vuongxuongminh/docker-helm-symfony-php` | -| php.image.tag | PHP image tag. | `prod` | -| php.supervisor.basicAuth.username | Supervisor basic auth username. | `user` | -| php.supervisor.basicAuth.password | Supervisor basic auth password. | `!ChangeMe!` | -| php.supervisor.replicaCount | Supervisor replica count. | `1` | -| php.supervisor.nodeSelector | Supervisor node labels for pod assignment. | `{}` | -| php.supervisor.tolerations | Supervisor toleration labels for pod assignment. | `[]` | -| php.supervisor.affinity | Supervisor affinity settings for pod assignment. | `{}` | -| php.supervisor.podAnnotations | Supervisor pod annotations. | `{}` | -| php.supervisor.resources | Supervisor resource needs and limits to apply to the pod. | `{}` | -| php.fpm.replicaCount | FPM replica count. | `1` | -| php.fpm.nodeSelector | FPM node labels for pod assignment. | `{}` | -| php.fpm.tolerations | FPM toleration labels for pod assignment. | `[]` | -| php.fpm.affinity | FPM affinity settings for pod assignment. | `{}` | -| php.fpm.podAnnotations | FPM pod annotations. | `{}` | -| php.fpm.resources | FPM resource needs and limits to apply to the pod. | `{}` | -| php.env | Use to set `APP_ENV` env in Supervisor & FPM containers. | `prod` | -| php.debug | Use to set `APP_DEBUG` env in Supervisor & FPM containers. | `0` | -| php.trustedHosts | Use to set `TRUSTED_HOSTS` env in Supervisor & FPM containers. | `^.*\\.example\\.com$` | -| php.trustedProxies | Use to set `TRUSTED_PROXIES` env in Supervisor & FPM containers. | `[10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16]` list common CIDR default of K8S. | -| nginx.image.repository | Nginx image name. | `vuongxuongminh/docker-helm-symfony-nginx` | -| nginx.image.tag | Nginx image tag. | `prod` | -| nginx.replicaCount | Nginx replica count. | `1` | -| nginx.nodeSelector | Nginx node labels for pod assignment. | `{}` | -| nginx.tolerations | Nginx toleration labels for pod assignment. | `[]` | -| nginx.affinity | Nginx affinity settings for pod assignment. | `{}` | -| nginx.podAnnotations | Nginx pod annotations. | `{}` | -| nginx.resources | Nginx resource needs and limits to apply to the pod. | `{}` | -| ingress.annotations | Ingress annotations. | `{}` | -| ingress.tls | Enable ingress with tls. | `false` | -| ingress.nginx.host | Ingress Nginx host name. | `nginx.example` | -| ingress.nginx.tlsSecret | Ingress Nginx tls secret name. | `nginx-tls` | -| ingress.supervisor.host | Ingress Supervisor host name. | `supervisor.example` | -| ingress.supervisor.tlsSecret | Ingress Supervisor tls secret name. | `supervisor-tls` | -| mysql.internal | Use internal MySQL (sub chart) or not. | `true` | -| mysql.fullnameOverride | MySQL internal fullname. | `sub-chart-mysql` | -| mysql.mysqlDatabase | MySQL internal database name. | `test` | -| mysql.mysqlUser | MySQL internal username. | `user` | -| mysql.mysqlPassword | MySQL internal password. | `!ChangeMe!` | -| mysql.persistence.enabled | MySQL internal use a PVC to persist data. | `false` | -| mysql.nodeSelector | MySQL internal node labels for pod assignment. | `{}` | -| mysql.tolerations | MySQL internal toleration labels for pod assignment. | `[]` | -| mysql.podAnnotations | MySQL internal pod annotations. | `{}` | -| mysql.resources | MySQL internal resource needs and limits to apply to the pod. | `{}` | -| mysql.externalDsn | MySQL externalDsn use to set `DATABASE_URL` env in Supervisor & FPM containers. Use when `mysql.internal` is false. | `''` | -| rabbitmq.internal | Use internal RabbitMQ (sub chart) or not. | `true` | -| rabbitmq.fullnameOverride | RabbitMQ internal fullname. | `sub-chart-rabbitmq` | -| rabbitmq.updateStrategy.type | RabbitMQ internal statefulset update strategy policy. | `OnDelete` | -| rabbitmq.persistence.enabled | RabbitMQ internal use a PVC to persist data. | `false` | -| rabbitmq.service.port | RabbitMQ internal service port. | `5672` | -| rabbitmq.rabbitmq.username | RabbitMQ internal username. | `user` | -| rabbitmq.rabbitmq.password | RabbitMQ internal password. | `!ChangeMe!` | -| rabbitmq.ingress.enabled | RabbitMQ internal enable ingress for management site or not. | `true` | -| rabbitmq.ingress.tls | RabbitMQ internal enable ingress with tls. | `false` | -| rabbitmq.ingress.tlsSecret | RabbitMQ internal ingress tls secret name. | `rabbitmq-tls` | -| rabbitmq.ingress.hostName | RabbitMQ internal ingress host name. | `rabbitmq.example` | -| rabbitmq.ingress.annotations | RabbitMQ internal ingress annotations. | `{}` | -| rabbitmq.nodeSelector | RabbitMQ internal node labels for pod assignment. | `{}` | -| rabbitmq.tolerations | RabbitMQ internal toleration labels for pod assignment. | `[]` | -| rabbitmq.affinity | RabbitMQ internal affinity settings for pod assignment. | `{}` | -| rabbitmq.podAnnotations | RabbitMQ internal pod annotations. | `{}` | -| rabbitmq.resources | RabbitMQ internal resource needs and limits to apply to the pod. | `{}` | -| rabbitmq.externalDsn | RabbitMQ externalDsn use to set `MESSENGER_TRANSPORT_DSN` env in Supervisor & FPM containers. Use when `rabbitmq.internal` is false. | `''` | +| global.fpm.image.repository | Image repo. | `vuongxuongminh/docker-helm-symfony-php` | +| global.fpm.image.tag | Image tag. | `prod` | +| global.fpm.image.pullPolicy | Image pull policy. | `prod` | +| global.fpm.env | Use to set `APP_ENV` env in FPM container. | `prod` | +| global.fpm.debug | Use to set `APP_DEBUG` env in FPM container. | `0` | Specify each parameter using the --set key=value[,key=value] argument to helm install. For example, ```shell script $ helm install app ./helm/symfony \ - --set ingress.nginx.hostName=nginx.example.com,ingress.supervisor.hostName=supervisor.example.com,rabbitmq.ingress.hostName=rabbitmq.example.com + --set global.fpm.env=prod,global.fpm.debug=1 ``` -The above command sets the Nginx host name to `nginx.example.com`, Supervisor host name to `supervisor.example.com` and RabbitMQ management host name to `rabbitmq.example.com`. +The above command sets the environment variables APP_ENV to `prod`, APP_DEBUG to `1`. Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example, @@ -202,9 +108,4 @@ Alternatively, a YAML file that specifies the values for the parameters can be p $ helm install app ./helm/symfony -f values.yaml ``` -> Tip: You can use the default [values.yaml](/helm/symfony/values.yaml) - - -### About database migration job - -When you install or upgrade chart, Helm automatically invoke [database migration job](/helm/symfony/templates/hook/job.yaml) after it done thanks to [chart hook](https://helm.sh/docs/topics/charts_hooks/). +> Tip: You can use the default [values.yaml](/helm-chart/values.yaml), read more Nginx parameters at [here](https://github.com/bitnami/charts/tree/master/bitnami/nginx). diff --git a/docker-compose.yaml b/docker-compose.yaml index 99f40a7..fa0b394 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -11,17 +11,17 @@ services: interval: 10s timeout: 3s retries: 3 - start_period: 30s + start_period: 10s network_mode: service:nginx nginx: image: bitnami/nginx healthcheck: - test: ['CMD', 'curl', '-f', 'http://localhost/status'] + test: ['CMD', 'curl', '-f', 'http://localhost:8080/status'] interval: 10s timeout: 3s retries: 3 - start_period: 30s + start_period: 10s ports: - target: 8080 published: 80 diff --git a/helm-chart/templates/fpm/configmap.yaml b/helm-chart/templates/fpm/configmap.yaml index ea1b96f..f5ba5e7 100644 --- a/helm-chart/templates/fpm/configmap.yaml +++ b/helm-chart/templates/fpm/configmap.yaml @@ -6,6 +6,4 @@ metadata: {{- include "labels" . | nindent 4 }} data: APP_ENV: {{ .Values.global.fpm.env | quote }} - APP_DEBUG: {{ .Values.global.fpm.debug | quote }} - TRUSTED_HOSTS: {{ .Values.global.fpm.trustedHosts | quote }} - TRUSTED_PROXIES: {{ join "," .Values.global.fpm.trustedProxies | quote }} \ No newline at end of file + APP_DEBUG: {{ .Values.global.fpm.debug | quote }} \ No newline at end of file diff --git a/helm-chart/values.yaml b/helm-chart/values.yaml index bf2752e..47bf485 100644 --- a/helm-chart/values.yaml +++ b/helm-chart/values.yaml @@ -3,16 +3,10 @@ global: image: repository: vuongxuongminh/docker-helm-symfony tag: prod - pullSecrets: [] pullPolicy: IfNotPresent env: 'prod' debug: '0' secret: '!ChangeMe!' - trustedHosts: '^.*\\.example$' - trustedProxies: - - 10.0.0.0/8 - - 172.16.0.0/12 - - 192.168.0.0/16 nginx: replicaCount: 1 From 3e7255f88fe1122a6b884d032b12ef2b7bd4426c Mon Sep 17 00:00:00 2001 From: Minh Vuong Date: Fri, 30 Apr 2021 14:32:10 +0700 Subject: [PATCH 9/9] Update doc. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e4e5ea0..097fb30 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Modern containerize template for Symfony -![Build Status](https://github.com/vuongxuongminh/docker-helm-symfony/workflows/CI/badge.svg) +![Build Status](https://github.com/vuongxuongminh/docker-helm-symfony/actions/workflows/ci.yaml/badge.svg) ## About it @@ -96,7 +96,7 @@ The following table lists the configurable parameters of this chart and their de Specify each parameter using the --set key=value[,key=value] argument to helm install. For example, ```shell script -$ helm install app ./helm/symfony \ +$ helm install app ./helm-chart \ --set global.fpm.env=prod,global.fpm.debug=1 ``` @@ -105,7 +105,7 @@ The above command sets the environment variables APP_ENV to `prod`, APP_DEBUG to Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example, ```shell script -$ helm install app ./helm/symfony -f values.yaml +$ helm install app ./helm-chart -f values.yaml ``` -> Tip: You can use the default [values.yaml](/helm-chart/values.yaml), read more Nginx parameters at [here](https://github.com/bitnami/charts/tree/master/bitnami/nginx). +> Tip: You can use the default [values.yaml](/helm-chart/values.yaml) and read more Nginx parameters at [here](https://github.com/bitnami/charts/tree/master/bitnami/nginx).