├── .aws └── task-definition.json ├── .docker ├── app │ ├── Dockerfile │ ├── php.ini │ ├── pool.conf │ └── xdebug.ini ├── logs │ └── nginx │ │ └── .gitkeep ├── nginx │ ├── Dockerfile │ ├── app.conf │ └── nginx.conf └── shared_env ├── .dockerignore ├── .github └── workflows │ └── build-and-deploy.yml ├── .gitignore ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── docker-compose.yml ├── public └── index.php └── src └── template └── hi.php /.aws/task-definition.json: -------------------------------------------------------------------------------- 1 | { 2 | "ipcMode": null, 3 | "executionRoleArn": "arn:aws:iam::469959796291:role/ecsTaskExecutionRole", 4 | "containerDefinitions": [ 5 | { 6 | "dnsSearchDomains": null, 7 | "logConfiguration": { 8 | "logDriver": "awslogs", 9 | "secretOptions": null, 10 | "options": { 11 | "awslogs-group": "/ecs/php-docker-skeleton", 12 | "awslogs-region": "eu-west-1", 13 | "awslogs-stream-prefix": "ecs" 14 | } 15 | }, 16 | "entryPoint": null, 17 | "portMappings": [ 18 | { 19 | "hostPort": 9001, 20 | "protocol": "tcp", 21 | "containerPort": 9001 22 | } 23 | ], 24 | "command": null, 25 | "linuxParameters": null, 26 | "cpu": 0, 27 | "environment": [], 28 | "resourceRequirements": null, 29 | "ulimits": null, 30 | "dnsServers": null, 31 | "mountPoints": [], 32 | "workingDirectory": null, 33 | "secrets": null, 34 | "dockerSecurityOptions": null, 35 | "memory": null, 36 | "memoryReservation": null, 37 | "volumesFrom": [], 38 | "stopTimeout": null, 39 | "image": "469959796291.dkr.ecr.eu-west-1.amazonaws.com/php-docker-skeleton-app:a3c6d3f208ef3fcd70858c3f6a5602918d1225b3", 40 | "startTimeout": null, 41 | "firelensConfiguration": null, 42 | "dependsOn": null, 43 | "disableNetworking": null, 44 | "interactive": null, 45 | "healthCheck": null, 46 | "essential": true, 47 | "links": null, 48 | "hostname": null, 49 | "extraHosts": null, 50 | "pseudoTerminal": null, 51 | "user": null, 52 | "readonlyRootFilesystem": null, 53 | "dockerLabels": null, 54 | "systemControls": null, 55 | "privileged": null, 56 | "name": "app" 57 | }, 58 | { 59 | "dnsSearchDomains": null, 60 | "logConfiguration": { 61 | "logDriver": "awslogs", 62 | "secretOptions": null, 63 | "options": { 64 | "awslogs-group": "/ecs/php-docker-skeleton", 65 | "awslogs-region": "eu-west-1", 66 | "awslogs-stream-prefix": "ecs" 67 | } 68 | }, 69 | "entryPoint": null, 70 | "portMappings": [ 71 | { 72 | "hostPort": 80, 73 | "protocol": "tcp", 74 | "containerPort": 80 75 | } 76 | ], 77 | "command": null, 78 | "linuxParameters": null, 79 | "cpu": 0, 80 | "environment": [], 81 | "resourceRequirements": null, 82 | "ulimits": null, 83 | "dnsServers": null, 84 | "mountPoints": [], 85 | "workingDirectory": null, 86 | "secrets": null, 87 | "dockerSecurityOptions": null, 88 | "memory": null, 89 | "memoryReservation": null, 90 | "volumesFrom": [], 91 | "stopTimeout": null, 92 | "image": "469959796291.dkr.ecr.eu-west-1.amazonaws.com/php-docker-skeleton-nginx:a3c6d3f208ef3fcd70858c3f6a5602918d1225b3", 93 | "startTimeout": null, 94 | "firelensConfiguration": null, 95 | "dependsOn": null, 96 | "disableNetworking": null, 97 | "interactive": null, 98 | "healthCheck": null, 99 | "essential": true, 100 | "links": null, 101 | "hostname": null, 102 | "extraHosts": null, 103 | "pseudoTerminal": null, 104 | "user": null, 105 | "readonlyRootFilesystem": null, 106 | "dockerLabels": null, 107 | "systemControls": null, 108 | "privileged": null, 109 | "name": "nginx" 110 | } 111 | ], 112 | "placementConstraints": [], 113 | "memory": "512", 114 | "taskRoleArn": null, 115 | "family": "php-docker-skeleton", 116 | "pidMode": null, 117 | "requiresCompatibilities": [ 118 | "FARGATE" 119 | ], 120 | "networkMode": "awsvpc", 121 | "cpu": "256", 122 | "inferenceAccelerators": null, 123 | "proxyConfiguration": null, 124 | "volumes": [] 125 | } 126 | -------------------------------------------------------------------------------- /.docker/app/Dockerfile: -------------------------------------------------------------------------------- 1 | # Multi-stage build. More info: https://docs.docker.com/develop/develop-images/multistage-build 2 | 3 | ##### Stage 0: Prepare ##### 4 | FROM php:7.4-fpm as prepare 5 | 6 | ENV APP_DIR=/php/src/initx/php-docker-skeleton 7 | ENV PHP_FPM_DIR=/usr/local/etc/php-fpm.d 8 | 9 | RUN apt update && apt install -y \ 10 | git \ 11 | libzip-dev 12 | 13 | RUN pecl install zip \ 14 | && docker-php-ext-enable zip 15 | 16 | # Env PHP_INI_DIR comes from php:7.4-fpm image. Copy php.ini to config dir 17 | COPY .docker/app/php.ini $PHP_INI_DIR/conf.d/ 18 | # Copy php-fpm pool config 19 | COPY .docker/app/pool.conf $PHP_FPM_DIR 20 | 21 | RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 22 | 23 | # Add group and user to avoid read/write permission issues 24 | ENV USER_ID=1000 25 | ENV GROUP_ID=1000 26 | 27 | RUN groupadd --gid $GROUP_ID app \ 28 | && useradd --create-home \ 29 | --home-dir /home/app \ 30 | --shell /bin/bash \ 31 | --uid $USER_ID \ 32 | --gid $GROUP_ID \ 33 | app 34 | 35 | WORKDIR $APP_DIR 36 | 37 | COPY . . 38 | 39 | # Using USER directive before WORKDIR would not create app directory belonging to user so we must change owner here 40 | RUN chown -R $USER_ID:$GROUP_ID $APP_DIR 41 | 42 | USER app 43 | 44 | EXPOSE 9001 45 | 46 | ##### Stage 1: Prepare -> Prod ##### 47 | FROM prepare as prod 48 | 49 | USER app 50 | RUN composer install --no-ansi --no-dev --no-interaction \ 51 | --no-progress --no-scripts --no-suggest --optimize-autoloader 52 | 53 | # Cleanup 54 | USER root 55 | RUN rm /usr/local/bin/composer \ 56 | && apt remove -y git \ 57 | && apt autoremove -y 58 | 59 | ##### Stage 2: Prepare -> Dev ##### 60 | # Keep in mind, prod commands were not executed in dev image 61 | FROM prepare as dev 62 | 63 | USER root 64 | RUN pecl install xdebug \ 65 | && docker-php-ext-enable xdebug 66 | 67 | USER app 68 | # hirak/prestissimo plugin speeds up composer install a lot so let's add it 69 | RUN composer global require hirak/prestissimo 70 | -------------------------------------------------------------------------------- /.docker/app/php.ini: -------------------------------------------------------------------------------- 1 | date.timezone = UTC 2 | -------------------------------------------------------------------------------- /.docker/app/pool.conf: -------------------------------------------------------------------------------- 1 | ; Start a new pool named 'symfony'. 2 | ; the variable $pool can be used in any directive and will be replaced by the 3 | ; pool name ('symfony' here) 4 | [app] 5 | 6 | ; Unix user/group of processes 7 | ; Note: The user is mandatory. If the group is not set, the default user's group 8 | ; will be used. 9 | user = app 10 | group = app 11 | 12 | ; The address on which to accept FastCGI requests. 13 | ; Valid syntaxes are: 14 | ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on 15 | ; a specific port; 16 | ; 'port' - to listen on a TCP socket to all addresses on a 17 | ; specific port; 18 | ; '/path/to/unix/socket' - to listen on a unix socket. 19 | ; Note: This value is mandatory. 20 | listen = 0.0.0.0:9001 21 | 22 | ; Choose how the process manager will control the number of child processes. 23 | ; Possible Values: 24 | ; static - a fixed number (pm.max_children) of child processes; 25 | ; dynamic - the number of child processes are set dynamically based on the 26 | ; following directives. With this process management, there will be 27 | ; always at least 1 children. 28 | ; pm.max_children - the maximum number of children that can 29 | ; be alive at the same time. 30 | ; pm.start_servers - the number of children created on startup. 31 | ; pm.min_spare_servers - the minimum number of children in 'idle' 32 | ; state (waiting to process). If the number 33 | ; of 'idle' processes is less than this 34 | ; number then some children will be created. 35 | ; pm.max_spare_servers - the maximum number of children in 'idle' 36 | ; state (waiting to process). If the number 37 | ; of 'idle' processes is greater than this 38 | ; number then some children will be killed. 39 | ; ondemand - no children are created at startup. Children will be forked when 40 | ; new requests will connect. The following parameter are used: 41 | ; pm.max_children - the maximum number of children that 42 | ; can be alive at the same time. 43 | ; pm.process_idle_timeout - The number of seconds after which 44 | ; an idle process will be killed. 45 | ; Note: This value is mandatory. 46 | pm = dynamic 47 | 48 | ; The number of child processes to be created when pm is set to 'static' and the 49 | ; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. 50 | ; This value sets the limit on the number of simultaneous requests that will be 51 | ; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. 52 | ; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP 53 | ; CGI. The below defaults are based on a server without much resources. Don't 54 | ; forget to tweak pm.* to fit your needs. 55 | ; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' 56 | ; Note: This value is mandatory. 57 | pm.max_children = 20 58 | 59 | ; The number of child processes created on startup. 60 | ; Note: Used only when pm is set to 'dynamic' 61 | ; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 62 | pm.start_servers = 2 63 | 64 | ; The desired minimum number of idle server processes. 65 | ; Note: Used only when pm is set to 'dynamic' 66 | ; Note: Mandatory when pm is set to 'dynamic' 67 | pm.min_spare_servers = 1 68 | 69 | ; The desired maximum number of idle server processes. 70 | ; Note: Used only when pm is set to 'dynamic' 71 | ; Note: Mandatory when pm is set to 'dynamic' 72 | pm.max_spare_servers = 3 73 | 74 | ;--------------------- 75 | 76 | ; Make specific Docker environment variables available to PHP 77 | env[COMMIT_HASH] = $COMMIT_HASH 78 | 79 | catch_workers_output = yes 80 | -------------------------------------------------------------------------------- /.docker/app/xdebug.ini: -------------------------------------------------------------------------------- 1 | [Xdebug] 2 | xdebug.remote_enable=true 3 | xdebug.remote_port=10000 4 | xdebug.remote_host="172.18.0.1" 5 | xdebug.remote_autostart=1 6 | xdebug.idekey=PHPSTORM 7 | -------------------------------------------------------------------------------- /.docker/logs/nginx/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmasior/php-docker-skeleton/bc7b8b07a7f10c530e6c3108f8bce9901dd3aaf5/.docker/logs/nginx/.gitkeep -------------------------------------------------------------------------------- /.docker/nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | # Multi-stage build. More info: https://docs.docker.com/develop/develop-images/multistage-build 2 | 3 | ##### Stage 0: Prepare ##### 4 | FROM nginx:stable as prepare 5 | 6 | ENV APP_DIR=/php/src/initx/php-docker-skeleton 7 | 8 | # Add group and user to avoid read/write permission issues 9 | ENV USER_ID=1000 10 | ENV GROUP_ID=1000 11 | RUN groupadd -g $GROUP_ID app 12 | RUN useradd -d /home/app -s /bin/bash -u $USER_ID -g $GROUP_ID app 13 | 14 | RUN apt update && apt install -y curl 15 | 16 | COPY .docker/nginx/nginx.conf /etc/nginx/ 17 | COPY .docker/nginx/app.conf /etc/nginx/conf.d/ 18 | 19 | RUN rm /etc/nginx/conf.d/default.conf 20 | 21 | WORKDIR $APP_DIR 22 | 23 | COPY . . 24 | 25 | CMD ["nginx"] 26 | 27 | EXPOSE 80 28 | 29 | HEALTHCHECK --timeout=3s \ 30 | CMD curl -f localhost:80/ || exit 1 31 | 32 | ##### Stage 1: Prod ##### 33 | FROM prepare as prod 34 | RUN echo "upstream app-upstream { server 0.0.0.0:9001; }" > /etc/nginx/conf.d/upstream.conf 35 | 36 | ##### Stage 1: Prod ##### 37 | FROM prepare as dev 38 | RUN echo "upstream app-upstream { server app:9001; }" > /etc/nginx/conf.d/upstream.conf 39 | -------------------------------------------------------------------------------- /.docker/nginx/app.conf: -------------------------------------------------------------------------------- 1 | server { 2 | server_name app; 3 | root /php/src/initx/php-docker-skeleton/public; 4 | 5 | listen 80 default_server; 6 | 7 | location /healthcheck { 8 | access_log off; 9 | return 200; 10 | } 11 | 12 | location / { 13 | try_files $uri @rewriteapp; 14 | } 15 | 16 | location @rewriteapp { 17 | rewrite ^(.*)$ /index.php/$1 last; 18 | } 19 | 20 | location ~ ^/index\.php(/|$) { 21 | fastcgi_pass app-upstream; 22 | fastcgi_split_path_info ^(.+\.php)(/.*)$; 23 | include fastcgi_params; 24 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 25 | fastcgi_param HTTPS off; 26 | fastcgi_buffering off; 27 | } 28 | 29 | error_log /var/log/nginx/error.log; 30 | access_log /var/log/nginx/access.log; 31 | } 32 | -------------------------------------------------------------------------------- /.docker/nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | user app; 2 | worker_processes auto; 3 | pid /run/nginx.pid; 4 | 5 | events { 6 | worker_connections 2048; 7 | multi_accept on; 8 | use epoll; 9 | } 10 | 11 | http { 12 | server_tokens off; 13 | sendfile on; 14 | tcp_nopush on; 15 | tcp_nodelay on; 16 | keepalive_timeout 15; 17 | types_hash_max_size 2048; 18 | include /etc/nginx/mime.types; 19 | default_type application/octet-stream; 20 | access_log off; 21 | error_log off; 22 | gzip on; 23 | gzip_types *; 24 | gzip_min_length 600; 25 | include /etc/nginx/conf.d/*.conf; 26 | open_file_cache max=100; 27 | client_body_temp_path /tmp 1 2; 28 | client_body_buffer_size 256k; 29 | client_body_in_file_only off; 30 | proxy_buffering off; 31 | } 32 | 33 | daemon off; 34 | -------------------------------------------------------------------------------- /.docker/shared_env: -------------------------------------------------------------------------------- 1 | USER_ID=${UID} 2 | GROUP_ID=${GID} 3 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .aws 2 | .git 3 | .github 4 | .idea 5 | -------------------------------------------------------------------------------- /.github/workflows/build-and-deploy.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - master 5 | 6 | name: Build and deploy 7 | 8 | jobs: 9 | deploy: 10 | name: Build images, push to ECR and deploy to ECS 11 | runs-on: ubuntu-latest 12 | timeout-minutes: 18 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v1 17 | 18 | - name: Configure AWS credentials 19 | uses: aws-actions/configure-aws-credentials@v1 20 | with: 21 | aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} 22 | aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 23 | aws-region: eu-west-1 24 | 25 | - name: Login to Amazon ECR 26 | id: login-ecr 27 | uses: aws-actions/amazon-ecr-login@v1 28 | 29 | - name: Build, tag, and push App image to Amazon ECR 30 | id: build-app-image 31 | env: 32 | ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} 33 | ECR_REPOSITORY: php-docker-skeleton-app 34 | IMAGE_TAG: ${{ github.sha }} 35 | run: | 36 | docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG \ 37 | --target=prod \ 38 | --file .docker/app/Dockerfile . 39 | docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG 40 | echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" 41 | 42 | - name: Build, tag, and push Nginx image to Amazon ECR 43 | id: build-nginx-image 44 | env: 45 | ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} 46 | ECR_REPOSITORY: php-docker-skeleton-nginx 47 | IMAGE_TAG: ${{ github.sha }} 48 | run: | 49 | docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG \ 50 | --target=prod \ 51 | --file .docker/nginx/Dockerfile . 52 | docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG 53 | echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" 54 | 55 | - name: Fill in the new app image ID in the Amazon ECS task definition 56 | id: task-def-app 57 | uses: aws-actions/amazon-ecs-render-task-definition@v1 58 | with: 59 | task-definition: .aws/task-definition.json 60 | container-name: app 61 | image: ${{ steps.build-app-image.outputs.image }} 62 | 63 | - name: Fill in the new nginx image ID in the Amazon ECS task definition 64 | id: task-def-nginx 65 | uses: aws-actions/amazon-ecs-render-task-definition@v1 66 | with: 67 | task-definition: ${{ steps.task-def-app.outputs.task-definition }} 68 | container-name: nginx 69 | image: ${{ steps.build-nginx-image.outputs.image }} 70 | 71 | - name: Deploy Amazon ECS task definition 72 | uses: aws-actions/amazon-ecs-deploy-task-definition@v1 73 | with: 74 | task-definition: ${{ steps.task-def-nginx.outputs.task-definition }} 75 | service: php-docker-skeleton-service 76 | cluster: apps-prod 77 | wait-for-service-stability: true 78 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /vendor 3 | /.docker/logs 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Damian Mąsior 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Example PHP app dockerized 2 | This repository shows example usage of Docker in your PHP app. 3 | It solves common problems when working with Docker on dev/prod environments. 4 | - No more `permission denied` issues thanks to creating user with same ID as yours 5 | - No more dev/prod Dockerfiles. Just one Dockerfile per container thanks to using multi-stage builds 6 | - Easy & simple way to add another container such as redis, db and so on 7 | 8 | Dockerfile's located in `.docker` and it's subdirectories. 9 | 10 | App is built and pushed [through actions](https://github.com/initx/php-docker-skeleton/actions) 11 | to AWS ECR and then deployed to ECS (Fargate). See `.github/workflows/build-and-deploy.yml`. 12 | 13 | ## Try it out 14 | ### 1. Clone 15 | ```bash 16 | $ git clone git@github.com:initx/php-docker-skeleton.git \ 17 | && cd php-docker-skeleton 18 | ``` 19 | ### 2. Run dev environment 20 | ```bash 21 | $ docker-compose up -d 22 | ``` 23 | ### 3. Dig into app container 24 | ```bash 25 | $ docker exec -it app_php bash 26 | ``` 27 | Tip: it is cool to create alias for entering app container in your `.bashrc` or `.zshrc`: 28 | ```bash 29 | alias app_bash='docker exec -it app_php bash' 30 | ``` 31 | ### 4. Install dependencies 32 | ```bash 33 | $ composer install 34 | ``` 35 | ### 5. Visit [localhost:8080](http://localhost:8080) 36 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "initx/php-docker-skeleton", 3 | "description": "Universal example of PHP app dockerized", 4 | "type": "project", 5 | "license": "MIT", 6 | "authors": [ 7 | { 8 | "name": "initx", 9 | "email": "damian@damasior.com" 10 | } 11 | ], 12 | "minimum-stability": "stable", 13 | "require": { 14 | "php": "^7.3", 15 | "league/plates": "^3.3" 16 | }, 17 | "require-dev": { 18 | "phpunit/phpunit": "^9.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "b8faaadeb14e467d56367cad21e55db8", 8 | "packages": [ 9 | { 10 | "name": "league/plates", 11 | "version": "3.3.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/thephpleague/plates.git", 15 | "reference": "b1684b6f127714497a0ef927ce42c0b44b45a8af" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/thephpleague/plates/zipball/b1684b6f127714497a0ef927ce42c0b44b45a8af", 20 | "reference": "b1684b6f127714497a0ef927ce42c0b44b45a8af", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "^5.3 | ^7.0" 25 | }, 26 | "require-dev": { 27 | "mikey179/vfsstream": "^1.4", 28 | "phpunit/phpunit": "~4.0", 29 | "squizlabs/php_codesniffer": "~1.5" 30 | }, 31 | "type": "library", 32 | "extra": { 33 | "branch-alias": { 34 | "dev-master": "3.0-dev" 35 | } 36 | }, 37 | "autoload": { 38 | "psr-4": { 39 | "League\\Plates\\": "src" 40 | } 41 | }, 42 | "notification-url": "https://packagist.org/downloads/", 43 | "license": [ 44 | "MIT" 45 | ], 46 | "authors": [ 47 | { 48 | "name": "Jonathan Reinink", 49 | "email": "jonathan@reinink.ca", 50 | "role": "Developer" 51 | } 52 | ], 53 | "description": "Plates, the native PHP template system that's fast, easy to use and easy to extend.", 54 | "homepage": "http://platesphp.com", 55 | "keywords": [ 56 | "league", 57 | "package", 58 | "templates", 59 | "templating", 60 | "views" 61 | ], 62 | "time": "2016-12-28T00:14:17+00:00" 63 | } 64 | ], 65 | "packages-dev": [ 66 | { 67 | "name": "doctrine/instantiator", 68 | "version": "1.3.0", 69 | "source": { 70 | "type": "git", 71 | "url": "https://github.com/doctrine/instantiator.git", 72 | "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" 73 | }, 74 | "dist": { 75 | "type": "zip", 76 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", 77 | "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", 78 | "shasum": "" 79 | }, 80 | "require": { 81 | "php": "^7.1" 82 | }, 83 | "require-dev": { 84 | "doctrine/coding-standard": "^6.0", 85 | "ext-pdo": "*", 86 | "ext-phar": "*", 87 | "phpbench/phpbench": "^0.13", 88 | "phpstan/phpstan-phpunit": "^0.11", 89 | "phpstan/phpstan-shim": "^0.11", 90 | "phpunit/phpunit": "^7.0" 91 | }, 92 | "type": "library", 93 | "extra": { 94 | "branch-alias": { 95 | "dev-master": "1.2.x-dev" 96 | } 97 | }, 98 | "autoload": { 99 | "psr-4": { 100 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 101 | } 102 | }, 103 | "notification-url": "https://packagist.org/downloads/", 104 | "license": [ 105 | "MIT" 106 | ], 107 | "authors": [ 108 | { 109 | "name": "Marco Pivetta", 110 | "email": "ocramius@gmail.com", 111 | "homepage": "http://ocramius.github.com/" 112 | } 113 | ], 114 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 115 | "homepage": "https://www.doctrine-project.org/projects/instantiator.html", 116 | "keywords": [ 117 | "constructor", 118 | "instantiate" 119 | ], 120 | "time": "2019-10-21T16:45:58+00:00" 121 | }, 122 | { 123 | "name": "myclabs/deep-copy", 124 | "version": "1.9.5", 125 | "source": { 126 | "type": "git", 127 | "url": "https://github.com/myclabs/DeepCopy.git", 128 | "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" 129 | }, 130 | "dist": { 131 | "type": "zip", 132 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", 133 | "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", 134 | "shasum": "" 135 | }, 136 | "require": { 137 | "php": "^7.1" 138 | }, 139 | "replace": { 140 | "myclabs/deep-copy": "self.version" 141 | }, 142 | "require-dev": { 143 | "doctrine/collections": "^1.0", 144 | "doctrine/common": "^2.6", 145 | "phpunit/phpunit": "^7.1" 146 | }, 147 | "type": "library", 148 | "autoload": { 149 | "psr-4": { 150 | "DeepCopy\\": "src/DeepCopy/" 151 | }, 152 | "files": [ 153 | "src/DeepCopy/deep_copy.php" 154 | ] 155 | }, 156 | "notification-url": "https://packagist.org/downloads/", 157 | "license": [ 158 | "MIT" 159 | ], 160 | "description": "Create deep copies (clones) of your objects", 161 | "keywords": [ 162 | "clone", 163 | "copy", 164 | "duplicate", 165 | "object", 166 | "object graph" 167 | ], 168 | "time": "2020-01-17T21:11:47+00:00" 169 | }, 170 | { 171 | "name": "phar-io/manifest", 172 | "version": "1.0.3", 173 | "source": { 174 | "type": "git", 175 | "url": "https://github.com/phar-io/manifest.git", 176 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 177 | }, 178 | "dist": { 179 | "type": "zip", 180 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 181 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 182 | "shasum": "" 183 | }, 184 | "require": { 185 | "ext-dom": "*", 186 | "ext-phar": "*", 187 | "phar-io/version": "^2.0", 188 | "php": "^5.6 || ^7.0" 189 | }, 190 | "type": "library", 191 | "extra": { 192 | "branch-alias": { 193 | "dev-master": "1.0.x-dev" 194 | } 195 | }, 196 | "autoload": { 197 | "classmap": [ 198 | "src/" 199 | ] 200 | }, 201 | "notification-url": "https://packagist.org/downloads/", 202 | "license": [ 203 | "BSD-3-Clause" 204 | ], 205 | "authors": [ 206 | { 207 | "name": "Arne Blankerts", 208 | "email": "arne@blankerts.de", 209 | "role": "Developer" 210 | }, 211 | { 212 | "name": "Sebastian Heuer", 213 | "email": "sebastian@phpeople.de", 214 | "role": "Developer" 215 | }, 216 | { 217 | "name": "Sebastian Bergmann", 218 | "email": "sebastian@phpunit.de", 219 | "role": "Developer" 220 | } 221 | ], 222 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 223 | "time": "2018-07-08T19:23:20+00:00" 224 | }, 225 | { 226 | "name": "phar-io/version", 227 | "version": "2.0.1", 228 | "source": { 229 | "type": "git", 230 | "url": "https://github.com/phar-io/version.git", 231 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 232 | }, 233 | "dist": { 234 | "type": "zip", 235 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 236 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 237 | "shasum": "" 238 | }, 239 | "require": { 240 | "php": "^5.6 || ^7.0" 241 | }, 242 | "type": "library", 243 | "autoload": { 244 | "classmap": [ 245 | "src/" 246 | ] 247 | }, 248 | "notification-url": "https://packagist.org/downloads/", 249 | "license": [ 250 | "BSD-3-Clause" 251 | ], 252 | "authors": [ 253 | { 254 | "name": "Arne Blankerts", 255 | "email": "arne@blankerts.de", 256 | "role": "Developer" 257 | }, 258 | { 259 | "name": "Sebastian Heuer", 260 | "email": "sebastian@phpeople.de", 261 | "role": "Developer" 262 | }, 263 | { 264 | "name": "Sebastian Bergmann", 265 | "email": "sebastian@phpunit.de", 266 | "role": "Developer" 267 | } 268 | ], 269 | "description": "Library for handling version information and constraints", 270 | "time": "2018-07-08T19:19:57+00:00" 271 | }, 272 | { 273 | "name": "phpdocumentor/reflection-common", 274 | "version": "2.0.0", 275 | "source": { 276 | "type": "git", 277 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 278 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" 279 | }, 280 | "dist": { 281 | "type": "zip", 282 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", 283 | "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", 284 | "shasum": "" 285 | }, 286 | "require": { 287 | "php": ">=7.1" 288 | }, 289 | "require-dev": { 290 | "phpunit/phpunit": "~6" 291 | }, 292 | "type": "library", 293 | "extra": { 294 | "branch-alias": { 295 | "dev-master": "2.x-dev" 296 | } 297 | }, 298 | "autoload": { 299 | "psr-4": { 300 | "phpDocumentor\\Reflection\\": "src/" 301 | } 302 | }, 303 | "notification-url": "https://packagist.org/downloads/", 304 | "license": [ 305 | "MIT" 306 | ], 307 | "authors": [ 308 | { 309 | "name": "Jaap van Otterdijk", 310 | "email": "opensource@ijaap.nl" 311 | } 312 | ], 313 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 314 | "homepage": "http://www.phpdoc.org", 315 | "keywords": [ 316 | "FQSEN", 317 | "phpDocumentor", 318 | "phpdoc", 319 | "reflection", 320 | "static analysis" 321 | ], 322 | "time": "2018-08-07T13:53:10+00:00" 323 | }, 324 | { 325 | "name": "phpdocumentor/reflection-docblock", 326 | "version": "5.1.0", 327 | "source": { 328 | "type": "git", 329 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 330 | "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e" 331 | }, 332 | "dist": { 333 | "type": "zip", 334 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", 335 | "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e", 336 | "shasum": "" 337 | }, 338 | "require": { 339 | "ext-filter": "^7.1", 340 | "php": "^7.2", 341 | "phpdocumentor/reflection-common": "^2.0", 342 | "phpdocumentor/type-resolver": "^1.0", 343 | "webmozart/assert": "^1" 344 | }, 345 | "require-dev": { 346 | "doctrine/instantiator": "^1", 347 | "mockery/mockery": "^1" 348 | }, 349 | "type": "library", 350 | "extra": { 351 | "branch-alias": { 352 | "dev-master": "5.x-dev" 353 | } 354 | }, 355 | "autoload": { 356 | "psr-4": { 357 | "phpDocumentor\\Reflection\\": "src" 358 | } 359 | }, 360 | "notification-url": "https://packagist.org/downloads/", 361 | "license": [ 362 | "MIT" 363 | ], 364 | "authors": [ 365 | { 366 | "name": "Mike van Riel", 367 | "email": "me@mikevanriel.com" 368 | }, 369 | { 370 | "name": "Jaap van Otterdijk", 371 | "email": "account@ijaap.nl" 372 | } 373 | ], 374 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 375 | "time": "2020-02-22T12:28:44+00:00" 376 | }, 377 | { 378 | "name": "phpdocumentor/type-resolver", 379 | "version": "1.1.0", 380 | "source": { 381 | "type": "git", 382 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 383 | "reference": "7462d5f123dfc080dfdf26897032a6513644fc95" 384 | }, 385 | "dist": { 386 | "type": "zip", 387 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95", 388 | "reference": "7462d5f123dfc080dfdf26897032a6513644fc95", 389 | "shasum": "" 390 | }, 391 | "require": { 392 | "php": "^7.2", 393 | "phpdocumentor/reflection-common": "^2.0" 394 | }, 395 | "require-dev": { 396 | "ext-tokenizer": "^7.2", 397 | "mockery/mockery": "~1" 398 | }, 399 | "type": "library", 400 | "extra": { 401 | "branch-alias": { 402 | "dev-master": "1.x-dev" 403 | } 404 | }, 405 | "autoload": { 406 | "psr-4": { 407 | "phpDocumentor\\Reflection\\": "src" 408 | } 409 | }, 410 | "notification-url": "https://packagist.org/downloads/", 411 | "license": [ 412 | "MIT" 413 | ], 414 | "authors": [ 415 | { 416 | "name": "Mike van Riel", 417 | "email": "me@mikevanriel.com" 418 | } 419 | ], 420 | "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 421 | "time": "2020-02-18T18:59:58+00:00" 422 | }, 423 | { 424 | "name": "phpspec/prophecy", 425 | "version": "v1.10.3", 426 | "source": { 427 | "type": "git", 428 | "url": "https://github.com/phpspec/prophecy.git", 429 | "reference": "451c3cd1418cf640de218914901e51b064abb093" 430 | }, 431 | "dist": { 432 | "type": "zip", 433 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", 434 | "reference": "451c3cd1418cf640de218914901e51b064abb093", 435 | "shasum": "" 436 | }, 437 | "require": { 438 | "doctrine/instantiator": "^1.0.2", 439 | "php": "^5.3|^7.0", 440 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", 441 | "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", 442 | "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" 443 | }, 444 | "require-dev": { 445 | "phpspec/phpspec": "^2.5 || ^3.2", 446 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 447 | }, 448 | "type": "library", 449 | "extra": { 450 | "branch-alias": { 451 | "dev-master": "1.10.x-dev" 452 | } 453 | }, 454 | "autoload": { 455 | "psr-4": { 456 | "Prophecy\\": "src/Prophecy" 457 | } 458 | }, 459 | "notification-url": "https://packagist.org/downloads/", 460 | "license": [ 461 | "MIT" 462 | ], 463 | "authors": [ 464 | { 465 | "name": "Konstantin Kudryashov", 466 | "email": "ever.zet@gmail.com", 467 | "homepage": "http://everzet.com" 468 | }, 469 | { 470 | "name": "Marcello Duarte", 471 | "email": "marcello.duarte@gmail.com" 472 | } 473 | ], 474 | "description": "Highly opinionated mocking framework for PHP 5.3+", 475 | "homepage": "https://github.com/phpspec/prophecy", 476 | "keywords": [ 477 | "Double", 478 | "Dummy", 479 | "fake", 480 | "mock", 481 | "spy", 482 | "stub" 483 | ], 484 | "time": "2020-03-05T15:02:03+00:00" 485 | }, 486 | { 487 | "name": "phpunit/php-code-coverage", 488 | "version": "8.0.1", 489 | "source": { 490 | "type": "git", 491 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 492 | "reference": "31e94ccc084025d6abee0585df533eb3a792b96a" 493 | }, 494 | "dist": { 495 | "type": "zip", 496 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/31e94ccc084025d6abee0585df533eb3a792b96a", 497 | "reference": "31e94ccc084025d6abee0585df533eb3a792b96a", 498 | "shasum": "" 499 | }, 500 | "require": { 501 | "ext-dom": "*", 502 | "ext-xmlwriter": "*", 503 | "php": "^7.3", 504 | "phpunit/php-file-iterator": "^3.0", 505 | "phpunit/php-text-template": "^2.0", 506 | "phpunit/php-token-stream": "^4.0", 507 | "sebastian/code-unit-reverse-lookup": "^2.0", 508 | "sebastian/environment": "^5.0", 509 | "sebastian/version": "^3.0", 510 | "theseer/tokenizer": "^1.1.3" 511 | }, 512 | "require-dev": { 513 | "phpunit/phpunit": "^9.0" 514 | }, 515 | "suggest": { 516 | "ext-pcov": "*", 517 | "ext-xdebug": "*" 518 | }, 519 | "type": "library", 520 | "extra": { 521 | "branch-alias": { 522 | "dev-master": "8.0-dev" 523 | } 524 | }, 525 | "autoload": { 526 | "classmap": [ 527 | "src/" 528 | ] 529 | }, 530 | "notification-url": "https://packagist.org/downloads/", 531 | "license": [ 532 | "BSD-3-Clause" 533 | ], 534 | "authors": [ 535 | { 536 | "name": "Sebastian Bergmann", 537 | "email": "sebastian@phpunit.de", 538 | "role": "lead" 539 | } 540 | ], 541 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 542 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 543 | "keywords": [ 544 | "coverage", 545 | "testing", 546 | "xunit" 547 | ], 548 | "time": "2020-02-19T13:41:19+00:00" 549 | }, 550 | { 551 | "name": "phpunit/php-file-iterator", 552 | "version": "3.0.0", 553 | "source": { 554 | "type": "git", 555 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 556 | "reference": "354d4a5faa7449a377a18b94a2026ca3415e3d7a" 557 | }, 558 | "dist": { 559 | "type": "zip", 560 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/354d4a5faa7449a377a18b94a2026ca3415e3d7a", 561 | "reference": "354d4a5faa7449a377a18b94a2026ca3415e3d7a", 562 | "shasum": "" 563 | }, 564 | "require": { 565 | "php": "^7.3" 566 | }, 567 | "require-dev": { 568 | "phpunit/phpunit": "^9.0" 569 | }, 570 | "type": "library", 571 | "extra": { 572 | "branch-alias": { 573 | "dev-master": "3.0-dev" 574 | } 575 | }, 576 | "autoload": { 577 | "classmap": [ 578 | "src/" 579 | ] 580 | }, 581 | "notification-url": "https://packagist.org/downloads/", 582 | "license": [ 583 | "BSD-3-Clause" 584 | ], 585 | "authors": [ 586 | { 587 | "name": "Sebastian Bergmann", 588 | "email": "sebastian@phpunit.de", 589 | "role": "lead" 590 | } 591 | ], 592 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 593 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 594 | "keywords": [ 595 | "filesystem", 596 | "iterator" 597 | ], 598 | "time": "2020-02-07T06:05:22+00:00" 599 | }, 600 | { 601 | "name": "phpunit/php-invoker", 602 | "version": "3.0.0", 603 | "source": { 604 | "type": "git", 605 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 606 | "reference": "7579d5a1ba7f3ac11c80004d205877911315ae7a" 607 | }, 608 | "dist": { 609 | "type": "zip", 610 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/7579d5a1ba7f3ac11c80004d205877911315ae7a", 611 | "reference": "7579d5a1ba7f3ac11c80004d205877911315ae7a", 612 | "shasum": "" 613 | }, 614 | "require": { 615 | "php": "^7.3" 616 | }, 617 | "require-dev": { 618 | "ext-pcntl": "*", 619 | "phpunit/phpunit": "^9.0" 620 | }, 621 | "suggest": { 622 | "ext-pcntl": "*" 623 | }, 624 | "type": "library", 625 | "extra": { 626 | "branch-alias": { 627 | "dev-master": "3.0-dev" 628 | } 629 | }, 630 | "autoload": { 631 | "classmap": [ 632 | "src/" 633 | ] 634 | }, 635 | "notification-url": "https://packagist.org/downloads/", 636 | "license": [ 637 | "BSD-3-Clause" 638 | ], 639 | "authors": [ 640 | { 641 | "name": "Sebastian Bergmann", 642 | "email": "sebastian@phpunit.de", 643 | "role": "lead" 644 | } 645 | ], 646 | "description": "Invoke callables with a timeout", 647 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 648 | "keywords": [ 649 | "process" 650 | ], 651 | "time": "2020-02-07T06:06:11+00:00" 652 | }, 653 | { 654 | "name": "phpunit/php-text-template", 655 | "version": "2.0.0", 656 | "source": { 657 | "type": "git", 658 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 659 | "reference": "526dc996cc0ebdfa428cd2dfccd79b7b53fee346" 660 | }, 661 | "dist": { 662 | "type": "zip", 663 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/526dc996cc0ebdfa428cd2dfccd79b7b53fee346", 664 | "reference": "526dc996cc0ebdfa428cd2dfccd79b7b53fee346", 665 | "shasum": "" 666 | }, 667 | "require": { 668 | "php": "^7.3" 669 | }, 670 | "type": "library", 671 | "extra": { 672 | "branch-alias": { 673 | "dev-master": "2.0-dev" 674 | } 675 | }, 676 | "autoload": { 677 | "classmap": [ 678 | "src/" 679 | ] 680 | }, 681 | "notification-url": "https://packagist.org/downloads/", 682 | "license": [ 683 | "BSD-3-Clause" 684 | ], 685 | "authors": [ 686 | { 687 | "name": "Sebastian Bergmann", 688 | "email": "sebastian@phpunit.de", 689 | "role": "lead" 690 | } 691 | ], 692 | "description": "Simple template engine.", 693 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 694 | "keywords": [ 695 | "template" 696 | ], 697 | "time": "2020-02-01T07:43:44+00:00" 698 | }, 699 | { 700 | "name": "phpunit/php-timer", 701 | "version": "3.0.0", 702 | "source": { 703 | "type": "git", 704 | "url": "https://github.com/sebastianbergmann/php-timer.git", 705 | "reference": "4118013a4d0f97356eae8e7fb2f6c6472575d1df" 706 | }, 707 | "dist": { 708 | "type": "zip", 709 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/4118013a4d0f97356eae8e7fb2f6c6472575d1df", 710 | "reference": "4118013a4d0f97356eae8e7fb2f6c6472575d1df", 711 | "shasum": "" 712 | }, 713 | "require": { 714 | "php": "^7.3" 715 | }, 716 | "require-dev": { 717 | "phpunit/phpunit": "^9.0" 718 | }, 719 | "type": "library", 720 | "extra": { 721 | "branch-alias": { 722 | "dev-master": "3.0-dev" 723 | } 724 | }, 725 | "autoload": { 726 | "classmap": [ 727 | "src/" 728 | ] 729 | }, 730 | "notification-url": "https://packagist.org/downloads/", 731 | "license": [ 732 | "BSD-3-Clause" 733 | ], 734 | "authors": [ 735 | { 736 | "name": "Sebastian Bergmann", 737 | "email": "sebastian@phpunit.de", 738 | "role": "lead" 739 | } 740 | ], 741 | "description": "Utility class for timing", 742 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 743 | "keywords": [ 744 | "timer" 745 | ], 746 | "time": "2020-02-07T06:08:11+00:00" 747 | }, 748 | { 749 | "name": "phpunit/php-token-stream", 750 | "version": "4.0.0", 751 | "source": { 752 | "type": "git", 753 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 754 | "reference": "b2560a0c33f7710e4d7f8780964193e8e8f8effe" 755 | }, 756 | "dist": { 757 | "type": "zip", 758 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/b2560a0c33f7710e4d7f8780964193e8e8f8effe", 759 | "reference": "b2560a0c33f7710e4d7f8780964193e8e8f8effe", 760 | "shasum": "" 761 | }, 762 | "require": { 763 | "ext-tokenizer": "*", 764 | "php": "^7.3" 765 | }, 766 | "require-dev": { 767 | "phpunit/phpunit": "^9.0" 768 | }, 769 | "type": "library", 770 | "extra": { 771 | "branch-alias": { 772 | "dev-master": "4.0-dev" 773 | } 774 | }, 775 | "autoload": { 776 | "classmap": [ 777 | "src/" 778 | ] 779 | }, 780 | "notification-url": "https://packagist.org/downloads/", 781 | "license": [ 782 | "BSD-3-Clause" 783 | ], 784 | "authors": [ 785 | { 786 | "name": "Sebastian Bergmann", 787 | "email": "sebastian@phpunit.de" 788 | } 789 | ], 790 | "description": "Wrapper around PHP's tokenizer extension.", 791 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 792 | "keywords": [ 793 | "tokenizer" 794 | ], 795 | "time": "2020-02-07T06:19:00+00:00" 796 | }, 797 | { 798 | "name": "phpunit/phpunit", 799 | "version": "9.0.1", 800 | "source": { 801 | "type": "git", 802 | "url": "https://github.com/sebastianbergmann/phpunit.git", 803 | "reference": "68d7e5b17a6b9461e17c00446caa409863154f76" 804 | }, 805 | "dist": { 806 | "type": "zip", 807 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/68d7e5b17a6b9461e17c00446caa409863154f76", 808 | "reference": "68d7e5b17a6b9461e17c00446caa409863154f76", 809 | "shasum": "" 810 | }, 811 | "require": { 812 | "doctrine/instantiator": "^1.2.0", 813 | "ext-dom": "*", 814 | "ext-json": "*", 815 | "ext-libxml": "*", 816 | "ext-mbstring": "*", 817 | "ext-xml": "*", 818 | "ext-xmlwriter": "*", 819 | "myclabs/deep-copy": "^1.9.1", 820 | "phar-io/manifest": "^1.0.3", 821 | "phar-io/version": "^2.0.1", 822 | "php": "^7.3", 823 | "phpspec/prophecy": "^1.8.1", 824 | "phpunit/php-code-coverage": "^8.0", 825 | "phpunit/php-file-iterator": "^3.0", 826 | "phpunit/php-invoker": "^3.0", 827 | "phpunit/php-text-template": "^2.0", 828 | "phpunit/php-timer": "^3.0", 829 | "sebastian/comparator": "^4.0", 830 | "sebastian/diff": "^4.0", 831 | "sebastian/environment": "^5.0", 832 | "sebastian/exporter": "^4.0", 833 | "sebastian/global-state": "^4.0", 834 | "sebastian/object-enumerator": "^4.0", 835 | "sebastian/resource-operations": "^3.0", 836 | "sebastian/type": "^2.0", 837 | "sebastian/version": "^3.0" 838 | }, 839 | "require-dev": { 840 | "ext-pdo": "*" 841 | }, 842 | "suggest": { 843 | "ext-soap": "*", 844 | "ext-xdebug": "*" 845 | }, 846 | "bin": [ 847 | "phpunit" 848 | ], 849 | "type": "library", 850 | "extra": { 851 | "branch-alias": { 852 | "dev-master": "9.0-dev" 853 | } 854 | }, 855 | "autoload": { 856 | "classmap": [ 857 | "src/" 858 | ], 859 | "files": [ 860 | "src/Framework/Assert/Functions.php" 861 | ] 862 | }, 863 | "notification-url": "https://packagist.org/downloads/", 864 | "license": [ 865 | "BSD-3-Clause" 866 | ], 867 | "authors": [ 868 | { 869 | "name": "Sebastian Bergmann", 870 | "email": "sebastian@phpunit.de", 871 | "role": "lead" 872 | } 873 | ], 874 | "description": "The PHP Unit Testing framework.", 875 | "homepage": "https://phpunit.de/", 876 | "keywords": [ 877 | "phpunit", 878 | "testing", 879 | "xunit" 880 | ], 881 | "time": "2020-02-13T07:30:12+00:00" 882 | }, 883 | { 884 | "name": "sebastian/code-unit-reverse-lookup", 885 | "version": "2.0.0", 886 | "source": { 887 | "type": "git", 888 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 889 | "reference": "5b5dbe0044085ac41df47e79d34911a15b96d82e" 890 | }, 891 | "dist": { 892 | "type": "zip", 893 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5b5dbe0044085ac41df47e79d34911a15b96d82e", 894 | "reference": "5b5dbe0044085ac41df47e79d34911a15b96d82e", 895 | "shasum": "" 896 | }, 897 | "require": { 898 | "php": "^7.3" 899 | }, 900 | "require-dev": { 901 | "phpunit/phpunit": "^9.0" 902 | }, 903 | "type": "library", 904 | "extra": { 905 | "branch-alias": { 906 | "dev-master": "2.0-dev" 907 | } 908 | }, 909 | "autoload": { 910 | "classmap": [ 911 | "src/" 912 | ] 913 | }, 914 | "notification-url": "https://packagist.org/downloads/", 915 | "license": [ 916 | "BSD-3-Clause" 917 | ], 918 | "authors": [ 919 | { 920 | "name": "Sebastian Bergmann", 921 | "email": "sebastian@phpunit.de" 922 | } 923 | ], 924 | "description": "Looks up which function or method a line of code belongs to", 925 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 926 | "time": "2020-02-07T06:20:13+00:00" 927 | }, 928 | { 929 | "name": "sebastian/comparator", 930 | "version": "4.0.0", 931 | "source": { 932 | "type": "git", 933 | "url": "https://github.com/sebastianbergmann/comparator.git", 934 | "reference": "85b3435da967696ed618ff745f32be3ff4a2b8e8" 935 | }, 936 | "dist": { 937 | "type": "zip", 938 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/85b3435da967696ed618ff745f32be3ff4a2b8e8", 939 | "reference": "85b3435da967696ed618ff745f32be3ff4a2b8e8", 940 | "shasum": "" 941 | }, 942 | "require": { 943 | "php": "^7.3", 944 | "sebastian/diff": "^4.0", 945 | "sebastian/exporter": "^4.0" 946 | }, 947 | "require-dev": { 948 | "phpunit/phpunit": "^9.0" 949 | }, 950 | "type": "library", 951 | "extra": { 952 | "branch-alias": { 953 | "dev-master": "4.0-dev" 954 | } 955 | }, 956 | "autoload": { 957 | "classmap": [ 958 | "src/" 959 | ] 960 | }, 961 | "notification-url": "https://packagist.org/downloads/", 962 | "license": [ 963 | "BSD-3-Clause" 964 | ], 965 | "authors": [ 966 | { 967 | "name": "Sebastian Bergmann", 968 | "email": "sebastian@phpunit.de" 969 | }, 970 | { 971 | "name": "Jeff Welch", 972 | "email": "whatthejeff@gmail.com" 973 | }, 974 | { 975 | "name": "Volker Dusch", 976 | "email": "github@wallbash.com" 977 | }, 978 | { 979 | "name": "Bernhard Schussek", 980 | "email": "bschussek@2bepublished.at" 981 | } 982 | ], 983 | "description": "Provides the functionality to compare PHP values for equality", 984 | "homepage": "https://github.com/sebastianbergmann/comparator", 985 | "keywords": [ 986 | "comparator", 987 | "compare", 988 | "equality" 989 | ], 990 | "time": "2020-02-07T06:08:51+00:00" 991 | }, 992 | { 993 | "name": "sebastian/diff", 994 | "version": "4.0.0", 995 | "source": { 996 | "type": "git", 997 | "url": "https://github.com/sebastianbergmann/diff.git", 998 | "reference": "c0c26c9188b538bfa985ae10c9f05d278f12060d" 999 | }, 1000 | "dist": { 1001 | "type": "zip", 1002 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c0c26c9188b538bfa985ae10c9f05d278f12060d", 1003 | "reference": "c0c26c9188b538bfa985ae10c9f05d278f12060d", 1004 | "shasum": "" 1005 | }, 1006 | "require": { 1007 | "php": "^7.3" 1008 | }, 1009 | "require-dev": { 1010 | "phpunit/phpunit": "^9.0", 1011 | "symfony/process": "^4 || ^5" 1012 | }, 1013 | "type": "library", 1014 | "extra": { 1015 | "branch-alias": { 1016 | "dev-master": "4.0-dev" 1017 | } 1018 | }, 1019 | "autoload": { 1020 | "classmap": [ 1021 | "src/" 1022 | ] 1023 | }, 1024 | "notification-url": "https://packagist.org/downloads/", 1025 | "license": [ 1026 | "BSD-3-Clause" 1027 | ], 1028 | "authors": [ 1029 | { 1030 | "name": "Sebastian Bergmann", 1031 | "email": "sebastian@phpunit.de" 1032 | }, 1033 | { 1034 | "name": "Kore Nordmann", 1035 | "email": "mail@kore-nordmann.de" 1036 | } 1037 | ], 1038 | "description": "Diff implementation", 1039 | "homepage": "https://github.com/sebastianbergmann/diff", 1040 | "keywords": [ 1041 | "diff", 1042 | "udiff", 1043 | "unidiff", 1044 | "unified diff" 1045 | ], 1046 | "time": "2020-02-07T06:09:38+00:00" 1047 | }, 1048 | { 1049 | "name": "sebastian/environment", 1050 | "version": "5.0.1", 1051 | "source": { 1052 | "type": "git", 1053 | "url": "https://github.com/sebastianbergmann/environment.git", 1054 | "reference": "9bffdefa7810031a165ddd6275da6a2c1f6f2dfb" 1055 | }, 1056 | "dist": { 1057 | "type": "zip", 1058 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9bffdefa7810031a165ddd6275da6a2c1f6f2dfb", 1059 | "reference": "9bffdefa7810031a165ddd6275da6a2c1f6f2dfb", 1060 | "shasum": "" 1061 | }, 1062 | "require": { 1063 | "php": "^7.3" 1064 | }, 1065 | "require-dev": { 1066 | "phpunit/phpunit": "^9.0" 1067 | }, 1068 | "suggest": { 1069 | "ext-posix": "*" 1070 | }, 1071 | "type": "library", 1072 | "extra": { 1073 | "branch-alias": { 1074 | "dev-master": "5.0-dev" 1075 | } 1076 | }, 1077 | "autoload": { 1078 | "classmap": [ 1079 | "src/" 1080 | ] 1081 | }, 1082 | "notification-url": "https://packagist.org/downloads/", 1083 | "license": [ 1084 | "BSD-3-Clause" 1085 | ], 1086 | "authors": [ 1087 | { 1088 | "name": "Sebastian Bergmann", 1089 | "email": "sebastian@phpunit.de" 1090 | } 1091 | ], 1092 | "description": "Provides functionality to handle HHVM/PHP environments", 1093 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1094 | "keywords": [ 1095 | "Xdebug", 1096 | "environment", 1097 | "hhvm" 1098 | ], 1099 | "time": "2020-02-19T13:40:20+00:00" 1100 | }, 1101 | { 1102 | "name": "sebastian/exporter", 1103 | "version": "4.0.0", 1104 | "source": { 1105 | "type": "git", 1106 | "url": "https://github.com/sebastianbergmann/exporter.git", 1107 | "reference": "80c26562e964016538f832f305b2286e1ec29566" 1108 | }, 1109 | "dist": { 1110 | "type": "zip", 1111 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/80c26562e964016538f832f305b2286e1ec29566", 1112 | "reference": "80c26562e964016538f832f305b2286e1ec29566", 1113 | "shasum": "" 1114 | }, 1115 | "require": { 1116 | "php": "^7.3", 1117 | "sebastian/recursion-context": "^4.0" 1118 | }, 1119 | "require-dev": { 1120 | "ext-mbstring": "*", 1121 | "phpunit/phpunit": "^9.0" 1122 | }, 1123 | "type": "library", 1124 | "extra": { 1125 | "branch-alias": { 1126 | "dev-master": "4.0-dev" 1127 | } 1128 | }, 1129 | "autoload": { 1130 | "classmap": [ 1131 | "src/" 1132 | ] 1133 | }, 1134 | "notification-url": "https://packagist.org/downloads/", 1135 | "license": [ 1136 | "BSD-3-Clause" 1137 | ], 1138 | "authors": [ 1139 | { 1140 | "name": "Sebastian Bergmann", 1141 | "email": "sebastian@phpunit.de" 1142 | }, 1143 | { 1144 | "name": "Jeff Welch", 1145 | "email": "whatthejeff@gmail.com" 1146 | }, 1147 | { 1148 | "name": "Volker Dusch", 1149 | "email": "github@wallbash.com" 1150 | }, 1151 | { 1152 | "name": "Adam Harvey", 1153 | "email": "aharvey@php.net" 1154 | }, 1155 | { 1156 | "name": "Bernhard Schussek", 1157 | "email": "bschussek@gmail.com" 1158 | } 1159 | ], 1160 | "description": "Provides the functionality to export PHP variables for visualization", 1161 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1162 | "keywords": [ 1163 | "export", 1164 | "exporter" 1165 | ], 1166 | "time": "2020-02-07T06:10:52+00:00" 1167 | }, 1168 | { 1169 | "name": "sebastian/global-state", 1170 | "version": "4.0.0", 1171 | "source": { 1172 | "type": "git", 1173 | "url": "https://github.com/sebastianbergmann/global-state.git", 1174 | "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72" 1175 | }, 1176 | "dist": { 1177 | "type": "zip", 1178 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bdb1e7c79e592b8c82cb1699be3c8743119b8a72", 1179 | "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72", 1180 | "shasum": "" 1181 | }, 1182 | "require": { 1183 | "php": "^7.3", 1184 | "sebastian/object-reflector": "^2.0", 1185 | "sebastian/recursion-context": "^4.0" 1186 | }, 1187 | "require-dev": { 1188 | "ext-dom": "*", 1189 | "phpunit/phpunit": "^9.0" 1190 | }, 1191 | "suggest": { 1192 | "ext-uopz": "*" 1193 | }, 1194 | "type": "library", 1195 | "extra": { 1196 | "branch-alias": { 1197 | "dev-master": "4.0-dev" 1198 | } 1199 | }, 1200 | "autoload": { 1201 | "classmap": [ 1202 | "src/" 1203 | ] 1204 | }, 1205 | "notification-url": "https://packagist.org/downloads/", 1206 | "license": [ 1207 | "BSD-3-Clause" 1208 | ], 1209 | "authors": [ 1210 | { 1211 | "name": "Sebastian Bergmann", 1212 | "email": "sebastian@phpunit.de" 1213 | } 1214 | ], 1215 | "description": "Snapshotting of global state", 1216 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1217 | "keywords": [ 1218 | "global state" 1219 | ], 1220 | "time": "2020-02-07T06:11:37+00:00" 1221 | }, 1222 | { 1223 | "name": "sebastian/object-enumerator", 1224 | "version": "4.0.0", 1225 | "source": { 1226 | "type": "git", 1227 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1228 | "reference": "e67516b175550abad905dc952f43285957ef4363" 1229 | }, 1230 | "dist": { 1231 | "type": "zip", 1232 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67516b175550abad905dc952f43285957ef4363", 1233 | "reference": "e67516b175550abad905dc952f43285957ef4363", 1234 | "shasum": "" 1235 | }, 1236 | "require": { 1237 | "php": "^7.3", 1238 | "sebastian/object-reflector": "^2.0", 1239 | "sebastian/recursion-context": "^4.0" 1240 | }, 1241 | "require-dev": { 1242 | "phpunit/phpunit": "^9.0" 1243 | }, 1244 | "type": "library", 1245 | "extra": { 1246 | "branch-alias": { 1247 | "dev-master": "4.0-dev" 1248 | } 1249 | }, 1250 | "autoload": { 1251 | "classmap": [ 1252 | "src/" 1253 | ] 1254 | }, 1255 | "notification-url": "https://packagist.org/downloads/", 1256 | "license": [ 1257 | "BSD-3-Clause" 1258 | ], 1259 | "authors": [ 1260 | { 1261 | "name": "Sebastian Bergmann", 1262 | "email": "sebastian@phpunit.de" 1263 | } 1264 | ], 1265 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1266 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1267 | "time": "2020-02-07T06:12:23+00:00" 1268 | }, 1269 | { 1270 | "name": "sebastian/object-reflector", 1271 | "version": "2.0.0", 1272 | "source": { 1273 | "type": "git", 1274 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1275 | "reference": "f4fd0835cabb0d4a6546d9fe291e5740037aa1e7" 1276 | }, 1277 | "dist": { 1278 | "type": "zip", 1279 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/f4fd0835cabb0d4a6546d9fe291e5740037aa1e7", 1280 | "reference": "f4fd0835cabb0d4a6546d9fe291e5740037aa1e7", 1281 | "shasum": "" 1282 | }, 1283 | "require": { 1284 | "php": "^7.3" 1285 | }, 1286 | "require-dev": { 1287 | "phpunit/phpunit": "^9.0" 1288 | }, 1289 | "type": "library", 1290 | "extra": { 1291 | "branch-alias": { 1292 | "dev-master": "2.0-dev" 1293 | } 1294 | }, 1295 | "autoload": { 1296 | "classmap": [ 1297 | "src/" 1298 | ] 1299 | }, 1300 | "notification-url": "https://packagist.org/downloads/", 1301 | "license": [ 1302 | "BSD-3-Clause" 1303 | ], 1304 | "authors": [ 1305 | { 1306 | "name": "Sebastian Bergmann", 1307 | "email": "sebastian@phpunit.de" 1308 | } 1309 | ], 1310 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1311 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1312 | "time": "2020-02-07T06:19:40+00:00" 1313 | }, 1314 | { 1315 | "name": "sebastian/recursion-context", 1316 | "version": "4.0.0", 1317 | "source": { 1318 | "type": "git", 1319 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1320 | "reference": "cdd86616411fc3062368b720b0425de10bd3d579" 1321 | }, 1322 | "dist": { 1323 | "type": "zip", 1324 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cdd86616411fc3062368b720b0425de10bd3d579", 1325 | "reference": "cdd86616411fc3062368b720b0425de10bd3d579", 1326 | "shasum": "" 1327 | }, 1328 | "require": { 1329 | "php": "^7.3" 1330 | }, 1331 | "require-dev": { 1332 | "phpunit/phpunit": "^9.0" 1333 | }, 1334 | "type": "library", 1335 | "extra": { 1336 | "branch-alias": { 1337 | "dev-master": "4.0-dev" 1338 | } 1339 | }, 1340 | "autoload": { 1341 | "classmap": [ 1342 | "src/" 1343 | ] 1344 | }, 1345 | "notification-url": "https://packagist.org/downloads/", 1346 | "license": [ 1347 | "BSD-3-Clause" 1348 | ], 1349 | "authors": [ 1350 | { 1351 | "name": "Sebastian Bergmann", 1352 | "email": "sebastian@phpunit.de" 1353 | }, 1354 | { 1355 | "name": "Jeff Welch", 1356 | "email": "whatthejeff@gmail.com" 1357 | }, 1358 | { 1359 | "name": "Adam Harvey", 1360 | "email": "aharvey@php.net" 1361 | } 1362 | ], 1363 | "description": "Provides functionality to recursively process PHP variables", 1364 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1365 | "time": "2020-02-07T06:18:20+00:00" 1366 | }, 1367 | { 1368 | "name": "sebastian/resource-operations", 1369 | "version": "3.0.0", 1370 | "source": { 1371 | "type": "git", 1372 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1373 | "reference": "8c98bf0dfa1f9256d0468b9803a1e1df31b6fa98" 1374 | }, 1375 | "dist": { 1376 | "type": "zip", 1377 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/8c98bf0dfa1f9256d0468b9803a1e1df31b6fa98", 1378 | "reference": "8c98bf0dfa1f9256d0468b9803a1e1df31b6fa98", 1379 | "shasum": "" 1380 | }, 1381 | "require": { 1382 | "php": "^7.3" 1383 | }, 1384 | "require-dev": { 1385 | "phpunit/phpunit": "^9.0" 1386 | }, 1387 | "type": "library", 1388 | "extra": { 1389 | "branch-alias": { 1390 | "dev-master": "3.0-dev" 1391 | } 1392 | }, 1393 | "autoload": { 1394 | "classmap": [ 1395 | "src/" 1396 | ] 1397 | }, 1398 | "notification-url": "https://packagist.org/downloads/", 1399 | "license": [ 1400 | "BSD-3-Clause" 1401 | ], 1402 | "authors": [ 1403 | { 1404 | "name": "Sebastian Bergmann", 1405 | "email": "sebastian@phpunit.de" 1406 | } 1407 | ], 1408 | "description": "Provides a list of PHP built-in functions that operate on resources", 1409 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1410 | "time": "2020-02-07T06:13:02+00:00" 1411 | }, 1412 | { 1413 | "name": "sebastian/type", 1414 | "version": "2.0.0", 1415 | "source": { 1416 | "type": "git", 1417 | "url": "https://github.com/sebastianbergmann/type.git", 1418 | "reference": "9e8f42f740afdea51f5f4e8cec2035580e797ee1" 1419 | }, 1420 | "dist": { 1421 | "type": "zip", 1422 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/9e8f42f740afdea51f5f4e8cec2035580e797ee1", 1423 | "reference": "9e8f42f740afdea51f5f4e8cec2035580e797ee1", 1424 | "shasum": "" 1425 | }, 1426 | "require": { 1427 | "php": "^7.3" 1428 | }, 1429 | "require-dev": { 1430 | "phpunit/phpunit": "^9.0" 1431 | }, 1432 | "type": "library", 1433 | "extra": { 1434 | "branch-alias": { 1435 | "dev-master": "2.0-dev" 1436 | } 1437 | }, 1438 | "autoload": { 1439 | "classmap": [ 1440 | "src/" 1441 | ] 1442 | }, 1443 | "notification-url": "https://packagist.org/downloads/", 1444 | "license": [ 1445 | "BSD-3-Clause" 1446 | ], 1447 | "authors": [ 1448 | { 1449 | "name": "Sebastian Bergmann", 1450 | "email": "sebastian@phpunit.de", 1451 | "role": "lead" 1452 | } 1453 | ], 1454 | "description": "Collection of value objects that represent the types of the PHP type system", 1455 | "homepage": "https://github.com/sebastianbergmann/type", 1456 | "time": "2020-02-07T06:13:43+00:00" 1457 | }, 1458 | { 1459 | "name": "sebastian/version", 1460 | "version": "3.0.0", 1461 | "source": { 1462 | "type": "git", 1463 | "url": "https://github.com/sebastianbergmann/version.git", 1464 | "reference": "0411bde656dce64202b39c2f4473993a9081d39e" 1465 | }, 1466 | "dist": { 1467 | "type": "zip", 1468 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/0411bde656dce64202b39c2f4473993a9081d39e", 1469 | "reference": "0411bde656dce64202b39c2f4473993a9081d39e", 1470 | "shasum": "" 1471 | }, 1472 | "require": { 1473 | "php": "^7.3" 1474 | }, 1475 | "type": "library", 1476 | "extra": { 1477 | "branch-alias": { 1478 | "dev-master": "3.0-dev" 1479 | } 1480 | }, 1481 | "autoload": { 1482 | "classmap": [ 1483 | "src/" 1484 | ] 1485 | }, 1486 | "notification-url": "https://packagist.org/downloads/", 1487 | "license": [ 1488 | "BSD-3-Clause" 1489 | ], 1490 | "authors": [ 1491 | { 1492 | "name": "Sebastian Bergmann", 1493 | "email": "sebastian@phpunit.de", 1494 | "role": "lead" 1495 | } 1496 | ], 1497 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1498 | "homepage": "https://github.com/sebastianbergmann/version", 1499 | "time": "2020-01-21T06:36:37+00:00" 1500 | }, 1501 | { 1502 | "name": "symfony/polyfill-ctype", 1503 | "version": "v1.14.0", 1504 | "source": { 1505 | "type": "git", 1506 | "url": "https://github.com/symfony/polyfill-ctype.git", 1507 | "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38" 1508 | }, 1509 | "dist": { 1510 | "type": "zip", 1511 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", 1512 | "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38", 1513 | "shasum": "" 1514 | }, 1515 | "require": { 1516 | "php": ">=5.3.3" 1517 | }, 1518 | "suggest": { 1519 | "ext-ctype": "For best performance" 1520 | }, 1521 | "type": "library", 1522 | "extra": { 1523 | "branch-alias": { 1524 | "dev-master": "1.14-dev" 1525 | } 1526 | }, 1527 | "autoload": { 1528 | "psr-4": { 1529 | "Symfony\\Polyfill\\Ctype\\": "" 1530 | }, 1531 | "files": [ 1532 | "bootstrap.php" 1533 | ] 1534 | }, 1535 | "notification-url": "https://packagist.org/downloads/", 1536 | "license": [ 1537 | "MIT" 1538 | ], 1539 | "authors": [ 1540 | { 1541 | "name": "Gert de Pagter", 1542 | "email": "BackEndTea@gmail.com" 1543 | }, 1544 | { 1545 | "name": "Symfony Community", 1546 | "homepage": "https://symfony.com/contributors" 1547 | } 1548 | ], 1549 | "description": "Symfony polyfill for ctype functions", 1550 | "homepage": "https://symfony.com", 1551 | "keywords": [ 1552 | "compatibility", 1553 | "ctype", 1554 | "polyfill", 1555 | "portable" 1556 | ], 1557 | "time": "2020-01-13T11:15:53+00:00" 1558 | }, 1559 | { 1560 | "name": "theseer/tokenizer", 1561 | "version": "1.1.3", 1562 | "source": { 1563 | "type": "git", 1564 | "url": "https://github.com/theseer/tokenizer.git", 1565 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" 1566 | }, 1567 | "dist": { 1568 | "type": "zip", 1569 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 1570 | "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", 1571 | "shasum": "" 1572 | }, 1573 | "require": { 1574 | "ext-dom": "*", 1575 | "ext-tokenizer": "*", 1576 | "ext-xmlwriter": "*", 1577 | "php": "^7.0" 1578 | }, 1579 | "type": "library", 1580 | "autoload": { 1581 | "classmap": [ 1582 | "src/" 1583 | ] 1584 | }, 1585 | "notification-url": "https://packagist.org/downloads/", 1586 | "license": [ 1587 | "BSD-3-Clause" 1588 | ], 1589 | "authors": [ 1590 | { 1591 | "name": "Arne Blankerts", 1592 | "email": "arne@blankerts.de", 1593 | "role": "Developer" 1594 | } 1595 | ], 1596 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1597 | "time": "2019-06-13T22:48:21+00:00" 1598 | }, 1599 | { 1600 | "name": "webmozart/assert", 1601 | "version": "1.7.0", 1602 | "source": { 1603 | "type": "git", 1604 | "url": "https://github.com/webmozart/assert.git", 1605 | "reference": "aed98a490f9a8f78468232db345ab9cf606cf598" 1606 | }, 1607 | "dist": { 1608 | "type": "zip", 1609 | "url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598", 1610 | "reference": "aed98a490f9a8f78468232db345ab9cf606cf598", 1611 | "shasum": "" 1612 | }, 1613 | "require": { 1614 | "php": "^5.3.3 || ^7.0", 1615 | "symfony/polyfill-ctype": "^1.8" 1616 | }, 1617 | "conflict": { 1618 | "vimeo/psalm": "<3.6.0" 1619 | }, 1620 | "require-dev": { 1621 | "phpunit/phpunit": "^4.8.36 || ^7.5.13" 1622 | }, 1623 | "type": "library", 1624 | "autoload": { 1625 | "psr-4": { 1626 | "Webmozart\\Assert\\": "src/" 1627 | } 1628 | }, 1629 | "notification-url": "https://packagist.org/downloads/", 1630 | "license": [ 1631 | "MIT" 1632 | ], 1633 | "authors": [ 1634 | { 1635 | "name": "Bernhard Schussek", 1636 | "email": "bschussek@gmail.com" 1637 | } 1638 | ], 1639 | "description": "Assertions to validate method input/output with nice error messages.", 1640 | "keywords": [ 1641 | "assert", 1642 | "check", 1643 | "validate" 1644 | ], 1645 | "time": "2020-02-14T12:15:55+00:00" 1646 | } 1647 | ], 1648 | "aliases": [], 1649 | "minimum-stability": "stable", 1650 | "stability-flags": [], 1651 | "prefer-stable": false, 1652 | "prefer-lowest": false, 1653 | "platform": { 1654 | "php": "^7.3" 1655 | }, 1656 | "platform-dev": [], 1657 | "plugin-api-version": "1.1.0" 1658 | } 1659 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | services: 3 | app: 4 | container_name: app_php 5 | image: app-dev 6 | env_file: 7 | - .docker/shared_env 8 | build: 9 | target: dev 10 | context: . 11 | dockerfile: .docker/app/Dockerfile 12 | volumes: 13 | - .:/php/src/initx/php-docker-skeleton 14 | 15 | nginx: 16 | container_name: app_nginx 17 | image: app-nginx 18 | env_file: 19 | - .docker/shared_env 20 | build: 21 | context: . 22 | target: dev 23 | dockerfile: .docker/nginx/Dockerfile 24 | ports: 25 | - "8080:80" 26 | links: 27 | - app 28 | volumes: 29 | - .docker/logs/nginx:/var/log/nginx 30 | - .:/php/src/initx/php-docker-skeleton 31 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | render('hi', ['number' => $number]); 9 | -------------------------------------------------------------------------------- /src/template/hi.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | php-docker-skeleton 9 | 10 | 11 | 12 |
13 |
14 |
15 |

16 | Hello! Your lucky number is: 17 |
18 | e($number)?> 19 |

20 |
21 |
22 |
23 | 24 | 25 | --------------------------------------------------------------------------------