├── php.ini ├── public ├── assets │ ├── css │ │ └── style.css │ └── images │ │ └── favicon.png ├── .htaccess └── index.php ├── phpstan.neon ├── captain-definition ├── .gitignore ├── .tours ├── simple_MVC.png ├── routing_meme.jpg ├── code_tour_menu.png ├── schema_1_routing.png ├── photo-1632178151697-fd971baa906f.jpg ├── simple-mvc.tour └── routing.tour ├── docker-entry.sh ├── src ├── View │ ├── Item │ │ ├── add.html.twig │ │ ├── edit.html.twig │ │ ├── _form.html.twig │ │ ├── index.html.twig │ │ └── show.html.twig │ ├── Home │ │ └── index.html.twig │ └── layout.html.twig ├── Controller │ ├── HomeController.php │ ├── AbstractController.php │ └── ItemController.php ├── routes.php ├── Model │ ├── Connection.php │ ├── ItemManager.php │ └── AbstractManager.php └── routing.php ├── config ├── db.php.dist ├── debug.php └── config.php ├── grumphp.yml ├── .editorconfig ├── .github └── workflows │ ├── deploy.yml │ └── main.yml ├── phpcs.xml ├── composer.json ├── migration.php ├── nginx.conf ├── Dockerfile ├── phpmd.xml ├── database.sql ├── README.md └── composer.lock /php.ini: -------------------------------------------------------------------------------- 1 | upload_max_filesize=40M 2 | post_max_size=40M -------------------------------------------------------------------------------- /public/assets/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | color: #f76c6c; 3 | } -------------------------------------------------------------------------------- /phpstan.neon: -------------------------------------------------------------------------------- 1 | parameters: 2 | ignoreErrors: 3 | - '#Constant [A-Z_]+ not found.#' 4 | -------------------------------------------------------------------------------- /captain-definition: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion" :2 , 3 | "dockerfilePath" : "./Dockerfile" 4 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | /temp/* 3 | .phpcs-cache 4 | *.cache 5 | db.php 6 | .idea 7 | .vscode 8 | -------------------------------------------------------------------------------- /.tours/simple_MVC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WildCodeSchool/simple-mvc-old-caprover/HEAD/.tours/simple_MVC.png -------------------------------------------------------------------------------- /.tours/routing_meme.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WildCodeSchool/simple-mvc-old-caprover/HEAD/.tours/routing_meme.jpg -------------------------------------------------------------------------------- /.tours/code_tour_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WildCodeSchool/simple-mvc-old-caprover/HEAD/.tours/code_tour_menu.png -------------------------------------------------------------------------------- /.tours/schema_1_routing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WildCodeSchool/simple-mvc-old-caprover/HEAD/.tours/schema_1_routing.png -------------------------------------------------------------------------------- /docker-entry.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | set -e 3 | 4 | php /var/www/migration.php 5 | 6 | 7 | php-fpm -D 8 | nginx -g 'daemon off;' 9 | -------------------------------------------------------------------------------- /public/assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WildCodeSchool/simple-mvc-old-caprover/HEAD/public/assets/images/favicon.png -------------------------------------------------------------------------------- /.tours/photo-1632178151697-fd971baa906f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WildCodeSchool/simple-mvc-old-caprover/HEAD/.tours/photo-1632178151697-fd971baa906f.jpg -------------------------------------------------------------------------------- /src/View/Item/add.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 |

Add a new item

5 | {% include 'Item/_form.html.twig' %} 6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /config/db.php.dist: -------------------------------------------------------------------------------- 1 | prependHandler(new PrettyPageHandler()); 8 | $whoops->register(); 9 | -------------------------------------------------------------------------------- /src/View/Home/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 |

Hello Wilder !

5 |

Find a complete CRUD example on /items page.

6 | {% endblock %} 7 | -------------------------------------------------------------------------------- /src/View/Item/edit.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 |

Edit item {{ item.title }}

5 | {% include 'Item/_form.html.twig' %} 6 | Back 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /src/View/Item/_form.html.twig: -------------------------------------------------------------------------------- 1 | {# TODO : manage errors display #} 2 | 3 |
4 | 5 | 6 | 7 | 8 |
9 | -------------------------------------------------------------------------------- /grumphp.yml: -------------------------------------------------------------------------------- 1 | grumphp: 2 | tasks: 3 | phpcs: 4 | standard: ./phpcs.xml 5 | phpstan: 6 | configuration: ./phpstan.neon 7 | level: 5 8 | phpmd: 9 | whitelist_patterns: 10 | - 'src' 11 | ruleset: 12 | - 'phpmd.xml' 13 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | # This will prevent generating "Not Found" error in browser 2 | # Then we will manually do the rest to produce page for user 3 | 4 | RewriteEngine On 5 | RewriteCond %{REQUEST_FILENAME} !-f 6 | RewriteCond %{REQUEST_FILENAME} !-d 7 | RewriteRule . index.php [L] 8 | 9 | -------------------------------------------------------------------------------- /src/Controller/HomeController.php: -------------------------------------------------------------------------------- 1 | twig->render('Home/index.html.twig'); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | Items 5 | 12 | Ajouter 13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /src/View/Item/show.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'layout.html.twig' %} 2 | 3 | {% block content %} 4 |

Item {{ item.title }}

5 |

{{ item.id }}. {{ item.title }}

6 | Edit 7 |
8 | 9 | 10 |
11 | Back 12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is an automatic configuration of some points for this project 2 | # In order for your IDE to handle this file, you probably must install an plugin to it. 3 | # Just look for somthing like "editorconfig" plugin. Then, you have nothing else to do :). 4 | # https://EditorConfig.org 5 | 6 | root = true 7 | 8 | [*] 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | end_of_line = lf 12 | charset = utf-8 13 | tab_width = 4 14 | indent_size = 4 15 | indent_style = space 16 | 17 | [Makefile*] 18 | indent_style = tab 19 | -------------------------------------------------------------------------------- /config/config.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | {% block title %}{% endblock %} 10 | 11 | 12 | {% block stylesheet %}{% endblock %} 13 | 14 | 15 | 16 | {% block content %}{% endblock %} 17 | {% block javascript %}{% endblock %} 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/routes.php: -------------------------------------------------------------------------------- 1 | edit(1) 9 | return [ 10 | '' => ['HomeController', 'index',], 11 | 'items' => ['ItemController', 'index',], 12 | 'items/edit' => ['ItemController', 'edit', ['id']], 13 | 'items/show' => ['ItemController', 'show', ['id']], 14 | 'items/add' => ['ItemController', 'add',], 15 | 'items/delete' => ['ItemController', 'delete',], 16 | ]; 17 | -------------------------------------------------------------------------------- /src/Controller/AbstractController.php: -------------------------------------------------------------------------------- 1 | twig = new Environment( 21 | $loader, 22 | [ 23 | 'cache' => false, 24 | 'debug' => true, 25 | ] 26 | ); 27 | $this->twig->addExtension(new DebugExtension()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: deploy 2 | on: 3 | push: 4 | branches: [ main ] 5 | 6 | jobs: 7 | # This workflow contains a single job called "build" 8 | build: 9 | # The type of runner that the job will run on 10 | runs-on: ubuntu-latest 11 | 12 | # Steps represent a sequence of tasks that will be executed as part of the job 13 | steps: 14 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 15 | - uses: actions/checkout@v2 16 | 17 | - uses: actions/setup-node@v2 18 | with: 19 | node-version: '19' 20 | 21 | - name: Install caprover 22 | run: npm install -g caprover 23 | 24 | - name: Caprover Deploy 25 | run: caprover deploy -h '${{ secrets.CAPROVER_SERVER }}' -p '${{ secrets.CAPROVER_PASSWORD }}' -b 'main' -a '${{ secrets.CAPROVER_APP_NAME }}' 26 | -------------------------------------------------------------------------------- /phpcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | End of line character is invalid. 16 | Dear Wilder using Windows, it seems you miss something in readme during project install. You should edit your IDE settings as recommended in the install instruction. 17 | 18 | 19 | config/ 20 | public/ 21 | src/ 22 | 23 | -------------------------------------------------------------------------------- /src/Model/Connection.php: -------------------------------------------------------------------------------- 1 | connection = new PDO( 21 | 'mysql:host=' . $this->host . '; dbname=' . $this->database . '; charset=utf8', 22 | $this->user, 23 | $this->password 24 | ); 25 | 26 | $this->connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 27 | } 28 | 29 | public function getconnection(): PDO 30 | { 31 | return $this->connection; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wildcodeschool/simple-mvc", 3 | "description": "Simple from scratch PHP MVC for WildCodeSchool students", 4 | "authors": [ 5 | { 6 | "name": "Aurelien", 7 | "email": "aurelien.barbier@wildcodeschool.com" 8 | } 9 | ], 10 | "minimum-stability": "stable", 11 | "require": { 12 | "twig/twig": "^3.1", 13 | "ext-pdo": "*" 14 | }, 15 | "require-dev": { 16 | "filp/whoops": "^2.14", 17 | "phpmd/phpmd": "^2.12", 18 | "phpro/grumphp": "^1.9", 19 | "phpstan/phpstan": "^1.5", 20 | "squizlabs/php_codesniffer": "^3.6" 21 | }, 22 | "autoload": { 23 | "psr-4": { 24 | "App\\": "src/" 25 | } 26 | }, 27 | "config": { 28 | "allow-plugins": { 29 | "phpro/grumphp": true 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /migration.php: -------------------------------------------------------------------------------- 1 | exec('DROP DATABASE IF EXISTS ' . DB_NAME); 20 | $pdo->exec('CREATE DATABASE ' . DB_NAME); 21 | $pdo->exec('USE ' . DB_NAME); 22 | 23 | if (is_file(DB_DUMP_PATH) && is_readable(DB_DUMP_PATH)) { 24 | $sql = file_get_contents(DB_DUMP_PATH); 25 | $statement = $pdo->prepare($sql); 26 | $statement->execute(); 27 | } else { 28 | echo DB_DUMP_PATH . ' file does not exist'; 29 | } 30 | } catch (PDOException $exception) { 31 | echo $exception->getMessage(); 32 | } 33 | -------------------------------------------------------------------------------- /nginx.conf: -------------------------------------------------------------------------------- 1 | events { 2 | worker_connections 1024; 3 | } 4 | http { 5 | server { 6 | listen 80 default_server; 7 | server_name _; 8 | index index.php index.html; 9 | error_log /var/log/nginx/error.log; 10 | access_log /var/log/nginx/access.log; 11 | root /var/www/public; 12 | include /etc/nginx/mime.types; 13 | location ~ \.php$ { 14 | try_files $uri =404; 15 | fastcgi_split_path_info ^(.+\.php)(/.+)$; 16 | #this name should be container name 17 | fastcgi_pass localhost:9000; 18 | fastcgi_index index.php; 19 | include fastcgi_params; 20 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 21 | fastcgi_param PATH_INFO $fastcgi_path_info; 22 | } 23 | location / { 24 | try_files $uri $uri/ /index.php?$query_string; 25 | gzip_static on; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Model/ItemManager.php: -------------------------------------------------------------------------------- 1 | pdo->prepare("INSERT INTO " . self::TABLE . " (`title`) VALUES (:title)"); 17 | $statement->bindValue('title', $item['title'], PDO::PARAM_STR); 18 | 19 | $statement->execute(); 20 | return (int)$this->pdo->lastInsertId(); 21 | } 22 | 23 | /** 24 | * Update item in database 25 | */ 26 | public function update(array $item): bool 27 | { 28 | $statement = $this->pdo->prepare("UPDATE " . self::TABLE . " SET `title` = :title WHERE id=:id"); 29 | $statement->bindValue('id', $item['id'], PDO::PARAM_INT); 30 | $statement->bindValue('title', $item['title'], PDO::PARAM_STR); 31 | 32 | return $statement->execute(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # 2 | # Stage 1 - Prep App's PHP Dependencies 3 | # 4 | FROM composer:latest as vendor 5 | 6 | WORKDIR /app 7 | 8 | COPY composer.json composer.json 9 | COPY composer.lock composer.lock 10 | 11 | RUN composer install \ 12 | --ignore-platform-reqs \ 13 | --no-interaction \ 14 | --no-plugins \ 15 | --no-scripts \ 16 | --prefer-dist \ 17 | --quiet 18 | 19 | 20 | # end Stage 1 # 21 | 22 | 23 | FROM php:8.0-fpm-alpine as phpserver 24 | 25 | # add cli tools 26 | RUN apk update \ 27 | && apk upgrade \ 28 | && apk add nginx 29 | 30 | # silently install 'docker-php-ext-install' extensions 31 | RUN set -x 32 | 33 | RUN docker-php-ext-install pdo_mysql bcmath > /dev/null 34 | 35 | COPY nginx.conf /etc/nginx/nginx.conf 36 | 37 | WORKDIR /var/www 38 | 39 | COPY . /var/www/ 40 | COPY --from=vendor /app/vendor/ /var/www/vendor 41 | 42 | RUN mkdir -p /var/www/public/uploads/ 43 | 44 | # RUN chown -R www-data:www-data /var/www/ 45 | 46 | RUN adduser nginx www-data \ 47 | && chgrp -R www-data /var/www/public/uploads/ \ 48 | && chmod -R 775 /var/www/public/uploads/ 49 | 50 | 51 | EXPOSE 80 52 | 53 | COPY docker-entry.sh /etc/entrypoint.sh 54 | ENTRYPOINT ["sh", "/etc/entrypoint.sh"] 55 | -------------------------------------------------------------------------------- /phpmd.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | src/Migrations 37 | 38 | -------------------------------------------------------------------------------- /src/Model/AbstractManager.php: -------------------------------------------------------------------------------- 1 | pdo = $connection->getConnection(); 21 | } 22 | 23 | /** 24 | * Get all row from database. 25 | */ 26 | public function selectAll(string $orderBy = '', string $direction = 'ASC'): array 27 | { 28 | $query = 'SELECT * FROM ' . static::TABLE; 29 | if ($orderBy) { 30 | $query .= ' ORDER BY ' . $orderBy . ' ' . $direction; 31 | } 32 | 33 | return $this->pdo->query($query)->fetchAll(); 34 | } 35 | 36 | /** 37 | * Get one row from database by ID. 38 | */ 39 | public function selectOneById(int $id): array|false 40 | { 41 | // prepared request 42 | $statement = $this->pdo->prepare("SELECT * FROM " . static::TABLE . " WHERE id=:id"); 43 | $statement->bindValue('id', $id, \PDO::PARAM_INT); 44 | $statement->execute(); 45 | 46 | return $statement->fetch(); 47 | } 48 | 49 | /** 50 | * Delete row form an ID 51 | */ 52 | public function delete(int $id): void 53 | { 54 | // prepared request 55 | $statement = $this->pdo->prepare("DELETE FROM " . static::TABLE . " WHERE id=:id"); 56 | $statement->bindValue('id', $id, \PDO::PARAM_INT); 57 | $statement->execute(); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /database.sql: -------------------------------------------------------------------------------- 1 | -- phpMyAdmin SQL Dump 2 | -- version 4.5.4.1deb2ubuntu2 3 | -- http://www.phpmyadmin.net 4 | -- 5 | -- Client : localhost 6 | -- Généré le : Jeu 26 Octobre 2017 à 13:53 7 | -- Version du serveur : 5.7.19-0ubuntu0.16.04.1 8 | -- Version de PHP : 7.0.22-0ubuntu0.16.04.1 9 | 10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 11 | SET time_zone = "+00:00"; 12 | 13 | 14 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 15 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 16 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 17 | /*!40101 SET NAMES utf8mb4 */; 18 | 19 | -- 20 | -- Base de données : `simple-mvc` 21 | -- 22 | 23 | -- -------------------------------------------------------- 24 | 25 | -- 26 | -- Structure de la table `item` 27 | -- 28 | 29 | CREATE TABLE `item` ( 30 | `id` int(11) UNSIGNED NOT NULL, 31 | `title` varchar(255) NOT NULL 32 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 33 | 34 | -- 35 | -- Contenu de la table `item` 36 | -- 37 | 38 | INSERT INTO `item` (`id`, `title`) VALUES 39 | (1, 'Stuff'), 40 | (2, 'Doodads'); 41 | 42 | -- 43 | -- Index pour les tables exportées 44 | -- 45 | 46 | -- 47 | -- Index pour la table `item` 48 | -- 49 | ALTER TABLE `item` 50 | ADD PRIMARY KEY (`id`); 51 | 52 | -- 53 | -- AUTO_INCREMENT pour les tables exportées 54 | -- 55 | 56 | -- 57 | -- AUTO_INCREMENT pour la table `item` 58 | -- 59 | ALTER TABLE `item` 60 | MODIFY `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; 61 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 62 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 63 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 64 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: CI 4 | 5 | # Controls when the action will run. Triggers the workflow on push or pull request 6 | # events but only for the master branch 7 | on: 8 | push: 9 | branches: [ dev, master ] 10 | pull_request: 11 | branches: [ dev, master ] 12 | 13 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 14 | jobs: 15 | 16 | build: 17 | # The type of runner that the job will run on 18 | runs-on: ubuntu-latest 19 | 20 | # Steps represent a sequence of tasks that will be executed as part of the job 21 | steps: 22 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 23 | - uses: actions/checkout@v2 24 | 25 | # Runs a set of commands using the runners shell 26 | - name: checks_directory 27 | run: | 28 | if [ -d "./.idea" ]; then echo "Forbidden PHPStorm folder (.idea/) found ! Please, ignore in .gitignore"; exit 2; fi 29 | if [ -d "./.vscode" ]; then echo "Forbidden VScode folder (.vscode) found ! Please, ignore in .gitignore"; exit 2; fi 30 | if [ $(find ./ -name .DS_Store) ]; then echo "Forbidden MacOS boring file (.DS_Store) found ! Please, ignore in .gitignore"; exit 2; fi 31 | if [ -d "./vendor" ]; then echo "Forbidden external libs folder (vendor/) found !"; exit 2; fi 32 | 33 | # Runs a single command using the runners shell 34 | - name: Composer 35 | run: composer install 36 | 37 | - name: code_quality 38 | run: | 39 | ./vendor/bin/phpcs 40 | ./vendor/bin/phpstan analyse src --level 5 41 | ./vendor/bin/phpmd src text phpmd.xml 42 | -------------------------------------------------------------------------------- /src/routing.php: -------------------------------------------------------------------------------- 1 | $method(...$parameters); 38 | } catch (Exception $e) { 39 | // if an exception is thrown during controller execution 40 | if (isset($whoops)) { 41 | echo $whoops->handleException($e); 42 | } else { 43 | header("HTTP/1.0 500 Internal Server Error"); 44 | echo '500 - Internal Server Error'; 45 | exit(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/Controller/ItemController.php: -------------------------------------------------------------------------------- 1 | selectAll('title'); 16 | 17 | return $this->twig->render('Item/index.html.twig', ['items' => $items]); 18 | } 19 | 20 | /** 21 | * Show informations for a specific item 22 | */ 23 | public function show(int $id): string 24 | { 25 | $itemManager = new ItemManager(); 26 | $item = $itemManager->selectOneById($id); 27 | 28 | return $this->twig->render('Item/show.html.twig', ['item' => $item]); 29 | } 30 | 31 | /** 32 | * Edit a specific item 33 | */ 34 | public function edit(int $id): ?string 35 | { 36 | $itemManager = new ItemManager(); 37 | $item = $itemManager->selectOneById($id); 38 | 39 | if ($_SERVER['REQUEST_METHOD'] === 'POST') { 40 | // clean $_POST data 41 | $item = array_map('trim', $_POST); 42 | 43 | // TODO validations (length, format...) 44 | 45 | // if validation is ok, update and redirection 46 | $itemManager->update($item); 47 | 48 | header('Location: /items/show?id=' . $id); 49 | 50 | // we are redirecting so we don't want any content rendered 51 | return null; 52 | } 53 | 54 | return $this->twig->render('Item/edit.html.twig', [ 55 | 'item' => $item, 56 | ]); 57 | } 58 | 59 | /** 60 | * Add a new item 61 | */ 62 | public function add(): ?string 63 | { 64 | if ($_SERVER['REQUEST_METHOD'] === 'POST') { 65 | // clean $_POST data 66 | $item = array_map('trim', $_POST); 67 | 68 | // TODO validations (length, format...) 69 | 70 | // if validation is ok, insert and redirection 71 | $itemManager = new ItemManager(); 72 | $id = $itemManager->insert($item); 73 | 74 | header('Location:/items/show?id=' . $id); 75 | return null; 76 | } 77 | 78 | return $this->twig->render('Item/add.html.twig'); 79 | } 80 | 81 | /** 82 | * Delete a specific item 83 | */ 84 | public function delete(): void 85 | { 86 | if ($_SERVER['REQUEST_METHOD'] === 'POST') { 87 | $id = trim($_POST['id']); 88 | $itemManager = new ItemManager(); 89 | $itemManager->delete((int)$id); 90 | 91 | header('Location:/items'); 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /.tours/simple-mvc.tour: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://aka.ms/codetour-schema", 3 | "title": "01 - Simple-MVC Introduction", 4 | "steps": [ 5 | { 6 | "file": "public/index.php", 7 | "selection": { 8 | "start": { 9 | "line": 1, 10 | "character": 1 11 | }, 12 | "end": { 13 | "line": 1, 14 | "character": 6 15 | } 16 | }, 17 | "description": "`index.php` est la porte d'entrée de notre application. Chaque requête HTTP devra obligatoirement passer par ce fichier.\r\n\r\n![Simple MVC](./.tours/simple_MVC.png)" 18 | }, 19 | { 20 | "file": "public/index.php", 21 | "description": "Retour sur `index.php`, ici la première étape est de charger différents outils dont on a besoin :\r\n- L'autoload (qui permet d'inclure les fihiers php des classes que l'on appelle à la volée)\r\n- La configuration du debug\r\n- La configuration de notre application MVC", 22 | "selection": { 23 | "start": { 24 | "line": 10, 25 | "character": 1 26 | }, 27 | "end": { 28 | "line": 16, 29 | "character": 48 30 | } 31 | }, 32 | "line": 9 33 | }, 34 | { 35 | "file": "public/index.php", 36 | "description": "Fais bien attention à cette ligne : il s'agit du fichier qui contient les informations de connexion de l'application à ta base de données. Il est donc primordial de le personnaliser pour que l'application MVC fonctionne sur ton environnement.", 37 | "line": 14, 38 | "selection": { 39 | "start": { 40 | "line": 14, 41 | "character": 1 42 | }, 43 | "end": { 44 | "line": 14, 45 | "character": 48 46 | } 47 | } 48 | }, 49 | { 50 | "file": "config/db.php.dist", 51 | "description": "Avant de débuter une application qui utilise le framework simple-mvc, pense bien à copier ce fichier pour créer ton propre `db.php`. Il te faudra ensuite remplacer les paramètres de connection à la BDD : \r\n- APP_DB_USER : L'identifiant de connexion à ta BDD\r\n- APP_DB_PASSWORD : Le mot de passe de connexion à ta DB\r\n- APP_DB_HOST : L'adresse de ton server de BDD\r\n- APP_DB_NAME : Le nom de la BDD à laquelle tu veux te connecter", 52 | "selection": { 53 | "start": { 54 | "line": 16, 55 | "character": 1 56 | }, 57 | "end": { 58 | "line": 20, 59 | "character": 1 60 | } 61 | }, 62 | "line": 20 63 | }, 64 | { 65 | "file": "public/index.php", 66 | "description": "Une fois toute la configuration chargée, l'application appelle le fichier `routing.php` afin de distribuer la requête HTTP à la bonne partie de ton code (dans une application MVC, ce sera à un contrôleur)", 67 | "line": 16, 68 | "selection": { 69 | "start": { 70 | "line": 17, 71 | "character": 1 72 | }, 73 | "end": { 74 | "line": 17, 75 | "character": 46 76 | } 77 | } 78 | } 79 | ], 80 | "isPrimary": true 81 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Simple MVC 2 | 3 | ## Description 4 | 5 | This repository is a simple PHP MVC structure from scratch. 6 | 7 | It uses some cool vendors/libraries such as Twig and Grumphp. 8 | For this one, just a simple example where users can choose one of their databases and see tables in it. 9 | 10 | ## Steps 11 | 12 | 1. Clone the repo from Github. 13 | 2. Run `composer install`. 14 | 3. Create _config/db.php_ from _config/db.php.dist_ file and add your DB parameters. Don't delete the _.dist_ file, it must be kept. 15 | 16 | ```php 17 | define('APP_DB_HOST', 'your_db_host'); 18 | define('APP_DB_NAME', 'your_db_name'); 19 | define('APP_DB_USER', 'your_db_user_wich_is_not_root'); 20 | define('APP_DB_PASSWORD', 'your_db_password'); 21 | ``` 22 | 23 | 4. Import _database.sql_ in your SQL server, you can do it manually or use the _migration.php_ script which will import a _database.sql_ file. 24 | 5. Run the internal PHP webserver with `php -S localhost:8000 -t public/`. The option `-t` with `public` as parameter means your localhost will target the `/public` folder. 25 | 6. Go to `localhost:8000` with your favorite browser. 26 | 7. From this starter kit, create your own web application. 27 | 28 | ### Windows Users 29 | 30 | If you develop on Windows, you should edit you git configuration to change your end of line rules with this command : 31 | 32 | `git config --global core.autocrlf true` 33 | 34 | ## Example 35 | 36 | An example (a basic list of items) is provided (you can load the _simple-mvc.sql_ file in a test database). The accessible URLs are : 37 | 38 | - Home page at [localhost:8000/](localhost:8000/) 39 | - Items list at [localhost:8000/items](localhost:8000/items) 40 | - Item details [localhost:8000/items/show?id=:id](localhost:8000/item/show?id=2) 41 | - Item edit [localhost:8000/items/edit?id=:id](localhost:8000/items/edit?id=2) 42 | - Item add [localhost:8000/items/add](localhost:8000/items/add) 43 | - Item deletion [localhost:8000/items/delete?id=:id](localhost:8000/items/delete?id=2) 44 | 45 | You can find all these routes declared in the file `src/routes.php`. This is the very same file where you'll add your own new routes to the application. 46 | 47 | ## How does URL routing work ? 48 | 49 | ![simple_MVC.png](.tours/simple_MVC.png) 50 | 51 | ## Ask for a tour ! 52 | 53 | Guided tour 54 | 55 | We prepare a little guided tour to start with the simple-MVC. 56 | 57 | To take it, you need to install the `Code Tour` extension for Visual Studio Code : [Code Tour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) 58 | 59 | It will give access to a new menu on your IDE where you'll find the different tours about the simple-MVC. Click on play to start one : 60 | 61 | ![menu](.tours/code_tour_menu.png) 62 | 63 | ## Run it on docker 64 | 65 | If you don't know what is docker, skip this chapter. ;) 66 | 67 | Otherwise, you probably see, this project is ready to use with docker. 68 | 69 | To build the image, go into the project directory and in your CLI type: 70 | 71 | ``` 72 | docker build -t simple-mvc-container . 73 | ``` 74 | 75 | then, run it to open it on your localhot : 76 | 77 | ``` 78 | docker run -i -t --name simple-mvc -p 80:80 simple-mvc-container 79 | ``` 80 | -------------------------------------------------------------------------------- /.tours/routing.tour: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://aka.ms/codetour-schema", 3 | "title": "02 - Routing", 4 | "steps": [ 5 | { 6 | "title": "Le routage", 7 | "description": "Le routage est l'étape ou l'on extrait l'URL d'une requête HTTP (la route) afin d'appeler la méthode de contrôleur associée : \r\n\r\n![Schema](./.tours/schema_1_routing.png)" 8 | }, 9 | { 10 | "file": "src/routing.php", 11 | "description": "Pour commencer nous récupérons la route demandée par notre utilisateur (ce qui n'est autre que l'URL sans la partie concernant le domaine).\r\n\r\nPar exemple : \r\n`localhost/items/edit?id=5`\r\n- Le domaine est : `localhost`\r\n- La route est : `items/edit?id=5`\r\n\r\nLa route est facilement récupérable grace à $_SERVER. À l'instar de $_GET ou de $_POST, $_SERVER est un tableau qui contient de nombreuses informations sur le server web (pour en savoir plus : [Doc](https://www.php.net/manual/fr/reserved.variables.server.php)). Ici nous récupérons l'index `PATH_INFO`", 12 | "line": 4, 13 | "selection": { 14 | "start": { 15 | "line": 4, 16 | "character": 1 17 | }, 18 | "end": { 19 | "line": 4, 20 | "character": 49 21 | } 22 | } 23 | }, 24 | { 25 | "file": "src/routing.php", 26 | "selection": { 27 | "start": { 28 | "line": 7, 29 | "character": 1 30 | }, 31 | "end": { 32 | "line": 7, 33 | "character": 55 34 | } 35 | }, 36 | "description": "Afin de savoir quelle partie de notre code appeler, nous devons d'abord charger toutes les routes définies pour notre application. Toutes ses routes sont déclarées dans `routes.php` " 37 | }, 38 | { 39 | "file": "src/routes.php", 40 | "description": "Dans ce tableau, nous déclarons toutes les routes de notre application.\r\n\r\nChaque route appellera une partie spécifique de notre code, et donc présentera un résultat différent.\r\n\r\nLe but d'une route est de guider une requête vers une action d'un contrôleur.\r\n\r\nPar exemple :", 41 | "line": 8, 42 | "selection": { 43 | "start": { 44 | "line": 9, 45 | "character": 1 46 | }, 47 | "end": { 48 | "line": 16, 49 | "character": 3 50 | } 51 | } 52 | }, 53 | { 54 | "file": "src/routes.php", 55 | "selection": { 56 | "start": { 57 | "line": 11, 58 | "character": 5 59 | }, 60 | "end": { 61 | "line": 11, 62 | "character": 12 63 | } 64 | }, 65 | "description": "Ici nous avons la route `items`. Cela signife que notre application a comme porte d'entrée l'URL suivante :\r\n\r\n[http://localhost:8000/items/](http://localhost:8000/items/)" 66 | }, 67 | { 68 | "file": "src/routes.php", 69 | "selection": { 70 | "start": { 71 | "line": 11, 72 | "character": 17 73 | }, 74 | "end": { 75 | "line": 11, 76 | "character": 33 77 | } 78 | }, 79 | "description": "On associe ce point d'entrée à un contrôleur : `ItemController`" 80 | }, 81 | { 82 | "file": "src/Controller/ItemController.php", 83 | "selection": { 84 | "start": { 85 | "line": 7, 86 | "character": 1 87 | }, 88 | "end": { 89 | "line": 7, 90 | "character": 48 91 | } 92 | }, 93 | "description": "Comme tu peux le voir, un contrôleur n'est rien d'autre qu'une classe. Elle a néanmoins un role cruciale dans notre application MVC : c'est elle qui traite la requête HTTP d'entrée, et c'est également elle qui retourne la requête HTTP de réponse." 94 | }, 95 | { 96 | "file": "src/Controller/ItemController.php", 97 | "selection": { 98 | "start": { 99 | "line": 12, 100 | "character": 4 101 | }, 102 | "end": { 103 | "line": 90, 104 | "character": 6 105 | } 106 | }, 107 | "description": "Ce controller a déjà plusieurs fonctions : index(), show(), edit(), ...\r\n\r\nChacune de ces fonctions est une action possible de notre application.\r\n\r\nToutes ces actions retournerons une requête HTTP, qui transportera (ou non) le code HTML de la page à présenter (nottament grace à [TWIG](https://twig.symfony.com)).\r\n\r\nBien sur, comme seule une page doit etre retournée, seule une action doit etre appelée." 108 | }, 109 | { 110 | "file": "src/routes.php", 111 | "selection": { 112 | "start": { 113 | "line": 11, 114 | "character": 35 115 | }, 116 | "end": { 117 | "line": 11, 118 | "character": 42 119 | } 120 | }, 121 | "description": "Et c'est précisément le rôle de ce second parametre.\n\nIci nous déclarons que si on appelle la route `items` (alias [http://localhost:8000/items/](http://localhost:8000/items/)), on appellera alors la function `index()` du contrôleur `ItemController`. Le code déclenché sera donc ..." 122 | }, 123 | { 124 | "file": "src/Controller/ItemController.php", 125 | "selection": { 126 | "start": { 127 | "line": 12, 128 | "character": 5 129 | }, 130 | "end": { 131 | "line": 18, 132 | "character": 6 133 | } 134 | }, 135 | "description": "... Celui-ci !\n\n" 136 | }, 137 | { 138 | "file": "src/routes.php", 139 | "description": "Donc maintenant tu sais créer une route simple dans notre application. Beau boulot 💪!\r\n\r\n![But...](./.tours/routing_meme.jpg)\r\n\r\nNéanmoins, comme les pages ne sont plus seulement statiques à présent, tu devras parfois transmettre des informations supplémentaires qui leur permettront de se construire dynamiquement.\r\n\r\nEt c'est pour cette raison que les routes peuvent également prendre des paramètres 😃!", 140 | "line": 17 141 | }, 142 | { 143 | "file": "src/routes.php", 144 | "selection": { 145 | "start": { 146 | "line": 13, 147 | "character": 5 148 | }, 149 | "end": { 150 | "line": 13, 151 | "character": 17 152 | } 153 | }, 154 | "description": "Cette route par exemple : son but est de présenter les informations d'un item spécifique. Le problème est que dans la base de données, il pourrait y avoir des millions d'items ! Alors comment ne présenter que l'item que l'on souhaite voir 😰?" 155 | }, 156 | { 157 | "file": "src/routes.php", 158 | "selection": { 159 | "start": { 160 | "line": 13, 161 | "character": 48 162 | }, 163 | "end": { 164 | "line": 13, 165 | "character": 54 166 | } 167 | }, 168 | "description": "Et bien c'est le rôle de ce troisième paramètre 😎. Grace à lui on pourra transmettre l'id de l'item spécifique que l'on cherche à voir.\r\n\r\nComme on peut le voir ce troisième paramètre est un tableau, c'est à dire qu'on peut avoir autant de paramètres que nécéssaire dans une route." 169 | }, 170 | { 171 | "file": "src/routes.php", 172 | "selection": { 173 | "start": { 174 | "line": 13, 175 | "character": 49 176 | }, 177 | "end": { 178 | "line": 13, 179 | "character": 53 180 | } 181 | }, 182 | "description": "Sur cette route il n'y en a qu'un : id\r\n\r\nAussi pour contacter cette page, l'url ressemblera à ceci : \r\n[http://localhost:8000/items/show?id=1](http://localhost:8000/items/show?id=1)\r\nCes paramètres supplémentaires sont à passer via la *query string*." 183 | }, 184 | { 185 | "file": "src/Controller/ItemController.php", 186 | "selection": { 187 | "start": { 188 | "line": 24, 189 | "character": 5 190 | }, 191 | "end": { 192 | "line": 30, 193 | "character": 6 194 | } 195 | }, 196 | "description": "Et l'action show() sera appelée." 197 | }, 198 | { 199 | "file": "src/Controller/ItemController.php", 200 | "selection": { 201 | "start": { 202 | "line": 24, 203 | "character": 26 204 | }, 205 | "end": { 206 | "line": 24, 207 | "character": 33 208 | } 209 | }, 210 | "description": "Cette fois la fonction attend un paramètre en entrée.\r\n\r\nEt bien c'est notre router qui lui fournira (dés lors qu'on a bien dit dans la route qu'un paramètre devait etre passé).\r\n\r\nDonc si l'URL [http://localhost:8000/items/show?id=1](http://localhost:8000/items/show?id=1) est appelée, la valeur de `$id` sera de `1`" 211 | }, 212 | { 213 | "file": "src/Controller/ItemController.php", 214 | "selection": { 215 | "start": { 216 | "line": 27, 217 | "character": 8 218 | }, 219 | "end": { 220 | "line": 27, 221 | "character": 50 222 | } 223 | }, 224 | "description": "Ensuite on peut utiliser `$id` pour récupérer le bon item dans notre base de données à l'aide de notre `ItemManager`(qui appartient à la couche Modèle de notre MVC)" 225 | } 226 | ] 227 | } -------------------------------------------------------------------------------- /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": "b460208f445815bff152f8f4f499b9ae", 8 | "packages": [ 9 | { 10 | "name": "symfony/polyfill-ctype", 11 | "version": "v1.25.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/symfony/polyfill-ctype.git", 15 | "reference": "30885182c981ab175d4d034db0f6f469898070ab" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", 20 | "reference": "30885182c981ab175d4d034db0f6f469898070ab", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=7.1" 25 | }, 26 | "provide": { 27 | "ext-ctype": "*" 28 | }, 29 | "suggest": { 30 | "ext-ctype": "For best performance" 31 | }, 32 | "type": "library", 33 | "extra": { 34 | "branch-alias": { 35 | "dev-main": "1.23-dev" 36 | }, 37 | "thanks": { 38 | "name": "symfony/polyfill", 39 | "url": "https://github.com/symfony/polyfill" 40 | } 41 | }, 42 | "autoload": { 43 | "files": [ 44 | "bootstrap.php" 45 | ], 46 | "psr-4": { 47 | "Symfony\\Polyfill\\Ctype\\": "" 48 | } 49 | }, 50 | "notification-url": "https://packagist.org/downloads/", 51 | "license": [ 52 | "MIT" 53 | ], 54 | "authors": [ 55 | { 56 | "name": "Gert de Pagter", 57 | "email": "BackEndTea@gmail.com" 58 | }, 59 | { 60 | "name": "Symfony Community", 61 | "homepage": "https://symfony.com/contributors" 62 | } 63 | ], 64 | "description": "Symfony polyfill for ctype functions", 65 | "homepage": "https://symfony.com", 66 | "keywords": [ 67 | "compatibility", 68 | "ctype", 69 | "polyfill", 70 | "portable" 71 | ], 72 | "support": { 73 | "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" 74 | }, 75 | "funding": [ 76 | { 77 | "url": "https://symfony.com/sponsor", 78 | "type": "custom" 79 | }, 80 | { 81 | "url": "https://github.com/fabpot", 82 | "type": "github" 83 | }, 84 | { 85 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 86 | "type": "tidelift" 87 | } 88 | ], 89 | "time": "2021-10-20T20:35:02+00:00" 90 | }, 91 | { 92 | "name": "symfony/polyfill-mbstring", 93 | "version": "v1.25.0", 94 | "source": { 95 | "type": "git", 96 | "url": "https://github.com/symfony/polyfill-mbstring.git", 97 | "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" 98 | }, 99 | "dist": { 100 | "type": "zip", 101 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", 102 | "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", 103 | "shasum": "" 104 | }, 105 | "require": { 106 | "php": ">=7.1" 107 | }, 108 | "provide": { 109 | "ext-mbstring": "*" 110 | }, 111 | "suggest": { 112 | "ext-mbstring": "For best performance" 113 | }, 114 | "type": "library", 115 | "extra": { 116 | "branch-alias": { 117 | "dev-main": "1.23-dev" 118 | }, 119 | "thanks": { 120 | "name": "symfony/polyfill", 121 | "url": "https://github.com/symfony/polyfill" 122 | } 123 | }, 124 | "autoload": { 125 | "files": [ 126 | "bootstrap.php" 127 | ], 128 | "psr-4": { 129 | "Symfony\\Polyfill\\Mbstring\\": "" 130 | } 131 | }, 132 | "notification-url": "https://packagist.org/downloads/", 133 | "license": [ 134 | "MIT" 135 | ], 136 | "authors": [ 137 | { 138 | "name": "Nicolas Grekas", 139 | "email": "p@tchwork.com" 140 | }, 141 | { 142 | "name": "Symfony Community", 143 | "homepage": "https://symfony.com/contributors" 144 | } 145 | ], 146 | "description": "Symfony polyfill for the Mbstring extension", 147 | "homepage": "https://symfony.com", 148 | "keywords": [ 149 | "compatibility", 150 | "mbstring", 151 | "polyfill", 152 | "portable", 153 | "shim" 154 | ], 155 | "support": { 156 | "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" 157 | }, 158 | "funding": [ 159 | { 160 | "url": "https://symfony.com/sponsor", 161 | "type": "custom" 162 | }, 163 | { 164 | "url": "https://github.com/fabpot", 165 | "type": "github" 166 | }, 167 | { 168 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 169 | "type": "tidelift" 170 | } 171 | ], 172 | "time": "2021-11-30T18:21:41+00:00" 173 | }, 174 | { 175 | "name": "twig/twig", 176 | "version": "v3.3.9", 177 | "source": { 178 | "type": "git", 179 | "url": "https://github.com/twigphp/Twig.git", 180 | "reference": "6ff9b0e440fa66f97f207e181c41340ddfa5683d" 181 | }, 182 | "dist": { 183 | "type": "zip", 184 | "url": "https://api.github.com/repos/twigphp/Twig/zipball/6ff9b0e440fa66f97f207e181c41340ddfa5683d", 185 | "reference": "6ff9b0e440fa66f97f207e181c41340ddfa5683d", 186 | "shasum": "" 187 | }, 188 | "require": { 189 | "php": ">=7.2.5", 190 | "symfony/polyfill-ctype": "^1.8", 191 | "symfony/polyfill-mbstring": "^1.3" 192 | }, 193 | "require-dev": { 194 | "psr/container": "^1.0", 195 | "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" 196 | }, 197 | "type": "library", 198 | "extra": { 199 | "branch-alias": { 200 | "dev-master": "3.3-dev" 201 | } 202 | }, 203 | "autoload": { 204 | "psr-4": { 205 | "Twig\\": "src/" 206 | } 207 | }, 208 | "notification-url": "https://packagist.org/downloads/", 209 | "license": [ 210 | "BSD-3-Clause" 211 | ], 212 | "authors": [ 213 | { 214 | "name": "Fabien Potencier", 215 | "email": "fabien@symfony.com", 216 | "homepage": "http://fabien.potencier.org", 217 | "role": "Lead Developer" 218 | }, 219 | { 220 | "name": "Twig Team", 221 | "role": "Contributors" 222 | }, 223 | { 224 | "name": "Armin Ronacher", 225 | "email": "armin.ronacher@active-4.com", 226 | "role": "Project Founder" 227 | } 228 | ], 229 | "description": "Twig, the flexible, fast, and secure template language for PHP", 230 | "homepage": "https://twig.symfony.com", 231 | "keywords": [ 232 | "templating" 233 | ], 234 | "support": { 235 | "issues": "https://github.com/twigphp/Twig/issues", 236 | "source": "https://github.com/twigphp/Twig/tree/v3.3.9" 237 | }, 238 | "funding": [ 239 | { 240 | "url": "https://github.com/fabpot", 241 | "type": "github" 242 | }, 243 | { 244 | "url": "https://tidelift.com/funding/github/packagist/twig/twig", 245 | "type": "tidelift" 246 | } 247 | ], 248 | "time": "2022-03-25T09:37:52+00:00" 249 | } 250 | ], 251 | "packages-dev": [ 252 | { 253 | "name": "amphp/amp", 254 | "version": "v2.6.2", 255 | "source": { 256 | "type": "git", 257 | "url": "https://github.com/amphp/amp.git", 258 | "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb" 259 | }, 260 | "dist": { 261 | "type": "zip", 262 | "url": "https://api.github.com/repos/amphp/amp/zipball/9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", 263 | "reference": "9d5100cebffa729aaffecd3ad25dc5aeea4f13bb", 264 | "shasum": "" 265 | }, 266 | "require": { 267 | "php": ">=7.1" 268 | }, 269 | "require-dev": { 270 | "amphp/php-cs-fixer-config": "dev-master", 271 | "amphp/phpunit-util": "^1", 272 | "ext-json": "*", 273 | "jetbrains/phpstorm-stubs": "^2019.3", 274 | "phpunit/phpunit": "^7 | ^8 | ^9", 275 | "psalm/phar": "^3.11@dev", 276 | "react/promise": "^2" 277 | }, 278 | "type": "library", 279 | "extra": { 280 | "branch-alias": { 281 | "dev-master": "2.x-dev" 282 | } 283 | }, 284 | "autoload": { 285 | "files": [ 286 | "lib/functions.php", 287 | "lib/Internal/functions.php" 288 | ], 289 | "psr-4": { 290 | "Amp\\": "lib" 291 | } 292 | }, 293 | "notification-url": "https://packagist.org/downloads/", 294 | "license": [ 295 | "MIT" 296 | ], 297 | "authors": [ 298 | { 299 | "name": "Daniel Lowrey", 300 | "email": "rdlowrey@php.net" 301 | }, 302 | { 303 | "name": "Aaron Piotrowski", 304 | "email": "aaron@trowski.com" 305 | }, 306 | { 307 | "name": "Bob Weinand", 308 | "email": "bobwei9@hotmail.com" 309 | }, 310 | { 311 | "name": "Niklas Keller", 312 | "email": "me@kelunik.com" 313 | } 314 | ], 315 | "description": "A non-blocking concurrency framework for PHP applications.", 316 | "homepage": "https://amphp.org/amp", 317 | "keywords": [ 318 | "async", 319 | "asynchronous", 320 | "awaitable", 321 | "concurrency", 322 | "event", 323 | "event-loop", 324 | "future", 325 | "non-blocking", 326 | "promise" 327 | ], 328 | "support": { 329 | "irc": "irc://irc.freenode.org/amphp", 330 | "issues": "https://github.com/amphp/amp/issues", 331 | "source": "https://github.com/amphp/amp/tree/v2.6.2" 332 | }, 333 | "funding": [ 334 | { 335 | "url": "https://github.com/amphp", 336 | "type": "github" 337 | } 338 | ], 339 | "time": "2022-02-20T17:52:18+00:00" 340 | }, 341 | { 342 | "name": "amphp/byte-stream", 343 | "version": "v1.8.1", 344 | "source": { 345 | "type": "git", 346 | "url": "https://github.com/amphp/byte-stream.git", 347 | "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd" 348 | }, 349 | "dist": { 350 | "type": "zip", 351 | "url": "https://api.github.com/repos/amphp/byte-stream/zipball/acbd8002b3536485c997c4e019206b3f10ca15bd", 352 | "reference": "acbd8002b3536485c997c4e019206b3f10ca15bd", 353 | "shasum": "" 354 | }, 355 | "require": { 356 | "amphp/amp": "^2", 357 | "php": ">=7.1" 358 | }, 359 | "require-dev": { 360 | "amphp/php-cs-fixer-config": "dev-master", 361 | "amphp/phpunit-util": "^1.4", 362 | "friendsofphp/php-cs-fixer": "^2.3", 363 | "jetbrains/phpstorm-stubs": "^2019.3", 364 | "phpunit/phpunit": "^6 || ^7 || ^8", 365 | "psalm/phar": "^3.11.4" 366 | }, 367 | "type": "library", 368 | "extra": { 369 | "branch-alias": { 370 | "dev-master": "1.x-dev" 371 | } 372 | }, 373 | "autoload": { 374 | "files": [ 375 | "lib/functions.php" 376 | ], 377 | "psr-4": { 378 | "Amp\\ByteStream\\": "lib" 379 | } 380 | }, 381 | "notification-url": "https://packagist.org/downloads/", 382 | "license": [ 383 | "MIT" 384 | ], 385 | "authors": [ 386 | { 387 | "name": "Aaron Piotrowski", 388 | "email": "aaron@trowski.com" 389 | }, 390 | { 391 | "name": "Niklas Keller", 392 | "email": "me@kelunik.com" 393 | } 394 | ], 395 | "description": "A stream abstraction to make working with non-blocking I/O simple.", 396 | "homepage": "http://amphp.org/byte-stream", 397 | "keywords": [ 398 | "amp", 399 | "amphp", 400 | "async", 401 | "io", 402 | "non-blocking", 403 | "stream" 404 | ], 405 | "support": { 406 | "irc": "irc://irc.freenode.org/amphp", 407 | "issues": "https://github.com/amphp/byte-stream/issues", 408 | "source": "https://github.com/amphp/byte-stream/tree/v1.8.1" 409 | }, 410 | "funding": [ 411 | { 412 | "url": "https://github.com/amphp", 413 | "type": "github" 414 | } 415 | ], 416 | "time": "2021-03-30T17:13:30+00:00" 417 | }, 418 | { 419 | "name": "amphp/parallel", 420 | "version": "v1.4.1", 421 | "source": { 422 | "type": "git", 423 | "url": "https://github.com/amphp/parallel.git", 424 | "reference": "fbc128383c1ffb3823866f71b88d8c4722a25ce9" 425 | }, 426 | "dist": { 427 | "type": "zip", 428 | "url": "https://api.github.com/repos/amphp/parallel/zipball/fbc128383c1ffb3823866f71b88d8c4722a25ce9", 429 | "reference": "fbc128383c1ffb3823866f71b88d8c4722a25ce9", 430 | "shasum": "" 431 | }, 432 | "require": { 433 | "amphp/amp": "^2", 434 | "amphp/byte-stream": "^1.6.1", 435 | "amphp/parser": "^1", 436 | "amphp/process": "^1", 437 | "amphp/serialization": "^1", 438 | "amphp/sync": "^1.0.1", 439 | "php": ">=7.1" 440 | }, 441 | "require-dev": { 442 | "amphp/php-cs-fixer-config": "dev-master", 443 | "amphp/phpunit-util": "^1.1", 444 | "phpunit/phpunit": "^8 || ^7" 445 | }, 446 | "type": "library", 447 | "autoload": { 448 | "files": [ 449 | "lib/Context/functions.php", 450 | "lib/Sync/functions.php", 451 | "lib/Worker/functions.php" 452 | ], 453 | "psr-4": { 454 | "Amp\\Parallel\\": "lib" 455 | } 456 | }, 457 | "notification-url": "https://packagist.org/downloads/", 458 | "license": [ 459 | "MIT" 460 | ], 461 | "authors": [ 462 | { 463 | "name": "Aaron Piotrowski", 464 | "email": "aaron@trowski.com" 465 | }, 466 | { 467 | "name": "Stephen Coakley", 468 | "email": "me@stephencoakley.com" 469 | } 470 | ], 471 | "description": "Parallel processing component for Amp.", 472 | "homepage": "https://github.com/amphp/parallel", 473 | "keywords": [ 474 | "async", 475 | "asynchronous", 476 | "concurrent", 477 | "multi-processing", 478 | "multi-threading" 479 | ], 480 | "support": { 481 | "issues": "https://github.com/amphp/parallel/issues", 482 | "source": "https://github.com/amphp/parallel/tree/v1.4.1" 483 | }, 484 | "funding": [ 485 | { 486 | "url": "https://github.com/amphp", 487 | "type": "github" 488 | } 489 | ], 490 | "time": "2021-10-25T19:16:02+00:00" 491 | }, 492 | { 493 | "name": "amphp/parallel-functions", 494 | "version": "v1.1.0", 495 | "source": { 496 | "type": "git", 497 | "url": "https://github.com/amphp/parallel-functions.git", 498 | "reference": "04e92fcacfc921a56dfe12c23b3265e62593a7cb" 499 | }, 500 | "dist": { 501 | "type": "zip", 502 | "url": "https://api.github.com/repos/amphp/parallel-functions/zipball/04e92fcacfc921a56dfe12c23b3265e62593a7cb", 503 | "reference": "04e92fcacfc921a56dfe12c23b3265e62593a7cb", 504 | "shasum": "" 505 | }, 506 | "require": { 507 | "amphp/amp": "^2.0.3", 508 | "amphp/parallel": "^1.4", 509 | "amphp/serialization": "^1.0", 510 | "laravel/serializable-closure": "^1.0", 511 | "php": ">=7.4" 512 | }, 513 | "require-dev": { 514 | "amphp/php-cs-fixer-config": "v2.x-dev", 515 | "amphp/phpunit-util": "^2.0", 516 | "phpunit/phpunit": "^9.5.11" 517 | }, 518 | "type": "library", 519 | "autoload": { 520 | "files": [ 521 | "src/functions.php" 522 | ], 523 | "psr-4": { 524 | "Amp\\ParallelFunctions\\": "src" 525 | } 526 | }, 527 | "notification-url": "https://packagist.org/downloads/", 528 | "license": [ 529 | "MIT" 530 | ], 531 | "authors": [ 532 | { 533 | "name": "Niklas Keller", 534 | "email": "me@kelunik.com" 535 | } 536 | ], 537 | "description": "Parallel processing made simple.", 538 | "support": { 539 | "issues": "https://github.com/amphp/parallel-functions/issues", 540 | "source": "https://github.com/amphp/parallel-functions/tree/v1.1.0" 541 | }, 542 | "funding": [ 543 | { 544 | "url": "https://github.com/amphp", 545 | "type": "github" 546 | } 547 | ], 548 | "time": "2022-02-03T19:32:41+00:00" 549 | }, 550 | { 551 | "name": "amphp/parser", 552 | "version": "v1.0.0", 553 | "source": { 554 | "type": "git", 555 | "url": "https://github.com/amphp/parser.git", 556 | "reference": "f83e68f03d5b8e8e0365b8792985a7f341c57ae1" 557 | }, 558 | "dist": { 559 | "type": "zip", 560 | "url": "https://api.github.com/repos/amphp/parser/zipball/f83e68f03d5b8e8e0365b8792985a7f341c57ae1", 561 | "reference": "f83e68f03d5b8e8e0365b8792985a7f341c57ae1", 562 | "shasum": "" 563 | }, 564 | "require": { 565 | "php": ">=7" 566 | }, 567 | "require-dev": { 568 | "friendsofphp/php-cs-fixer": "^2.3", 569 | "phpunit/phpunit": "^6" 570 | }, 571 | "type": "library", 572 | "autoload": { 573 | "psr-4": { 574 | "Amp\\Parser\\": "lib" 575 | } 576 | }, 577 | "notification-url": "https://packagist.org/downloads/", 578 | "license": [ 579 | "MIT" 580 | ], 581 | "authors": [ 582 | { 583 | "name": "Niklas Keller", 584 | "email": "me@kelunik.com" 585 | }, 586 | { 587 | "name": "Aaron Piotrowski", 588 | "email": "aaron@trowski.com" 589 | } 590 | ], 591 | "description": "A generator parser to make streaming parsers simple.", 592 | "homepage": "https://github.com/amphp/parser", 593 | "keywords": [ 594 | "async", 595 | "non-blocking", 596 | "parser", 597 | "stream" 598 | ], 599 | "support": { 600 | "issues": "https://github.com/amphp/parser/issues", 601 | "source": "https://github.com/amphp/parser/tree/is-valid" 602 | }, 603 | "time": "2017-06-06T05:29:10+00:00" 604 | }, 605 | { 606 | "name": "amphp/process", 607 | "version": "v1.1.3", 608 | "source": { 609 | "type": "git", 610 | "url": "https://github.com/amphp/process.git", 611 | "reference": "f09e3ed3b0a953ccbfff1140f12be4a884f0aa83" 612 | }, 613 | "dist": { 614 | "type": "zip", 615 | "url": "https://api.github.com/repos/amphp/process/zipball/f09e3ed3b0a953ccbfff1140f12be4a884f0aa83", 616 | "reference": "f09e3ed3b0a953ccbfff1140f12be4a884f0aa83", 617 | "shasum": "" 618 | }, 619 | "require": { 620 | "amphp/amp": "^2", 621 | "amphp/byte-stream": "^1.4", 622 | "php": ">=7" 623 | }, 624 | "require-dev": { 625 | "amphp/php-cs-fixer-config": "dev-master", 626 | "amphp/phpunit-util": "^1", 627 | "phpunit/phpunit": "^6" 628 | }, 629 | "type": "library", 630 | "autoload": { 631 | "files": [ 632 | "lib/functions.php" 633 | ], 634 | "psr-4": { 635 | "Amp\\Process\\": "lib" 636 | } 637 | }, 638 | "notification-url": "https://packagist.org/downloads/", 639 | "license": [ 640 | "MIT" 641 | ], 642 | "authors": [ 643 | { 644 | "name": "Bob Weinand", 645 | "email": "bobwei9@hotmail.com" 646 | }, 647 | { 648 | "name": "Aaron Piotrowski", 649 | "email": "aaron@trowski.com" 650 | }, 651 | { 652 | "name": "Niklas Keller", 653 | "email": "me@kelunik.com" 654 | } 655 | ], 656 | "description": "Asynchronous process manager.", 657 | "homepage": "https://github.com/amphp/process", 658 | "support": { 659 | "issues": "https://github.com/amphp/process/issues", 660 | "source": "https://github.com/amphp/process/tree/v1.1.3" 661 | }, 662 | "funding": [ 663 | { 664 | "url": "https://github.com/amphp", 665 | "type": "github" 666 | } 667 | ], 668 | "time": "2021-12-17T19:09:33+00:00" 669 | }, 670 | { 671 | "name": "amphp/serialization", 672 | "version": "v1.0.0", 673 | "source": { 674 | "type": "git", 675 | "url": "https://github.com/amphp/serialization.git", 676 | "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1" 677 | }, 678 | "dist": { 679 | "type": "zip", 680 | "url": "https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1", 681 | "reference": "693e77b2fb0b266c3c7d622317f881de44ae94a1", 682 | "shasum": "" 683 | }, 684 | "require": { 685 | "php": ">=7.1" 686 | }, 687 | "require-dev": { 688 | "amphp/php-cs-fixer-config": "dev-master", 689 | "phpunit/phpunit": "^9 || ^8 || ^7" 690 | }, 691 | "type": "library", 692 | "autoload": { 693 | "files": [ 694 | "src/functions.php" 695 | ], 696 | "psr-4": { 697 | "Amp\\Serialization\\": "src" 698 | } 699 | }, 700 | "notification-url": "https://packagist.org/downloads/", 701 | "license": [ 702 | "MIT" 703 | ], 704 | "authors": [ 705 | { 706 | "name": "Aaron Piotrowski", 707 | "email": "aaron@trowski.com" 708 | }, 709 | { 710 | "name": "Niklas Keller", 711 | "email": "me@kelunik.com" 712 | } 713 | ], 714 | "description": "Serialization tools for IPC and data storage in PHP.", 715 | "homepage": "https://github.com/amphp/serialization", 716 | "keywords": [ 717 | "async", 718 | "asynchronous", 719 | "serialization", 720 | "serialize" 721 | ], 722 | "support": { 723 | "issues": "https://github.com/amphp/serialization/issues", 724 | "source": "https://github.com/amphp/serialization/tree/master" 725 | }, 726 | "time": "2020-03-25T21:39:07+00:00" 727 | }, 728 | { 729 | "name": "amphp/sync", 730 | "version": "v1.4.2", 731 | "source": { 732 | "type": "git", 733 | "url": "https://github.com/amphp/sync.git", 734 | "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf" 735 | }, 736 | "dist": { 737 | "type": "zip", 738 | "url": "https://api.github.com/repos/amphp/sync/zipball/85ab06764f4f36d63b1356b466df6111cf4b89cf", 739 | "reference": "85ab06764f4f36d63b1356b466df6111cf4b89cf", 740 | "shasum": "" 741 | }, 742 | "require": { 743 | "amphp/amp": "^2.2", 744 | "php": ">=7.1" 745 | }, 746 | "require-dev": { 747 | "amphp/php-cs-fixer-config": "dev-master", 748 | "amphp/phpunit-util": "^1.1", 749 | "phpunit/phpunit": "^9 || ^8 || ^7" 750 | }, 751 | "type": "library", 752 | "autoload": { 753 | "files": [ 754 | "src/functions.php", 755 | "src/ConcurrentIterator/functions.php" 756 | ], 757 | "psr-4": { 758 | "Amp\\Sync\\": "src" 759 | } 760 | }, 761 | "notification-url": "https://packagist.org/downloads/", 762 | "license": [ 763 | "MIT" 764 | ], 765 | "authors": [ 766 | { 767 | "name": "Aaron Piotrowski", 768 | "email": "aaron@trowski.com" 769 | }, 770 | { 771 | "name": "Stephen Coakley", 772 | "email": "me@stephencoakley.com" 773 | } 774 | ], 775 | "description": "Mutex, Semaphore, and other synchronization tools for Amp.", 776 | "homepage": "https://github.com/amphp/sync", 777 | "keywords": [ 778 | "async", 779 | "asynchronous", 780 | "mutex", 781 | "semaphore", 782 | "synchronization" 783 | ], 784 | "support": { 785 | "issues": "https://github.com/amphp/sync/issues", 786 | "source": "https://github.com/amphp/sync/tree/v1.4.2" 787 | }, 788 | "funding": [ 789 | { 790 | "url": "https://github.com/amphp", 791 | "type": "github" 792 | } 793 | ], 794 | "time": "2021-10-25T18:29:10+00:00" 795 | }, 796 | { 797 | "name": "composer/pcre", 798 | "version": "3.0.0", 799 | "source": { 800 | "type": "git", 801 | "url": "https://github.com/composer/pcre.git", 802 | "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd" 803 | }, 804 | "dist": { 805 | "type": "zip", 806 | "url": "https://api.github.com/repos/composer/pcre/zipball/e300eb6c535192decd27a85bc72a9290f0d6b3bd", 807 | "reference": "e300eb6c535192decd27a85bc72a9290f0d6b3bd", 808 | "shasum": "" 809 | }, 810 | "require": { 811 | "php": "^7.4 || ^8.0" 812 | }, 813 | "require-dev": { 814 | "phpstan/phpstan": "^1.3", 815 | "phpstan/phpstan-strict-rules": "^1.1", 816 | "symfony/phpunit-bridge": "^5" 817 | }, 818 | "type": "library", 819 | "extra": { 820 | "branch-alias": { 821 | "dev-main": "3.x-dev" 822 | } 823 | }, 824 | "autoload": { 825 | "psr-4": { 826 | "Composer\\Pcre\\": "src" 827 | } 828 | }, 829 | "notification-url": "https://packagist.org/downloads/", 830 | "license": [ 831 | "MIT" 832 | ], 833 | "authors": [ 834 | { 835 | "name": "Jordi Boggiano", 836 | "email": "j.boggiano@seld.be", 837 | "homepage": "http://seld.be" 838 | } 839 | ], 840 | "description": "PCRE wrapping library that offers type-safe preg_* replacements.", 841 | "keywords": [ 842 | "PCRE", 843 | "preg", 844 | "regex", 845 | "regular expression" 846 | ], 847 | "support": { 848 | "issues": "https://github.com/composer/pcre/issues", 849 | "source": "https://github.com/composer/pcre/tree/3.0.0" 850 | }, 851 | "funding": [ 852 | { 853 | "url": "https://packagist.com", 854 | "type": "custom" 855 | }, 856 | { 857 | "url": "https://github.com/composer", 858 | "type": "github" 859 | }, 860 | { 861 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 862 | "type": "tidelift" 863 | } 864 | ], 865 | "time": "2022-02-25T20:21:48+00:00" 866 | }, 867 | { 868 | "name": "composer/xdebug-handler", 869 | "version": "3.0.3", 870 | "source": { 871 | "type": "git", 872 | "url": "https://github.com/composer/xdebug-handler.git", 873 | "reference": "ced299686f41dce890debac69273b47ffe98a40c" 874 | }, 875 | "dist": { 876 | "type": "zip", 877 | "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", 878 | "reference": "ced299686f41dce890debac69273b47ffe98a40c", 879 | "shasum": "" 880 | }, 881 | "require": { 882 | "composer/pcre": "^1 || ^2 || ^3", 883 | "php": "^7.2.5 || ^8.0", 884 | "psr/log": "^1 || ^2 || ^3" 885 | }, 886 | "require-dev": { 887 | "phpstan/phpstan": "^1.0", 888 | "phpstan/phpstan-strict-rules": "^1.1", 889 | "symfony/phpunit-bridge": "^6.0" 890 | }, 891 | "type": "library", 892 | "autoload": { 893 | "psr-4": { 894 | "Composer\\XdebugHandler\\": "src" 895 | } 896 | }, 897 | "notification-url": "https://packagist.org/downloads/", 898 | "license": [ 899 | "MIT" 900 | ], 901 | "authors": [ 902 | { 903 | "name": "John Stevenson", 904 | "email": "john-stevenson@blueyonder.co.uk" 905 | } 906 | ], 907 | "description": "Restarts a process without Xdebug.", 908 | "keywords": [ 909 | "Xdebug", 910 | "performance" 911 | ], 912 | "support": { 913 | "irc": "irc://irc.freenode.org/composer", 914 | "issues": "https://github.com/composer/xdebug-handler/issues", 915 | "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" 916 | }, 917 | "funding": [ 918 | { 919 | "url": "https://packagist.com", 920 | "type": "custom" 921 | }, 922 | { 923 | "url": "https://github.com/composer", 924 | "type": "github" 925 | }, 926 | { 927 | "url": "https://tidelift.com/funding/github/packagist/composer/composer", 928 | "type": "tidelift" 929 | } 930 | ], 931 | "time": "2022-02-25T21:32:43+00:00" 932 | }, 933 | { 934 | "name": "doctrine/collections", 935 | "version": "1.6.8", 936 | "source": { 937 | "type": "git", 938 | "url": "https://github.com/doctrine/collections.git", 939 | "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af" 940 | }, 941 | "dist": { 942 | "type": "zip", 943 | "url": "https://api.github.com/repos/doctrine/collections/zipball/1958a744696c6bb3bb0d28db2611dc11610e78af", 944 | "reference": "1958a744696c6bb3bb0d28db2611dc11610e78af", 945 | "shasum": "" 946 | }, 947 | "require": { 948 | "php": "^7.1.3 || ^8.0" 949 | }, 950 | "require-dev": { 951 | "doctrine/coding-standard": "^9.0", 952 | "phpstan/phpstan": "^0.12", 953 | "phpunit/phpunit": "^7.5 || ^8.5 || ^9.1.5", 954 | "vimeo/psalm": "^4.2.1" 955 | }, 956 | "type": "library", 957 | "autoload": { 958 | "psr-4": { 959 | "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" 960 | } 961 | }, 962 | "notification-url": "https://packagist.org/downloads/", 963 | "license": [ 964 | "MIT" 965 | ], 966 | "authors": [ 967 | { 968 | "name": "Guilherme Blanco", 969 | "email": "guilhermeblanco@gmail.com" 970 | }, 971 | { 972 | "name": "Roman Borschel", 973 | "email": "roman@code-factory.org" 974 | }, 975 | { 976 | "name": "Benjamin Eberlei", 977 | "email": "kontakt@beberlei.de" 978 | }, 979 | { 980 | "name": "Jonathan Wage", 981 | "email": "jonwage@gmail.com" 982 | }, 983 | { 984 | "name": "Johannes Schmitt", 985 | "email": "schmittjoh@gmail.com" 986 | } 987 | ], 988 | "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", 989 | "homepage": "https://www.doctrine-project.org/projects/collections.html", 990 | "keywords": [ 991 | "array", 992 | "collections", 993 | "iterators", 994 | "php" 995 | ], 996 | "support": { 997 | "issues": "https://github.com/doctrine/collections/issues", 998 | "source": "https://github.com/doctrine/collections/tree/1.6.8" 999 | }, 1000 | "time": "2021-08-10T18:51:53+00:00" 1001 | }, 1002 | { 1003 | "name": "filp/whoops", 1004 | "version": "2.14.5", 1005 | "source": { 1006 | "type": "git", 1007 | "url": "https://github.com/filp/whoops.git", 1008 | "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc" 1009 | }, 1010 | "dist": { 1011 | "type": "zip", 1012 | "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", 1013 | "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", 1014 | "shasum": "" 1015 | }, 1016 | "require": { 1017 | "php": "^5.5.9 || ^7.0 || ^8.0", 1018 | "psr/log": "^1.0.1 || ^2.0 || ^3.0" 1019 | }, 1020 | "require-dev": { 1021 | "mockery/mockery": "^0.9 || ^1.0", 1022 | "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", 1023 | "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" 1024 | }, 1025 | "suggest": { 1026 | "symfony/var-dumper": "Pretty print complex values better with var-dumper available", 1027 | "whoops/soap": "Formats errors as SOAP responses" 1028 | }, 1029 | "type": "library", 1030 | "extra": { 1031 | "branch-alias": { 1032 | "dev-master": "2.7-dev" 1033 | } 1034 | }, 1035 | "autoload": { 1036 | "psr-4": { 1037 | "Whoops\\": "src/Whoops/" 1038 | } 1039 | }, 1040 | "notification-url": "https://packagist.org/downloads/", 1041 | "license": [ 1042 | "MIT" 1043 | ], 1044 | "authors": [ 1045 | { 1046 | "name": "Filipe Dobreira", 1047 | "homepage": "https://github.com/filp", 1048 | "role": "Developer" 1049 | } 1050 | ], 1051 | "description": "php error handling for cool kids", 1052 | "homepage": "https://filp.github.io/whoops/", 1053 | "keywords": [ 1054 | "error", 1055 | "exception", 1056 | "handling", 1057 | "library", 1058 | "throwable", 1059 | "whoops" 1060 | ], 1061 | "support": { 1062 | "issues": "https://github.com/filp/whoops/issues", 1063 | "source": "https://github.com/filp/whoops/tree/2.14.5" 1064 | }, 1065 | "funding": [ 1066 | { 1067 | "url": "https://github.com/denis-sokolov", 1068 | "type": "github" 1069 | } 1070 | ], 1071 | "time": "2022-01-07T12:00:00+00:00" 1072 | }, 1073 | { 1074 | "name": "gitonomy/gitlib", 1075 | "version": "v1.3.4", 1076 | "source": { 1077 | "type": "git", 1078 | "url": "https://github.com/gitonomy/gitlib.git", 1079 | "reference": "3c2f67a2fa6e7b26dbc9b9d0ca272ed33ba5895e" 1080 | }, 1081 | "dist": { 1082 | "type": "zip", 1083 | "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/3c2f67a2fa6e7b26dbc9b9d0ca272ed33ba5895e", 1084 | "reference": "3c2f67a2fa6e7b26dbc9b9d0ca272ed33ba5895e", 1085 | "shasum": "" 1086 | }, 1087 | "require": { 1088 | "ext-pcre": "*", 1089 | "php": "^5.6 || ^7.0 || ^8.0", 1090 | "symfony/polyfill-mbstring": "^1.7", 1091 | "symfony/process": "^3.4 || ^4.4 || ^5.0 || ^6.0" 1092 | }, 1093 | "require-dev": { 1094 | "ext-fileinfo": "*", 1095 | "phpunit/phpunit": "^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.20 || ^9.5.9", 1096 | "psr/log": "^1.0" 1097 | }, 1098 | "suggest": { 1099 | "ext-fileinfo": "Required to determine the mimetype of a blob", 1100 | "psr/log": "Required to use loggers for reporting of execution" 1101 | }, 1102 | "type": "library", 1103 | "autoload": { 1104 | "psr-4": { 1105 | "Gitonomy\\Git\\": "src/Gitonomy/Git/" 1106 | } 1107 | }, 1108 | "notification-url": "https://packagist.org/downloads/", 1109 | "license": [ 1110 | "MIT" 1111 | ], 1112 | "authors": [ 1113 | { 1114 | "name": "Graham Campbell", 1115 | "email": "hello@gjcampbell.co.uk", 1116 | "homepage": "https://github.com/GrahamCampbell" 1117 | }, 1118 | { 1119 | "name": "Julien Didier", 1120 | "email": "genzo.wm@gmail.com", 1121 | "homepage": "https://github.com/juliendidier" 1122 | }, 1123 | { 1124 | "name": "Grégoire Pineau", 1125 | "email": "lyrixx@lyrixx.info", 1126 | "homepage": "https://github.com/lyrixx" 1127 | }, 1128 | { 1129 | "name": "Alexandre Salomé", 1130 | "email": "alexandre.salome@gmail.com", 1131 | "homepage": "https://github.com/alexandresalome" 1132 | } 1133 | ], 1134 | "description": "Library for accessing git", 1135 | "support": { 1136 | "issues": "https://github.com/gitonomy/gitlib/issues", 1137 | "source": "https://github.com/gitonomy/gitlib/tree/v1.3.4" 1138 | }, 1139 | "funding": [ 1140 | { 1141 | "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", 1142 | "type": "tidelift" 1143 | } 1144 | ], 1145 | "time": "2022-02-14T09:07:07+00:00" 1146 | }, 1147 | { 1148 | "name": "laravel/serializable-closure", 1149 | "version": "v1.1.1", 1150 | "source": { 1151 | "type": "git", 1152 | "url": "https://github.com/laravel/serializable-closure.git", 1153 | "reference": "9e4b005daa20b0c161f3845040046dc9ddc1d74e" 1154 | }, 1155 | "dist": { 1156 | "type": "zip", 1157 | "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/9e4b005daa20b0c161f3845040046dc9ddc1d74e", 1158 | "reference": "9e4b005daa20b0c161f3845040046dc9ddc1d74e", 1159 | "shasum": "" 1160 | }, 1161 | "require": { 1162 | "php": "^7.3|^8.0" 1163 | }, 1164 | "require-dev": { 1165 | "pestphp/pest": "^1.18", 1166 | "phpstan/phpstan": "^0.12.98", 1167 | "symfony/var-dumper": "^5.3" 1168 | }, 1169 | "type": "library", 1170 | "extra": { 1171 | "branch-alias": { 1172 | "dev-master": "1.x-dev" 1173 | } 1174 | }, 1175 | "autoload": { 1176 | "psr-4": { 1177 | "Laravel\\SerializableClosure\\": "src/" 1178 | } 1179 | }, 1180 | "notification-url": "https://packagist.org/downloads/", 1181 | "license": [ 1182 | "MIT" 1183 | ], 1184 | "authors": [ 1185 | { 1186 | "name": "Taylor Otwell", 1187 | "email": "taylor@laravel.com" 1188 | }, 1189 | { 1190 | "name": "Nuno Maduro", 1191 | "email": "nuno@laravel.com" 1192 | } 1193 | ], 1194 | "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", 1195 | "keywords": [ 1196 | "closure", 1197 | "laravel", 1198 | "serializable" 1199 | ], 1200 | "support": { 1201 | "issues": "https://github.com/laravel/serializable-closure/issues", 1202 | "source": "https://github.com/laravel/serializable-closure" 1203 | }, 1204 | "time": "2022-02-11T19:23:53+00:00" 1205 | }, 1206 | { 1207 | "name": "monolog/monolog", 1208 | "version": "2.4.0", 1209 | "source": { 1210 | "type": "git", 1211 | "url": "https://github.com/Seldaek/monolog.git", 1212 | "reference": "d7fd7450628561ba697b7097d86db72662f54aef" 1213 | }, 1214 | "dist": { 1215 | "type": "zip", 1216 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/d7fd7450628561ba697b7097d86db72662f54aef", 1217 | "reference": "d7fd7450628561ba697b7097d86db72662f54aef", 1218 | "shasum": "" 1219 | }, 1220 | "require": { 1221 | "php": ">=7.2", 1222 | "psr/log": "^1.0.1 || ^2.0 || ^3.0" 1223 | }, 1224 | "provide": { 1225 | "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" 1226 | }, 1227 | "require-dev": { 1228 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 1229 | "doctrine/couchdb": "~1.0@dev", 1230 | "elasticsearch/elasticsearch": "^7", 1231 | "graylog2/gelf-php": "^1.4.2", 1232 | "mongodb/mongodb": "^1.8", 1233 | "php-amqplib/php-amqplib": "~2.4 || ^3", 1234 | "php-console/php-console": "^3.1.3", 1235 | "phpspec/prophecy": "^1.6.1", 1236 | "phpstan/phpstan": "^0.12.91", 1237 | "phpunit/phpunit": "^8.5", 1238 | "predis/predis": "^1.1", 1239 | "rollbar/rollbar": "^1.3 || ^2 || ^3", 1240 | "ruflin/elastica": ">=0.90@dev", 1241 | "swiftmailer/swiftmailer": "^5.3|^6.0" 1242 | }, 1243 | "suggest": { 1244 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 1245 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 1246 | "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", 1247 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 1248 | "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", 1249 | "ext-mbstring": "Allow to work properly with unicode symbols", 1250 | "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", 1251 | "ext-openssl": "Required to send log messages using SSL", 1252 | "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", 1253 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 1254 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", 1255 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 1256 | "php-console/php-console": "Allow sending log messages to Google Chrome", 1257 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 1258 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server" 1259 | }, 1260 | "type": "library", 1261 | "extra": { 1262 | "branch-alias": { 1263 | "dev-main": "2.x-dev" 1264 | } 1265 | }, 1266 | "autoload": { 1267 | "psr-4": { 1268 | "Monolog\\": "src/Monolog" 1269 | } 1270 | }, 1271 | "notification-url": "https://packagist.org/downloads/", 1272 | "license": [ 1273 | "MIT" 1274 | ], 1275 | "authors": [ 1276 | { 1277 | "name": "Jordi Boggiano", 1278 | "email": "j.boggiano@seld.be", 1279 | "homepage": "https://seld.be" 1280 | } 1281 | ], 1282 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 1283 | "homepage": "https://github.com/Seldaek/monolog", 1284 | "keywords": [ 1285 | "log", 1286 | "logging", 1287 | "psr-3" 1288 | ], 1289 | "support": { 1290 | "issues": "https://github.com/Seldaek/monolog/issues", 1291 | "source": "https://github.com/Seldaek/monolog/tree/2.4.0" 1292 | }, 1293 | "funding": [ 1294 | { 1295 | "url": "https://github.com/Seldaek", 1296 | "type": "github" 1297 | }, 1298 | { 1299 | "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", 1300 | "type": "tidelift" 1301 | } 1302 | ], 1303 | "time": "2022-03-14T12:44:37+00:00" 1304 | }, 1305 | { 1306 | "name": "ondram/ci-detector", 1307 | "version": "4.1.0", 1308 | "source": { 1309 | "type": "git", 1310 | "url": "https://github.com/OndraM/ci-detector.git", 1311 | "reference": "8a4b664e916df82ff26a44709942dfd593fa6f30" 1312 | }, 1313 | "dist": { 1314 | "type": "zip", 1315 | "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/8a4b664e916df82ff26a44709942dfd593fa6f30", 1316 | "reference": "8a4b664e916df82ff26a44709942dfd593fa6f30", 1317 | "shasum": "" 1318 | }, 1319 | "require": { 1320 | "php": "^7.1 || ^8.0" 1321 | }, 1322 | "require-dev": { 1323 | "ergebnis/composer-normalize": "^2.2", 1324 | "lmc/coding-standard": "^1.3 || ^2.1", 1325 | "php-parallel-lint/php-parallel-lint": "^1.2", 1326 | "phpstan/extension-installer": "^1.0.5", 1327 | "phpstan/phpstan": "^0.12.58", 1328 | "phpstan/phpstan-phpunit": "^0.12.16", 1329 | "phpunit/phpunit": "^7.1 || ^8.0 || ^9.0" 1330 | }, 1331 | "type": "library", 1332 | "autoload": { 1333 | "psr-4": { 1334 | "OndraM\\CiDetector\\": "src/" 1335 | } 1336 | }, 1337 | "notification-url": "https://packagist.org/downloads/", 1338 | "license": [ 1339 | "MIT" 1340 | ], 1341 | "authors": [ 1342 | { 1343 | "name": "Ondřej Machulda", 1344 | "email": "ondrej.machulda@gmail.com" 1345 | } 1346 | ], 1347 | "description": "Detect continuous integration environment and provide unified access to properties of current build", 1348 | "keywords": [ 1349 | "CircleCI", 1350 | "Codeship", 1351 | "Wercker", 1352 | "adapter", 1353 | "appveyor", 1354 | "aws", 1355 | "aws codebuild", 1356 | "azure", 1357 | "azure devops", 1358 | "azure pipelines", 1359 | "bamboo", 1360 | "bitbucket", 1361 | "buddy", 1362 | "ci-info", 1363 | "codebuild", 1364 | "continuous integration", 1365 | "continuousphp", 1366 | "devops", 1367 | "drone", 1368 | "github", 1369 | "gitlab", 1370 | "interface", 1371 | "jenkins", 1372 | "pipelines", 1373 | "sourcehut", 1374 | "teamcity", 1375 | "travis" 1376 | ], 1377 | "support": { 1378 | "issues": "https://github.com/OndraM/ci-detector/issues", 1379 | "source": "https://github.com/OndraM/ci-detector/tree/4.1.0" 1380 | }, 1381 | "time": "2021-04-14T09:16:52+00:00" 1382 | }, 1383 | { 1384 | "name": "pdepend/pdepend", 1385 | "version": "2.10.3", 1386 | "source": { 1387 | "type": "git", 1388 | "url": "https://github.com/pdepend/pdepend.git", 1389 | "reference": "da3166a06b4a89915920a42444f707122a1584c9" 1390 | }, 1391 | "dist": { 1392 | "type": "zip", 1393 | "url": "https://api.github.com/repos/pdepend/pdepend/zipball/da3166a06b4a89915920a42444f707122a1584c9", 1394 | "reference": "da3166a06b4a89915920a42444f707122a1584c9", 1395 | "shasum": "" 1396 | }, 1397 | "require": { 1398 | "php": ">=5.3.7", 1399 | "symfony/config": "^2.3.0|^3|^4|^5|^6.0", 1400 | "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0", 1401 | "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0" 1402 | }, 1403 | "require-dev": { 1404 | "easy-doc/easy-doc": "0.0.0|^1.2.3", 1405 | "gregwar/rst": "^1.0", 1406 | "phpunit/phpunit": "^4.8.36|^5.7.27", 1407 | "squizlabs/php_codesniffer": "^2.0.0" 1408 | }, 1409 | "bin": [ 1410 | "src/bin/pdepend" 1411 | ], 1412 | "type": "library", 1413 | "extra": { 1414 | "branch-alias": { 1415 | "dev-master": "2.x-dev" 1416 | } 1417 | }, 1418 | "autoload": { 1419 | "psr-4": { 1420 | "PDepend\\": "src/main/php/PDepend" 1421 | } 1422 | }, 1423 | "notification-url": "https://packagist.org/downloads/", 1424 | "license": [ 1425 | "BSD-3-Clause" 1426 | ], 1427 | "description": "Official version of pdepend to be handled with Composer", 1428 | "support": { 1429 | "issues": "https://github.com/pdepend/pdepend/issues", 1430 | "source": "https://github.com/pdepend/pdepend/tree/2.10.3" 1431 | }, 1432 | "funding": [ 1433 | { 1434 | "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", 1435 | "type": "tidelift" 1436 | } 1437 | ], 1438 | "time": "2022-02-23T07:53:09+00:00" 1439 | }, 1440 | { 1441 | "name": "phpmd/phpmd", 1442 | "version": "2.12.0", 1443 | "source": { 1444 | "type": "git", 1445 | "url": "https://github.com/phpmd/phpmd.git", 1446 | "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec" 1447 | }, 1448 | "dist": { 1449 | "type": "zip", 1450 | "url": "https://api.github.com/repos/phpmd/phpmd/zipball/c0b678ba71902f539c27c14332aa0ddcf14388ec", 1451 | "reference": "c0b678ba71902f539c27c14332aa0ddcf14388ec", 1452 | "shasum": "" 1453 | }, 1454 | "require": { 1455 | "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", 1456 | "ext-xml": "*", 1457 | "pdepend/pdepend": "^2.10.3", 1458 | "php": ">=5.3.9" 1459 | }, 1460 | "require-dev": { 1461 | "easy-doc/easy-doc": "0.0.0 || ^1.3.2", 1462 | "ext-json": "*", 1463 | "ext-simplexml": "*", 1464 | "gregwar/rst": "^1.0", 1465 | "mikey179/vfsstream": "^1.6.8", 1466 | "phpunit/phpunit": "^4.8.36 || ^5.7.27", 1467 | "squizlabs/php_codesniffer": "^2.0" 1468 | }, 1469 | "bin": [ 1470 | "src/bin/phpmd" 1471 | ], 1472 | "type": "library", 1473 | "autoload": { 1474 | "psr-0": { 1475 | "PHPMD\\": "src/main/php" 1476 | } 1477 | }, 1478 | "notification-url": "https://packagist.org/downloads/", 1479 | "license": [ 1480 | "BSD-3-Clause" 1481 | ], 1482 | "authors": [ 1483 | { 1484 | "name": "Manuel Pichler", 1485 | "email": "github@manuel-pichler.de", 1486 | "homepage": "https://github.com/manuelpichler", 1487 | "role": "Project Founder" 1488 | }, 1489 | { 1490 | "name": "Marc Würth", 1491 | "email": "ravage@bluewin.ch", 1492 | "homepage": "https://github.com/ravage84", 1493 | "role": "Project Maintainer" 1494 | }, 1495 | { 1496 | "name": "Other contributors", 1497 | "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", 1498 | "role": "Contributors" 1499 | } 1500 | ], 1501 | "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", 1502 | "homepage": "https://phpmd.org/", 1503 | "keywords": [ 1504 | "mess detection", 1505 | "mess detector", 1506 | "pdepend", 1507 | "phpmd", 1508 | "pmd" 1509 | ], 1510 | "support": { 1511 | "irc": "irc://irc.freenode.org/phpmd", 1512 | "issues": "https://github.com/phpmd/phpmd/issues", 1513 | "source": "https://github.com/phpmd/phpmd/tree/2.12.0" 1514 | }, 1515 | "funding": [ 1516 | { 1517 | "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", 1518 | "type": "tidelift" 1519 | } 1520 | ], 1521 | "time": "2022-03-24T13:33:01+00:00" 1522 | }, 1523 | { 1524 | "name": "phpro/grumphp", 1525 | "version": "v1.9.0", 1526 | "source": { 1527 | "type": "git", 1528 | "url": "https://github.com/phpro/grumphp.git", 1529 | "reference": "f028914b2df38190589659014b12e6dcab14a3b9" 1530 | }, 1531 | "dist": { 1532 | "type": "zip", 1533 | "url": "https://api.github.com/repos/phpro/grumphp/zipball/f028914b2df38190589659014b12e6dcab14a3b9", 1534 | "reference": "f028914b2df38190589659014b12e6dcab14a3b9", 1535 | "shasum": "" 1536 | }, 1537 | "require": { 1538 | "amphp/amp": "^2.6", 1539 | "amphp/parallel": "^1.4", 1540 | "amphp/parallel-functions": "^1.1", 1541 | "composer-plugin-api": "~2.0", 1542 | "doctrine/collections": "^1.6.8", 1543 | "ext-json": "*", 1544 | "gitonomy/gitlib": "^1.3", 1545 | "laravel/serializable-closure": "^1.1", 1546 | "monolog/monolog": "^2.0", 1547 | "ondram/ci-detector": "^4.0", 1548 | "php": "^8.0", 1549 | "psr/container": "^1.1 || ^2.0", 1550 | "seld/jsonlint": "~1.8", 1551 | "symfony/config": "~5.3 || ~6.0", 1552 | "symfony/console": "~5.3 || ~6.0", 1553 | "symfony/dependency-injection": "~5.3 || ~6.0", 1554 | "symfony/dotenv": "~5.3 || ~6.0", 1555 | "symfony/event-dispatcher": "~5.3 || ~6.0", 1556 | "symfony/filesystem": "~5.3 || ~6.0", 1557 | "symfony/finder": "~5.3 || ~6.0", 1558 | "symfony/options-resolver": "~5.3 || ~6.0", 1559 | "symfony/process": "~5.3 || ~6.0", 1560 | "symfony/yaml": "~5.3 || ~6.0" 1561 | }, 1562 | "require-dev": { 1563 | "amphp/sync": "^v1.4", 1564 | "brianium/paratest": "^6.4", 1565 | "composer/composer": "^2.2.6", 1566 | "nikic/php-parser": "~4.13", 1567 | "php-parallel-lint/php-parallel-lint": "^1.3", 1568 | "phpspec/phpspec": "^7.1", 1569 | "phpspec/prophecy-phpunit": "^2.0", 1570 | "phpunit/phpunit": "^9.5.13" 1571 | }, 1572 | "suggest": { 1573 | "atoum/atoum": "Lets GrumPHP run your unit tests.", 1574 | "behat/behat": "Lets GrumPHP validate your project features.", 1575 | "brianium/paratest": "Lets GrumPHP run PHPUnit in parallel.", 1576 | "codeception/codeception": "Lets GrumPHP run your project's full stack tests", 1577 | "consolidation/robo": "Lets GrumPHP run your automated PHP tasks.", 1578 | "designsecurity/progpilot": "Lets GrumPHP be sure that there are no vulnerabilities in your code.", 1579 | "doctrine/orm": "Lets GrumPHP validate your Doctrine mapping files.", 1580 | "enlightn/security-checker": "Lets GrumPHP be sure that there are no known security issues.", 1581 | "ergebnis/composer-normalize": "Lets GrumPHP tidy and normalize your composer.json file.", 1582 | "friendsofphp/php-cs-fixer": "Lets GrumPHP automatically fix your codestyle.", 1583 | "friendsoftwig/twigcs": "Lets GrumPHP check Twig coding standard.", 1584 | "infection/infection": "Lets GrumPHP evaluate the quality your unit tests", 1585 | "maglnet/composer-require-checker": "Lets GrumPHP analyze composer dependencies.", 1586 | "malukenho/kawaii-gherkin": "Lets GrumPHP lint your Gherkin files.", 1587 | "nette/tester": "Lets GrumPHP run your unit tests with nette tester.", 1588 | "nikic/php-parser": "Lets GrumPHP run static analyses through your PHP files.", 1589 | "pestphp/pest": "Lets GrumPHP run your unit test with Pest PHP", 1590 | "phan/phan": "Lets GrumPHP unleash a static analyzer on your code", 1591 | "phing/phing": "Lets GrumPHP run your automated PHP tasks.", 1592 | "php-parallel-lint/php-parallel-lint": "Lets GrumPHP quickly lint your entire code base.", 1593 | "phpmd/phpmd": "Lets GrumPHP sort out the mess in your code", 1594 | "phpspec/phpspec": "Lets GrumPHP spec your code.", 1595 | "phpstan/phpstan": "Lets GrumPHP discover bugs in your code without running it.", 1596 | "phpunit/phpunit": "Lets GrumPHP run your unit tests.", 1597 | "povils/phpmnd": "Lets GrumPHP help you detect magic numbers in PHP code.", 1598 | "roave/security-advisories": "Lets GrumPHP be sure that there are no known security issues.", 1599 | "sebastian/phpcpd": "Lets GrumPHP find duplicated code.", 1600 | "squizlabs/php_codesniffer": "Lets GrumPHP sniff on your code.", 1601 | "sstalle/php7cc": "Lets GrumPHP check PHP 5.3 - 5.6 code compatibility with PHP 7.", 1602 | "symfony/phpunit-bridge": "Lets GrumPHP run your unit tests with the phpunit-bridge of Symfony.", 1603 | "symplify/easy-coding-standard": "Lets GrumPHP check coding standard.", 1604 | "vimeo/psalm": "Lets GrumPHP discover errors in your code without running it." 1605 | }, 1606 | "bin": [ 1607 | "bin/grumphp" 1608 | ], 1609 | "type": "composer-plugin", 1610 | "extra": { 1611 | "class": "GrumPHP\\Composer\\GrumPHPPlugin" 1612 | }, 1613 | "autoload": { 1614 | "psr-4": { 1615 | "GrumPHP\\": "src" 1616 | } 1617 | }, 1618 | "notification-url": "https://packagist.org/downloads/", 1619 | "license": [ 1620 | "MIT" 1621 | ], 1622 | "authors": [ 1623 | { 1624 | "name": "Toon Verwerft", 1625 | "email": "toon.verwerft@phpro.be" 1626 | }, 1627 | { 1628 | "name": "Community", 1629 | "homepage": "https://github.com/phpro/grumphp/graphs/contributors" 1630 | } 1631 | ], 1632 | "description": "A composer plugin that enables source code quality checks.", 1633 | "support": { 1634 | "issues": "https://github.com/phpro/grumphp/issues", 1635 | "source": "https://github.com/phpro/grumphp/tree/v1.9.0" 1636 | }, 1637 | "time": "2022-03-10T19:22:28+00:00" 1638 | }, 1639 | { 1640 | "name": "phpstan/phpstan", 1641 | "version": "1.5.0", 1642 | "source": { 1643 | "type": "git", 1644 | "url": "https://github.com/phpstan/phpstan.git", 1645 | "reference": "2be8dd6dfa09ab1a21c49956ff591979cd5ab29e" 1646 | }, 1647 | "dist": { 1648 | "type": "zip", 1649 | "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2be8dd6dfa09ab1a21c49956ff591979cd5ab29e", 1650 | "reference": "2be8dd6dfa09ab1a21c49956ff591979cd5ab29e", 1651 | "shasum": "" 1652 | }, 1653 | "require": { 1654 | "php": "^7.2|^8.0" 1655 | }, 1656 | "conflict": { 1657 | "phpstan/phpstan-shim": "*" 1658 | }, 1659 | "bin": [ 1660 | "phpstan", 1661 | "phpstan.phar" 1662 | ], 1663 | "type": "library", 1664 | "autoload": { 1665 | "files": [ 1666 | "bootstrap.php" 1667 | ] 1668 | }, 1669 | "notification-url": "https://packagist.org/downloads/", 1670 | "license": [ 1671 | "MIT" 1672 | ], 1673 | "description": "PHPStan - PHP Static Analysis Tool", 1674 | "support": { 1675 | "issues": "https://github.com/phpstan/phpstan/issues", 1676 | "source": "https://github.com/phpstan/phpstan/tree/1.5.0" 1677 | }, 1678 | "funding": [ 1679 | { 1680 | "url": "https://github.com/ondrejmirtes", 1681 | "type": "github" 1682 | }, 1683 | { 1684 | "url": "https://github.com/phpstan", 1685 | "type": "github" 1686 | }, 1687 | { 1688 | "url": "https://www.patreon.com/phpstan", 1689 | "type": "patreon" 1690 | }, 1691 | { 1692 | "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", 1693 | "type": "tidelift" 1694 | } 1695 | ], 1696 | "time": "2022-03-24T18:18:00+00:00" 1697 | }, 1698 | { 1699 | "name": "psr/container", 1700 | "version": "2.0.2", 1701 | "source": { 1702 | "type": "git", 1703 | "url": "https://github.com/php-fig/container.git", 1704 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" 1705 | }, 1706 | "dist": { 1707 | "type": "zip", 1708 | "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1709 | "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", 1710 | "shasum": "" 1711 | }, 1712 | "require": { 1713 | "php": ">=7.4.0" 1714 | }, 1715 | "type": "library", 1716 | "extra": { 1717 | "branch-alias": { 1718 | "dev-master": "2.0.x-dev" 1719 | } 1720 | }, 1721 | "autoload": { 1722 | "psr-4": { 1723 | "Psr\\Container\\": "src/" 1724 | } 1725 | }, 1726 | "notification-url": "https://packagist.org/downloads/", 1727 | "license": [ 1728 | "MIT" 1729 | ], 1730 | "authors": [ 1731 | { 1732 | "name": "PHP-FIG", 1733 | "homepage": "https://www.php-fig.org/" 1734 | } 1735 | ], 1736 | "description": "Common Container Interface (PHP FIG PSR-11)", 1737 | "homepage": "https://github.com/php-fig/container", 1738 | "keywords": [ 1739 | "PSR-11", 1740 | "container", 1741 | "container-interface", 1742 | "container-interop", 1743 | "psr" 1744 | ], 1745 | "support": { 1746 | "issues": "https://github.com/php-fig/container/issues", 1747 | "source": "https://github.com/php-fig/container/tree/2.0.2" 1748 | }, 1749 | "time": "2021-11-05T16:47:00+00:00" 1750 | }, 1751 | { 1752 | "name": "psr/event-dispatcher", 1753 | "version": "1.0.0", 1754 | "source": { 1755 | "type": "git", 1756 | "url": "https://github.com/php-fig/event-dispatcher.git", 1757 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" 1758 | }, 1759 | "dist": { 1760 | "type": "zip", 1761 | "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", 1762 | "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", 1763 | "shasum": "" 1764 | }, 1765 | "require": { 1766 | "php": ">=7.2.0" 1767 | }, 1768 | "type": "library", 1769 | "extra": { 1770 | "branch-alias": { 1771 | "dev-master": "1.0.x-dev" 1772 | } 1773 | }, 1774 | "autoload": { 1775 | "psr-4": { 1776 | "Psr\\EventDispatcher\\": "src/" 1777 | } 1778 | }, 1779 | "notification-url": "https://packagist.org/downloads/", 1780 | "license": [ 1781 | "MIT" 1782 | ], 1783 | "authors": [ 1784 | { 1785 | "name": "PHP-FIG", 1786 | "homepage": "http://www.php-fig.org/" 1787 | } 1788 | ], 1789 | "description": "Standard interfaces for event handling.", 1790 | "keywords": [ 1791 | "events", 1792 | "psr", 1793 | "psr-14" 1794 | ], 1795 | "support": { 1796 | "issues": "https://github.com/php-fig/event-dispatcher/issues", 1797 | "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" 1798 | }, 1799 | "time": "2019-01-08T18:20:26+00:00" 1800 | }, 1801 | { 1802 | "name": "psr/log", 1803 | "version": "3.0.0", 1804 | "source": { 1805 | "type": "git", 1806 | "url": "https://github.com/php-fig/log.git", 1807 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" 1808 | }, 1809 | "dist": { 1810 | "type": "zip", 1811 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", 1812 | "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", 1813 | "shasum": "" 1814 | }, 1815 | "require": { 1816 | "php": ">=8.0.0" 1817 | }, 1818 | "type": "library", 1819 | "extra": { 1820 | "branch-alias": { 1821 | "dev-master": "3.x-dev" 1822 | } 1823 | }, 1824 | "autoload": { 1825 | "psr-4": { 1826 | "Psr\\Log\\": "src" 1827 | } 1828 | }, 1829 | "notification-url": "https://packagist.org/downloads/", 1830 | "license": [ 1831 | "MIT" 1832 | ], 1833 | "authors": [ 1834 | { 1835 | "name": "PHP-FIG", 1836 | "homepage": "https://www.php-fig.org/" 1837 | } 1838 | ], 1839 | "description": "Common interface for logging libraries", 1840 | "homepage": "https://github.com/php-fig/log", 1841 | "keywords": [ 1842 | "log", 1843 | "psr", 1844 | "psr-3" 1845 | ], 1846 | "support": { 1847 | "source": "https://github.com/php-fig/log/tree/3.0.0" 1848 | }, 1849 | "time": "2021-07-14T16:46:02+00:00" 1850 | }, 1851 | { 1852 | "name": "seld/jsonlint", 1853 | "version": "1.8.3", 1854 | "source": { 1855 | "type": "git", 1856 | "url": "https://github.com/Seldaek/jsonlint.git", 1857 | "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" 1858 | }, 1859 | "dist": { 1860 | "type": "zip", 1861 | "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", 1862 | "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", 1863 | "shasum": "" 1864 | }, 1865 | "require": { 1866 | "php": "^5.3 || ^7.0 || ^8.0" 1867 | }, 1868 | "require-dev": { 1869 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1870 | }, 1871 | "bin": [ 1872 | "bin/jsonlint" 1873 | ], 1874 | "type": "library", 1875 | "autoload": { 1876 | "psr-4": { 1877 | "Seld\\JsonLint\\": "src/Seld/JsonLint/" 1878 | } 1879 | }, 1880 | "notification-url": "https://packagist.org/downloads/", 1881 | "license": [ 1882 | "MIT" 1883 | ], 1884 | "authors": [ 1885 | { 1886 | "name": "Jordi Boggiano", 1887 | "email": "j.boggiano@seld.be", 1888 | "homepage": "http://seld.be" 1889 | } 1890 | ], 1891 | "description": "JSON Linter", 1892 | "keywords": [ 1893 | "json", 1894 | "linter", 1895 | "parser", 1896 | "validator" 1897 | ], 1898 | "support": { 1899 | "issues": "https://github.com/Seldaek/jsonlint/issues", 1900 | "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" 1901 | }, 1902 | "funding": [ 1903 | { 1904 | "url": "https://github.com/Seldaek", 1905 | "type": "github" 1906 | }, 1907 | { 1908 | "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", 1909 | "type": "tidelift" 1910 | } 1911 | ], 1912 | "time": "2020-11-11T09:19:24+00:00" 1913 | }, 1914 | { 1915 | "name": "squizlabs/php_codesniffer", 1916 | "version": "3.6.2", 1917 | "source": { 1918 | "type": "git", 1919 | "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", 1920 | "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" 1921 | }, 1922 | "dist": { 1923 | "type": "zip", 1924 | "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", 1925 | "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", 1926 | "shasum": "" 1927 | }, 1928 | "require": { 1929 | "ext-simplexml": "*", 1930 | "ext-tokenizer": "*", 1931 | "ext-xmlwriter": "*", 1932 | "php": ">=5.4.0" 1933 | }, 1934 | "require-dev": { 1935 | "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" 1936 | }, 1937 | "bin": [ 1938 | "bin/phpcs", 1939 | "bin/phpcbf" 1940 | ], 1941 | "type": "library", 1942 | "extra": { 1943 | "branch-alias": { 1944 | "dev-master": "3.x-dev" 1945 | } 1946 | }, 1947 | "notification-url": "https://packagist.org/downloads/", 1948 | "license": [ 1949 | "BSD-3-Clause" 1950 | ], 1951 | "authors": [ 1952 | { 1953 | "name": "Greg Sherwood", 1954 | "role": "lead" 1955 | } 1956 | ], 1957 | "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", 1958 | "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", 1959 | "keywords": [ 1960 | "phpcs", 1961 | "standards" 1962 | ], 1963 | "support": { 1964 | "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", 1965 | "source": "https://github.com/squizlabs/PHP_CodeSniffer", 1966 | "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" 1967 | }, 1968 | "time": "2021-12-12T21:44:58+00:00" 1969 | }, 1970 | { 1971 | "name": "symfony/config", 1972 | "version": "v6.0.3", 1973 | "source": { 1974 | "type": "git", 1975 | "url": "https://github.com/symfony/config.git", 1976 | "reference": "c14f32ae4cd2a3c29d8825c5093463ac08ade7d8" 1977 | }, 1978 | "dist": { 1979 | "type": "zip", 1980 | "url": "https://api.github.com/repos/symfony/config/zipball/c14f32ae4cd2a3c29d8825c5093463ac08ade7d8", 1981 | "reference": "c14f32ae4cd2a3c29d8825c5093463ac08ade7d8", 1982 | "shasum": "" 1983 | }, 1984 | "require": { 1985 | "php": ">=8.0.2", 1986 | "symfony/deprecation-contracts": "^2.1|^3", 1987 | "symfony/filesystem": "^5.4|^6.0", 1988 | "symfony/polyfill-ctype": "~1.8", 1989 | "symfony/polyfill-php81": "^1.22" 1990 | }, 1991 | "conflict": { 1992 | "symfony/finder": "<4.4" 1993 | }, 1994 | "require-dev": { 1995 | "symfony/event-dispatcher": "^5.4|^6.0", 1996 | "symfony/finder": "^5.4|^6.0", 1997 | "symfony/messenger": "^5.4|^6.0", 1998 | "symfony/service-contracts": "^1.1|^2|^3", 1999 | "symfony/yaml": "^5.4|^6.0" 2000 | }, 2001 | "suggest": { 2002 | "symfony/yaml": "To use the yaml reference dumper" 2003 | }, 2004 | "type": "library", 2005 | "autoload": { 2006 | "psr-4": { 2007 | "Symfony\\Component\\Config\\": "" 2008 | }, 2009 | "exclude-from-classmap": [ 2010 | "/Tests/" 2011 | ] 2012 | }, 2013 | "notification-url": "https://packagist.org/downloads/", 2014 | "license": [ 2015 | "MIT" 2016 | ], 2017 | "authors": [ 2018 | { 2019 | "name": "Fabien Potencier", 2020 | "email": "fabien@symfony.com" 2021 | }, 2022 | { 2023 | "name": "Symfony Community", 2024 | "homepage": "https://symfony.com/contributors" 2025 | } 2026 | ], 2027 | "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", 2028 | "homepage": "https://symfony.com", 2029 | "support": { 2030 | "source": "https://github.com/symfony/config/tree/v6.0.3" 2031 | }, 2032 | "funding": [ 2033 | { 2034 | "url": "https://symfony.com/sponsor", 2035 | "type": "custom" 2036 | }, 2037 | { 2038 | "url": "https://github.com/fabpot", 2039 | "type": "github" 2040 | }, 2041 | { 2042 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2043 | "type": "tidelift" 2044 | } 2045 | ], 2046 | "time": "2022-01-03T09:53:43+00:00" 2047 | }, 2048 | { 2049 | "name": "symfony/console", 2050 | "version": "v6.0.5", 2051 | "source": { 2052 | "type": "git", 2053 | "url": "https://github.com/symfony/console.git", 2054 | "reference": "3bebf4108b9e07492a2a4057d207aa5a77d146b1" 2055 | }, 2056 | "dist": { 2057 | "type": "zip", 2058 | "url": "https://api.github.com/repos/symfony/console/zipball/3bebf4108b9e07492a2a4057d207aa5a77d146b1", 2059 | "reference": "3bebf4108b9e07492a2a4057d207aa5a77d146b1", 2060 | "shasum": "" 2061 | }, 2062 | "require": { 2063 | "php": ">=8.0.2", 2064 | "symfony/polyfill-mbstring": "~1.0", 2065 | "symfony/service-contracts": "^1.1|^2|^3", 2066 | "symfony/string": "^5.4|^6.0" 2067 | }, 2068 | "conflict": { 2069 | "symfony/dependency-injection": "<5.4", 2070 | "symfony/dotenv": "<5.4", 2071 | "symfony/event-dispatcher": "<5.4", 2072 | "symfony/lock": "<5.4", 2073 | "symfony/process": "<5.4" 2074 | }, 2075 | "provide": { 2076 | "psr/log-implementation": "1.0|2.0|3.0" 2077 | }, 2078 | "require-dev": { 2079 | "psr/log": "^1|^2|^3", 2080 | "symfony/config": "^5.4|^6.0", 2081 | "symfony/dependency-injection": "^5.4|^6.0", 2082 | "symfony/event-dispatcher": "^5.4|^6.0", 2083 | "symfony/lock": "^5.4|^6.0", 2084 | "symfony/process": "^5.4|^6.0", 2085 | "symfony/var-dumper": "^5.4|^6.0" 2086 | }, 2087 | "suggest": { 2088 | "psr/log": "For using the console logger", 2089 | "symfony/event-dispatcher": "", 2090 | "symfony/lock": "", 2091 | "symfony/process": "" 2092 | }, 2093 | "type": "library", 2094 | "autoload": { 2095 | "psr-4": { 2096 | "Symfony\\Component\\Console\\": "" 2097 | }, 2098 | "exclude-from-classmap": [ 2099 | "/Tests/" 2100 | ] 2101 | }, 2102 | "notification-url": "https://packagist.org/downloads/", 2103 | "license": [ 2104 | "MIT" 2105 | ], 2106 | "authors": [ 2107 | { 2108 | "name": "Fabien Potencier", 2109 | "email": "fabien@symfony.com" 2110 | }, 2111 | { 2112 | "name": "Symfony Community", 2113 | "homepage": "https://symfony.com/contributors" 2114 | } 2115 | ], 2116 | "description": "Eases the creation of beautiful and testable command line interfaces", 2117 | "homepage": "https://symfony.com", 2118 | "keywords": [ 2119 | "cli", 2120 | "command line", 2121 | "console", 2122 | "terminal" 2123 | ], 2124 | "support": { 2125 | "source": "https://github.com/symfony/console/tree/v6.0.5" 2126 | }, 2127 | "funding": [ 2128 | { 2129 | "url": "https://symfony.com/sponsor", 2130 | "type": "custom" 2131 | }, 2132 | { 2133 | "url": "https://github.com/fabpot", 2134 | "type": "github" 2135 | }, 2136 | { 2137 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2138 | "type": "tidelift" 2139 | } 2140 | ], 2141 | "time": "2022-02-25T10:48:52+00:00" 2142 | }, 2143 | { 2144 | "name": "symfony/dependency-injection", 2145 | "version": "v6.0.6", 2146 | "source": { 2147 | "type": "git", 2148 | "url": "https://github.com/symfony/dependency-injection.git", 2149 | "reference": "a296611f599d0b28e7af88798f830f9cb4d1e8e6" 2150 | }, 2151 | "dist": { 2152 | "type": "zip", 2153 | "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a296611f599d0b28e7af88798f830f9cb4d1e8e6", 2154 | "reference": "a296611f599d0b28e7af88798f830f9cb4d1e8e6", 2155 | "shasum": "" 2156 | }, 2157 | "require": { 2158 | "php": ">=8.0.2", 2159 | "psr/container": "^1.1|^2.0", 2160 | "symfony/deprecation-contracts": "^2.1|^3", 2161 | "symfony/polyfill-php81": "^1.22", 2162 | "symfony/service-contracts": "^1.1.6|^2.0|^3.0" 2163 | }, 2164 | "conflict": { 2165 | "ext-psr": "<1.1|>=2", 2166 | "symfony/config": "<5.4", 2167 | "symfony/finder": "<5.4", 2168 | "symfony/proxy-manager-bridge": "<5.4", 2169 | "symfony/yaml": "<5.4" 2170 | }, 2171 | "provide": { 2172 | "psr/container-implementation": "1.1|2.0", 2173 | "symfony/service-implementation": "1.1|2.0|3.0" 2174 | }, 2175 | "require-dev": { 2176 | "symfony/config": "^5.4|^6.0", 2177 | "symfony/expression-language": "^5.4|^6.0", 2178 | "symfony/yaml": "^5.4|^6.0" 2179 | }, 2180 | "suggest": { 2181 | "symfony/config": "", 2182 | "symfony/expression-language": "For using expressions in service container configuration", 2183 | "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", 2184 | "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", 2185 | "symfony/yaml": "" 2186 | }, 2187 | "type": "library", 2188 | "autoload": { 2189 | "psr-4": { 2190 | "Symfony\\Component\\DependencyInjection\\": "" 2191 | }, 2192 | "exclude-from-classmap": [ 2193 | "/Tests/" 2194 | ] 2195 | }, 2196 | "notification-url": "https://packagist.org/downloads/", 2197 | "license": [ 2198 | "MIT" 2199 | ], 2200 | "authors": [ 2201 | { 2202 | "name": "Fabien Potencier", 2203 | "email": "fabien@symfony.com" 2204 | }, 2205 | { 2206 | "name": "Symfony Community", 2207 | "homepage": "https://symfony.com/contributors" 2208 | } 2209 | ], 2210 | "description": "Allows you to standardize and centralize the way objects are constructed in your application", 2211 | "homepage": "https://symfony.com", 2212 | "support": { 2213 | "source": "https://github.com/symfony/dependency-injection/tree/v6.0.6" 2214 | }, 2215 | "funding": [ 2216 | { 2217 | "url": "https://symfony.com/sponsor", 2218 | "type": "custom" 2219 | }, 2220 | { 2221 | "url": "https://github.com/fabpot", 2222 | "type": "github" 2223 | }, 2224 | { 2225 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2226 | "type": "tidelift" 2227 | } 2228 | ], 2229 | "time": "2022-03-02T12:58:14+00:00" 2230 | }, 2231 | { 2232 | "name": "symfony/deprecation-contracts", 2233 | "version": "v3.0.0", 2234 | "source": { 2235 | "type": "git", 2236 | "url": "https://github.com/symfony/deprecation-contracts.git", 2237 | "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced" 2238 | }, 2239 | "dist": { 2240 | "type": "zip", 2241 | "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", 2242 | "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", 2243 | "shasum": "" 2244 | }, 2245 | "require": { 2246 | "php": ">=8.0.2" 2247 | }, 2248 | "type": "library", 2249 | "extra": { 2250 | "branch-alias": { 2251 | "dev-main": "3.0-dev" 2252 | }, 2253 | "thanks": { 2254 | "name": "symfony/contracts", 2255 | "url": "https://github.com/symfony/contracts" 2256 | } 2257 | }, 2258 | "autoload": { 2259 | "files": [ 2260 | "function.php" 2261 | ] 2262 | }, 2263 | "notification-url": "https://packagist.org/downloads/", 2264 | "license": [ 2265 | "MIT" 2266 | ], 2267 | "authors": [ 2268 | { 2269 | "name": "Nicolas Grekas", 2270 | "email": "p@tchwork.com" 2271 | }, 2272 | { 2273 | "name": "Symfony Community", 2274 | "homepage": "https://symfony.com/contributors" 2275 | } 2276 | ], 2277 | "description": "A generic function and convention to trigger deprecation notices", 2278 | "homepage": "https://symfony.com", 2279 | "support": { 2280 | "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.0" 2281 | }, 2282 | "funding": [ 2283 | { 2284 | "url": "https://symfony.com/sponsor", 2285 | "type": "custom" 2286 | }, 2287 | { 2288 | "url": "https://github.com/fabpot", 2289 | "type": "github" 2290 | }, 2291 | { 2292 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2293 | "type": "tidelift" 2294 | } 2295 | ], 2296 | "time": "2021-11-01T23:48:49+00:00" 2297 | }, 2298 | { 2299 | "name": "symfony/dotenv", 2300 | "version": "v6.0.5", 2301 | "source": { 2302 | "type": "git", 2303 | "url": "https://github.com/symfony/dotenv.git", 2304 | "reference": "1c2288fdfd0787288cd04b9868f879f2212159c4" 2305 | }, 2306 | "dist": { 2307 | "type": "zip", 2308 | "url": "https://api.github.com/repos/symfony/dotenv/zipball/1c2288fdfd0787288cd04b9868f879f2212159c4", 2309 | "reference": "1c2288fdfd0787288cd04b9868f879f2212159c4", 2310 | "shasum": "" 2311 | }, 2312 | "require": { 2313 | "php": ">=8.0.2" 2314 | }, 2315 | "require-dev": { 2316 | "symfony/console": "^5.4|^6.0", 2317 | "symfony/process": "^5.4|^6.0" 2318 | }, 2319 | "type": "library", 2320 | "autoload": { 2321 | "psr-4": { 2322 | "Symfony\\Component\\Dotenv\\": "" 2323 | }, 2324 | "exclude-from-classmap": [ 2325 | "/Tests/" 2326 | ] 2327 | }, 2328 | "notification-url": "https://packagist.org/downloads/", 2329 | "license": [ 2330 | "MIT" 2331 | ], 2332 | "authors": [ 2333 | { 2334 | "name": "Fabien Potencier", 2335 | "email": "fabien@symfony.com" 2336 | }, 2337 | { 2338 | "name": "Symfony Community", 2339 | "homepage": "https://symfony.com/contributors" 2340 | } 2341 | ], 2342 | "description": "Registers environment variables from a .env file", 2343 | "homepage": "https://symfony.com", 2344 | "keywords": [ 2345 | "dotenv", 2346 | "env", 2347 | "environment" 2348 | ], 2349 | "support": { 2350 | "source": "https://github.com/symfony/dotenv/tree/v6.0.5" 2351 | }, 2352 | "funding": [ 2353 | { 2354 | "url": "https://symfony.com/sponsor", 2355 | "type": "custom" 2356 | }, 2357 | { 2358 | "url": "https://github.com/fabpot", 2359 | "type": "github" 2360 | }, 2361 | { 2362 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2363 | "type": "tidelift" 2364 | } 2365 | ], 2366 | "time": "2022-02-21T17:15:17+00:00" 2367 | }, 2368 | { 2369 | "name": "symfony/event-dispatcher", 2370 | "version": "v6.0.3", 2371 | "source": { 2372 | "type": "git", 2373 | "url": "https://github.com/symfony/event-dispatcher.git", 2374 | "reference": "6472ea2dd415e925b90ca82be64b8bc6157f3934" 2375 | }, 2376 | "dist": { 2377 | "type": "zip", 2378 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/6472ea2dd415e925b90ca82be64b8bc6157f3934", 2379 | "reference": "6472ea2dd415e925b90ca82be64b8bc6157f3934", 2380 | "shasum": "" 2381 | }, 2382 | "require": { 2383 | "php": ">=8.0.2", 2384 | "symfony/event-dispatcher-contracts": "^2|^3" 2385 | }, 2386 | "conflict": { 2387 | "symfony/dependency-injection": "<5.4" 2388 | }, 2389 | "provide": { 2390 | "psr/event-dispatcher-implementation": "1.0", 2391 | "symfony/event-dispatcher-implementation": "2.0|3.0" 2392 | }, 2393 | "require-dev": { 2394 | "psr/log": "^1|^2|^3", 2395 | "symfony/config": "^5.4|^6.0", 2396 | "symfony/dependency-injection": "^5.4|^6.0", 2397 | "symfony/error-handler": "^5.4|^6.0", 2398 | "symfony/expression-language": "^5.4|^6.0", 2399 | "symfony/http-foundation": "^5.4|^6.0", 2400 | "symfony/service-contracts": "^1.1|^2|^3", 2401 | "symfony/stopwatch": "^5.4|^6.0" 2402 | }, 2403 | "suggest": { 2404 | "symfony/dependency-injection": "", 2405 | "symfony/http-kernel": "" 2406 | }, 2407 | "type": "library", 2408 | "autoload": { 2409 | "psr-4": { 2410 | "Symfony\\Component\\EventDispatcher\\": "" 2411 | }, 2412 | "exclude-from-classmap": [ 2413 | "/Tests/" 2414 | ] 2415 | }, 2416 | "notification-url": "https://packagist.org/downloads/", 2417 | "license": [ 2418 | "MIT" 2419 | ], 2420 | "authors": [ 2421 | { 2422 | "name": "Fabien Potencier", 2423 | "email": "fabien@symfony.com" 2424 | }, 2425 | { 2426 | "name": "Symfony Community", 2427 | "homepage": "https://symfony.com/contributors" 2428 | } 2429 | ], 2430 | "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", 2431 | "homepage": "https://symfony.com", 2432 | "support": { 2433 | "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.3" 2434 | }, 2435 | "funding": [ 2436 | { 2437 | "url": "https://symfony.com/sponsor", 2438 | "type": "custom" 2439 | }, 2440 | { 2441 | "url": "https://github.com/fabpot", 2442 | "type": "github" 2443 | }, 2444 | { 2445 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2446 | "type": "tidelift" 2447 | } 2448 | ], 2449 | "time": "2022-01-02T09:55:41+00:00" 2450 | }, 2451 | { 2452 | "name": "symfony/event-dispatcher-contracts", 2453 | "version": "v3.0.0", 2454 | "source": { 2455 | "type": "git", 2456 | "url": "https://github.com/symfony/event-dispatcher-contracts.git", 2457 | "reference": "aa5422287b75594b90ee9cd807caf8f0df491385" 2458 | }, 2459 | "dist": { 2460 | "type": "zip", 2461 | "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/aa5422287b75594b90ee9cd807caf8f0df491385", 2462 | "reference": "aa5422287b75594b90ee9cd807caf8f0df491385", 2463 | "shasum": "" 2464 | }, 2465 | "require": { 2466 | "php": ">=8.0.2", 2467 | "psr/event-dispatcher": "^1" 2468 | }, 2469 | "suggest": { 2470 | "symfony/event-dispatcher-implementation": "" 2471 | }, 2472 | "type": "library", 2473 | "extra": { 2474 | "branch-alias": { 2475 | "dev-main": "3.0-dev" 2476 | }, 2477 | "thanks": { 2478 | "name": "symfony/contracts", 2479 | "url": "https://github.com/symfony/contracts" 2480 | } 2481 | }, 2482 | "autoload": { 2483 | "psr-4": { 2484 | "Symfony\\Contracts\\EventDispatcher\\": "" 2485 | } 2486 | }, 2487 | "notification-url": "https://packagist.org/downloads/", 2488 | "license": [ 2489 | "MIT" 2490 | ], 2491 | "authors": [ 2492 | { 2493 | "name": "Nicolas Grekas", 2494 | "email": "p@tchwork.com" 2495 | }, 2496 | { 2497 | "name": "Symfony Community", 2498 | "homepage": "https://symfony.com/contributors" 2499 | } 2500 | ], 2501 | "description": "Generic abstractions related to dispatching event", 2502 | "homepage": "https://symfony.com", 2503 | "keywords": [ 2504 | "abstractions", 2505 | "contracts", 2506 | "decoupling", 2507 | "interfaces", 2508 | "interoperability", 2509 | "standards" 2510 | ], 2511 | "support": { 2512 | "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.0" 2513 | }, 2514 | "funding": [ 2515 | { 2516 | "url": "https://symfony.com/sponsor", 2517 | "type": "custom" 2518 | }, 2519 | { 2520 | "url": "https://github.com/fabpot", 2521 | "type": "github" 2522 | }, 2523 | { 2524 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2525 | "type": "tidelift" 2526 | } 2527 | ], 2528 | "time": "2021-07-15T12:33:35+00:00" 2529 | }, 2530 | { 2531 | "name": "symfony/filesystem", 2532 | "version": "v6.0.6", 2533 | "source": { 2534 | "type": "git", 2535 | "url": "https://github.com/symfony/filesystem.git", 2536 | "reference": "52b888523545b0b4049ab9ce48766802484d7046" 2537 | }, 2538 | "dist": { 2539 | "type": "zip", 2540 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b888523545b0b4049ab9ce48766802484d7046", 2541 | "reference": "52b888523545b0b4049ab9ce48766802484d7046", 2542 | "shasum": "" 2543 | }, 2544 | "require": { 2545 | "php": ">=8.0.2", 2546 | "symfony/polyfill-ctype": "~1.8", 2547 | "symfony/polyfill-mbstring": "~1.8" 2548 | }, 2549 | "type": "library", 2550 | "autoload": { 2551 | "psr-4": { 2552 | "Symfony\\Component\\Filesystem\\": "" 2553 | }, 2554 | "exclude-from-classmap": [ 2555 | "/Tests/" 2556 | ] 2557 | }, 2558 | "notification-url": "https://packagist.org/downloads/", 2559 | "license": [ 2560 | "MIT" 2561 | ], 2562 | "authors": [ 2563 | { 2564 | "name": "Fabien Potencier", 2565 | "email": "fabien@symfony.com" 2566 | }, 2567 | { 2568 | "name": "Symfony Community", 2569 | "homepage": "https://symfony.com/contributors" 2570 | } 2571 | ], 2572 | "description": "Provides basic utilities for the filesystem", 2573 | "homepage": "https://symfony.com", 2574 | "support": { 2575 | "source": "https://github.com/symfony/filesystem/tree/v6.0.6" 2576 | }, 2577 | "funding": [ 2578 | { 2579 | "url": "https://symfony.com/sponsor", 2580 | "type": "custom" 2581 | }, 2582 | { 2583 | "url": "https://github.com/fabpot", 2584 | "type": "github" 2585 | }, 2586 | { 2587 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2588 | "type": "tidelift" 2589 | } 2590 | ], 2591 | "time": "2022-03-02T12:58:14+00:00" 2592 | }, 2593 | { 2594 | "name": "symfony/finder", 2595 | "version": "v6.0.3", 2596 | "source": { 2597 | "type": "git", 2598 | "url": "https://github.com/symfony/finder.git", 2599 | "reference": "8661b74dbabc23223f38c9b99d3f8ade71170430" 2600 | }, 2601 | "dist": { 2602 | "type": "zip", 2603 | "url": "https://api.github.com/repos/symfony/finder/zipball/8661b74dbabc23223f38c9b99d3f8ade71170430", 2604 | "reference": "8661b74dbabc23223f38c9b99d3f8ade71170430", 2605 | "shasum": "" 2606 | }, 2607 | "require": { 2608 | "php": ">=8.0.2" 2609 | }, 2610 | "type": "library", 2611 | "autoload": { 2612 | "psr-4": { 2613 | "Symfony\\Component\\Finder\\": "" 2614 | }, 2615 | "exclude-from-classmap": [ 2616 | "/Tests/" 2617 | ] 2618 | }, 2619 | "notification-url": "https://packagist.org/downloads/", 2620 | "license": [ 2621 | "MIT" 2622 | ], 2623 | "authors": [ 2624 | { 2625 | "name": "Fabien Potencier", 2626 | "email": "fabien@symfony.com" 2627 | }, 2628 | { 2629 | "name": "Symfony Community", 2630 | "homepage": "https://symfony.com/contributors" 2631 | } 2632 | ], 2633 | "description": "Finds files and directories via an intuitive fluent interface", 2634 | "homepage": "https://symfony.com", 2635 | "support": { 2636 | "source": "https://github.com/symfony/finder/tree/v6.0.3" 2637 | }, 2638 | "funding": [ 2639 | { 2640 | "url": "https://symfony.com/sponsor", 2641 | "type": "custom" 2642 | }, 2643 | { 2644 | "url": "https://github.com/fabpot", 2645 | "type": "github" 2646 | }, 2647 | { 2648 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2649 | "type": "tidelift" 2650 | } 2651 | ], 2652 | "time": "2022-01-26T17:23:29+00:00" 2653 | }, 2654 | { 2655 | "name": "symfony/options-resolver", 2656 | "version": "v6.0.3", 2657 | "source": { 2658 | "type": "git", 2659 | "url": "https://github.com/symfony/options-resolver.git", 2660 | "reference": "51f7006670febe4cbcbae177cbffe93ff833250d" 2661 | }, 2662 | "dist": { 2663 | "type": "zip", 2664 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/51f7006670febe4cbcbae177cbffe93ff833250d", 2665 | "reference": "51f7006670febe4cbcbae177cbffe93ff833250d", 2666 | "shasum": "" 2667 | }, 2668 | "require": { 2669 | "php": ">=8.0.2", 2670 | "symfony/deprecation-contracts": "^2.1|^3" 2671 | }, 2672 | "type": "library", 2673 | "autoload": { 2674 | "psr-4": { 2675 | "Symfony\\Component\\OptionsResolver\\": "" 2676 | }, 2677 | "exclude-from-classmap": [ 2678 | "/Tests/" 2679 | ] 2680 | }, 2681 | "notification-url": "https://packagist.org/downloads/", 2682 | "license": [ 2683 | "MIT" 2684 | ], 2685 | "authors": [ 2686 | { 2687 | "name": "Fabien Potencier", 2688 | "email": "fabien@symfony.com" 2689 | }, 2690 | { 2691 | "name": "Symfony Community", 2692 | "homepage": "https://symfony.com/contributors" 2693 | } 2694 | ], 2695 | "description": "Provides an improved replacement for the array_replace PHP function", 2696 | "homepage": "https://symfony.com", 2697 | "keywords": [ 2698 | "config", 2699 | "configuration", 2700 | "options" 2701 | ], 2702 | "support": { 2703 | "source": "https://github.com/symfony/options-resolver/tree/v6.0.3" 2704 | }, 2705 | "funding": [ 2706 | { 2707 | "url": "https://symfony.com/sponsor", 2708 | "type": "custom" 2709 | }, 2710 | { 2711 | "url": "https://github.com/fabpot", 2712 | "type": "github" 2713 | }, 2714 | { 2715 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2716 | "type": "tidelift" 2717 | } 2718 | ], 2719 | "time": "2022-01-02T09:55:41+00:00" 2720 | }, 2721 | { 2722 | "name": "symfony/polyfill-intl-grapheme", 2723 | "version": "v1.25.0", 2724 | "source": { 2725 | "type": "git", 2726 | "url": "https://github.com/symfony/polyfill-intl-grapheme.git", 2727 | "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" 2728 | }, 2729 | "dist": { 2730 | "type": "zip", 2731 | "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", 2732 | "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", 2733 | "shasum": "" 2734 | }, 2735 | "require": { 2736 | "php": ">=7.1" 2737 | }, 2738 | "suggest": { 2739 | "ext-intl": "For best performance" 2740 | }, 2741 | "type": "library", 2742 | "extra": { 2743 | "branch-alias": { 2744 | "dev-main": "1.23-dev" 2745 | }, 2746 | "thanks": { 2747 | "name": "symfony/polyfill", 2748 | "url": "https://github.com/symfony/polyfill" 2749 | } 2750 | }, 2751 | "autoload": { 2752 | "files": [ 2753 | "bootstrap.php" 2754 | ], 2755 | "psr-4": { 2756 | "Symfony\\Polyfill\\Intl\\Grapheme\\": "" 2757 | } 2758 | }, 2759 | "notification-url": "https://packagist.org/downloads/", 2760 | "license": [ 2761 | "MIT" 2762 | ], 2763 | "authors": [ 2764 | { 2765 | "name": "Nicolas Grekas", 2766 | "email": "p@tchwork.com" 2767 | }, 2768 | { 2769 | "name": "Symfony Community", 2770 | "homepage": "https://symfony.com/contributors" 2771 | } 2772 | ], 2773 | "description": "Symfony polyfill for intl's grapheme_* functions", 2774 | "homepage": "https://symfony.com", 2775 | "keywords": [ 2776 | "compatibility", 2777 | "grapheme", 2778 | "intl", 2779 | "polyfill", 2780 | "portable", 2781 | "shim" 2782 | ], 2783 | "support": { 2784 | "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0" 2785 | }, 2786 | "funding": [ 2787 | { 2788 | "url": "https://symfony.com/sponsor", 2789 | "type": "custom" 2790 | }, 2791 | { 2792 | "url": "https://github.com/fabpot", 2793 | "type": "github" 2794 | }, 2795 | { 2796 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2797 | "type": "tidelift" 2798 | } 2799 | ], 2800 | "time": "2021-11-23T21:10:46+00:00" 2801 | }, 2802 | { 2803 | "name": "symfony/polyfill-intl-normalizer", 2804 | "version": "v1.25.0", 2805 | "source": { 2806 | "type": "git", 2807 | "url": "https://github.com/symfony/polyfill-intl-normalizer.git", 2808 | "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" 2809 | }, 2810 | "dist": { 2811 | "type": "zip", 2812 | "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", 2813 | "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", 2814 | "shasum": "" 2815 | }, 2816 | "require": { 2817 | "php": ">=7.1" 2818 | }, 2819 | "suggest": { 2820 | "ext-intl": "For best performance" 2821 | }, 2822 | "type": "library", 2823 | "extra": { 2824 | "branch-alias": { 2825 | "dev-main": "1.23-dev" 2826 | }, 2827 | "thanks": { 2828 | "name": "symfony/polyfill", 2829 | "url": "https://github.com/symfony/polyfill" 2830 | } 2831 | }, 2832 | "autoload": { 2833 | "files": [ 2834 | "bootstrap.php" 2835 | ], 2836 | "psr-4": { 2837 | "Symfony\\Polyfill\\Intl\\Normalizer\\": "" 2838 | }, 2839 | "classmap": [ 2840 | "Resources/stubs" 2841 | ] 2842 | }, 2843 | "notification-url": "https://packagist.org/downloads/", 2844 | "license": [ 2845 | "MIT" 2846 | ], 2847 | "authors": [ 2848 | { 2849 | "name": "Nicolas Grekas", 2850 | "email": "p@tchwork.com" 2851 | }, 2852 | { 2853 | "name": "Symfony Community", 2854 | "homepage": "https://symfony.com/contributors" 2855 | } 2856 | ], 2857 | "description": "Symfony polyfill for intl's Normalizer class and related functions", 2858 | "homepage": "https://symfony.com", 2859 | "keywords": [ 2860 | "compatibility", 2861 | "intl", 2862 | "normalizer", 2863 | "polyfill", 2864 | "portable", 2865 | "shim" 2866 | ], 2867 | "support": { 2868 | "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0" 2869 | }, 2870 | "funding": [ 2871 | { 2872 | "url": "https://symfony.com/sponsor", 2873 | "type": "custom" 2874 | }, 2875 | { 2876 | "url": "https://github.com/fabpot", 2877 | "type": "github" 2878 | }, 2879 | { 2880 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2881 | "type": "tidelift" 2882 | } 2883 | ], 2884 | "time": "2021-02-19T12:13:01+00:00" 2885 | }, 2886 | { 2887 | "name": "symfony/polyfill-php81", 2888 | "version": "v1.25.0", 2889 | "source": { 2890 | "type": "git", 2891 | "url": "https://github.com/symfony/polyfill-php81.git", 2892 | "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" 2893 | }, 2894 | "dist": { 2895 | "type": "zip", 2896 | "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", 2897 | "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", 2898 | "shasum": "" 2899 | }, 2900 | "require": { 2901 | "php": ">=7.1" 2902 | }, 2903 | "type": "library", 2904 | "extra": { 2905 | "branch-alias": { 2906 | "dev-main": "1.23-dev" 2907 | }, 2908 | "thanks": { 2909 | "name": "symfony/polyfill", 2910 | "url": "https://github.com/symfony/polyfill" 2911 | } 2912 | }, 2913 | "autoload": { 2914 | "files": [ 2915 | "bootstrap.php" 2916 | ], 2917 | "psr-4": { 2918 | "Symfony\\Polyfill\\Php81\\": "" 2919 | }, 2920 | "classmap": [ 2921 | "Resources/stubs" 2922 | ] 2923 | }, 2924 | "notification-url": "https://packagist.org/downloads/", 2925 | "license": [ 2926 | "MIT" 2927 | ], 2928 | "authors": [ 2929 | { 2930 | "name": "Nicolas Grekas", 2931 | "email": "p@tchwork.com" 2932 | }, 2933 | { 2934 | "name": "Symfony Community", 2935 | "homepage": "https://symfony.com/contributors" 2936 | } 2937 | ], 2938 | "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", 2939 | "homepage": "https://symfony.com", 2940 | "keywords": [ 2941 | "compatibility", 2942 | "polyfill", 2943 | "portable", 2944 | "shim" 2945 | ], 2946 | "support": { 2947 | "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0" 2948 | }, 2949 | "funding": [ 2950 | { 2951 | "url": "https://symfony.com/sponsor", 2952 | "type": "custom" 2953 | }, 2954 | { 2955 | "url": "https://github.com/fabpot", 2956 | "type": "github" 2957 | }, 2958 | { 2959 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 2960 | "type": "tidelift" 2961 | } 2962 | ], 2963 | "time": "2021-09-13T13:58:11+00:00" 2964 | }, 2965 | { 2966 | "name": "symfony/process", 2967 | "version": "v6.0.5", 2968 | "source": { 2969 | "type": "git", 2970 | "url": "https://github.com/symfony/process.git", 2971 | "reference": "1ccceccc6497e96f4f646218f04b97ae7d9fa7a1" 2972 | }, 2973 | "dist": { 2974 | "type": "zip", 2975 | "url": "https://api.github.com/repos/symfony/process/zipball/1ccceccc6497e96f4f646218f04b97ae7d9fa7a1", 2976 | "reference": "1ccceccc6497e96f4f646218f04b97ae7d9fa7a1", 2977 | "shasum": "" 2978 | }, 2979 | "require": { 2980 | "php": ">=8.0.2" 2981 | }, 2982 | "type": "library", 2983 | "autoload": { 2984 | "psr-4": { 2985 | "Symfony\\Component\\Process\\": "" 2986 | }, 2987 | "exclude-from-classmap": [ 2988 | "/Tests/" 2989 | ] 2990 | }, 2991 | "notification-url": "https://packagist.org/downloads/", 2992 | "license": [ 2993 | "MIT" 2994 | ], 2995 | "authors": [ 2996 | { 2997 | "name": "Fabien Potencier", 2998 | "email": "fabien@symfony.com" 2999 | }, 3000 | { 3001 | "name": "Symfony Community", 3002 | "homepage": "https://symfony.com/contributors" 3003 | } 3004 | ], 3005 | "description": "Executes commands in sub-processes", 3006 | "homepage": "https://symfony.com", 3007 | "support": { 3008 | "source": "https://github.com/symfony/process/tree/v6.0.5" 3009 | }, 3010 | "funding": [ 3011 | { 3012 | "url": "https://symfony.com/sponsor", 3013 | "type": "custom" 3014 | }, 3015 | { 3016 | "url": "https://github.com/fabpot", 3017 | "type": "github" 3018 | }, 3019 | { 3020 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3021 | "type": "tidelift" 3022 | } 3023 | ], 3024 | "time": "2022-01-30T18:19:12+00:00" 3025 | }, 3026 | { 3027 | "name": "symfony/service-contracts", 3028 | "version": "v3.0.0", 3029 | "source": { 3030 | "type": "git", 3031 | "url": "https://github.com/symfony/service-contracts.git", 3032 | "reference": "36715ebf9fb9db73db0cb24263c79077c6fe8603" 3033 | }, 3034 | "dist": { 3035 | "type": "zip", 3036 | "url": "https://api.github.com/repos/symfony/service-contracts/zipball/36715ebf9fb9db73db0cb24263c79077c6fe8603", 3037 | "reference": "36715ebf9fb9db73db0cb24263c79077c6fe8603", 3038 | "shasum": "" 3039 | }, 3040 | "require": { 3041 | "php": ">=8.0.2", 3042 | "psr/container": "^2.0" 3043 | }, 3044 | "conflict": { 3045 | "ext-psr": "<1.1|>=2" 3046 | }, 3047 | "suggest": { 3048 | "symfony/service-implementation": "" 3049 | }, 3050 | "type": "library", 3051 | "extra": { 3052 | "branch-alias": { 3053 | "dev-main": "3.0-dev" 3054 | }, 3055 | "thanks": { 3056 | "name": "symfony/contracts", 3057 | "url": "https://github.com/symfony/contracts" 3058 | } 3059 | }, 3060 | "autoload": { 3061 | "psr-4": { 3062 | "Symfony\\Contracts\\Service\\": "" 3063 | } 3064 | }, 3065 | "notification-url": "https://packagist.org/downloads/", 3066 | "license": [ 3067 | "MIT" 3068 | ], 3069 | "authors": [ 3070 | { 3071 | "name": "Nicolas Grekas", 3072 | "email": "p@tchwork.com" 3073 | }, 3074 | { 3075 | "name": "Symfony Community", 3076 | "homepage": "https://symfony.com/contributors" 3077 | } 3078 | ], 3079 | "description": "Generic abstractions related to writing services", 3080 | "homepage": "https://symfony.com", 3081 | "keywords": [ 3082 | "abstractions", 3083 | "contracts", 3084 | "decoupling", 3085 | "interfaces", 3086 | "interoperability", 3087 | "standards" 3088 | ], 3089 | "support": { 3090 | "source": "https://github.com/symfony/service-contracts/tree/v3.0.0" 3091 | }, 3092 | "funding": [ 3093 | { 3094 | "url": "https://symfony.com/sponsor", 3095 | "type": "custom" 3096 | }, 3097 | { 3098 | "url": "https://github.com/fabpot", 3099 | "type": "github" 3100 | }, 3101 | { 3102 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3103 | "type": "tidelift" 3104 | } 3105 | ], 3106 | "time": "2021-11-04T17:53:12+00:00" 3107 | }, 3108 | { 3109 | "name": "symfony/string", 3110 | "version": "v6.0.3", 3111 | "source": { 3112 | "type": "git", 3113 | "url": "https://github.com/symfony/string.git", 3114 | "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2" 3115 | }, 3116 | "dist": { 3117 | "type": "zip", 3118 | "url": "https://api.github.com/repos/symfony/string/zipball/522144f0c4c004c80d56fa47e40e17028e2eefc2", 3119 | "reference": "522144f0c4c004c80d56fa47e40e17028e2eefc2", 3120 | "shasum": "" 3121 | }, 3122 | "require": { 3123 | "php": ">=8.0.2", 3124 | "symfony/polyfill-ctype": "~1.8", 3125 | "symfony/polyfill-intl-grapheme": "~1.0", 3126 | "symfony/polyfill-intl-normalizer": "~1.0", 3127 | "symfony/polyfill-mbstring": "~1.0" 3128 | }, 3129 | "conflict": { 3130 | "symfony/translation-contracts": "<2.0" 3131 | }, 3132 | "require-dev": { 3133 | "symfony/error-handler": "^5.4|^6.0", 3134 | "symfony/http-client": "^5.4|^6.0", 3135 | "symfony/translation-contracts": "^2.0|^3.0", 3136 | "symfony/var-exporter": "^5.4|^6.0" 3137 | }, 3138 | "type": "library", 3139 | "autoload": { 3140 | "files": [ 3141 | "Resources/functions.php" 3142 | ], 3143 | "psr-4": { 3144 | "Symfony\\Component\\String\\": "" 3145 | }, 3146 | "exclude-from-classmap": [ 3147 | "/Tests/" 3148 | ] 3149 | }, 3150 | "notification-url": "https://packagist.org/downloads/", 3151 | "license": [ 3152 | "MIT" 3153 | ], 3154 | "authors": [ 3155 | { 3156 | "name": "Nicolas Grekas", 3157 | "email": "p@tchwork.com" 3158 | }, 3159 | { 3160 | "name": "Symfony Community", 3161 | "homepage": "https://symfony.com/contributors" 3162 | } 3163 | ], 3164 | "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", 3165 | "homepage": "https://symfony.com", 3166 | "keywords": [ 3167 | "grapheme", 3168 | "i18n", 3169 | "string", 3170 | "unicode", 3171 | "utf-8", 3172 | "utf8" 3173 | ], 3174 | "support": { 3175 | "source": "https://github.com/symfony/string/tree/v6.0.3" 3176 | }, 3177 | "funding": [ 3178 | { 3179 | "url": "https://symfony.com/sponsor", 3180 | "type": "custom" 3181 | }, 3182 | { 3183 | "url": "https://github.com/fabpot", 3184 | "type": "github" 3185 | }, 3186 | { 3187 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3188 | "type": "tidelift" 3189 | } 3190 | ], 3191 | "time": "2022-01-02T09:55:41+00:00" 3192 | }, 3193 | { 3194 | "name": "symfony/yaml", 3195 | "version": "v6.0.3", 3196 | "source": { 3197 | "type": "git", 3198 | "url": "https://github.com/symfony/yaml.git", 3199 | "reference": "e77f3ea0b21141d771d4a5655faa54f692b34af5" 3200 | }, 3201 | "dist": { 3202 | "type": "zip", 3203 | "url": "https://api.github.com/repos/symfony/yaml/zipball/e77f3ea0b21141d771d4a5655faa54f692b34af5", 3204 | "reference": "e77f3ea0b21141d771d4a5655faa54f692b34af5", 3205 | "shasum": "" 3206 | }, 3207 | "require": { 3208 | "php": ">=8.0.2", 3209 | "symfony/polyfill-ctype": "^1.8" 3210 | }, 3211 | "conflict": { 3212 | "symfony/console": "<5.4" 3213 | }, 3214 | "require-dev": { 3215 | "symfony/console": "^5.4|^6.0" 3216 | }, 3217 | "suggest": { 3218 | "symfony/console": "For validating YAML files using the lint command" 3219 | }, 3220 | "bin": [ 3221 | "Resources/bin/yaml-lint" 3222 | ], 3223 | "type": "library", 3224 | "autoload": { 3225 | "psr-4": { 3226 | "Symfony\\Component\\Yaml\\": "" 3227 | }, 3228 | "exclude-from-classmap": [ 3229 | "/Tests/" 3230 | ] 3231 | }, 3232 | "notification-url": "https://packagist.org/downloads/", 3233 | "license": [ 3234 | "MIT" 3235 | ], 3236 | "authors": [ 3237 | { 3238 | "name": "Fabien Potencier", 3239 | "email": "fabien@symfony.com" 3240 | }, 3241 | { 3242 | "name": "Symfony Community", 3243 | "homepage": "https://symfony.com/contributors" 3244 | } 3245 | ], 3246 | "description": "Loads and dumps YAML files", 3247 | "homepage": "https://symfony.com", 3248 | "support": { 3249 | "source": "https://github.com/symfony/yaml/tree/v6.0.3" 3250 | }, 3251 | "funding": [ 3252 | { 3253 | "url": "https://symfony.com/sponsor", 3254 | "type": "custom" 3255 | }, 3256 | { 3257 | "url": "https://github.com/fabpot", 3258 | "type": "github" 3259 | }, 3260 | { 3261 | "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 3262 | "type": "tidelift" 3263 | } 3264 | ], 3265 | "time": "2022-01-26T17:23:29+00:00" 3266 | } 3267 | ], 3268 | "aliases": [], 3269 | "minimum-stability": "stable", 3270 | "stability-flags": [], 3271 | "prefer-stable": false, 3272 | "prefer-lowest": false, 3273 | "platform": { 3274 | "ext-pdo": "*" 3275 | }, 3276 | "platform-dev": [], 3277 | "plugin-api-version": "2.1.0" 3278 | } 3279 | --------------------------------------------------------------------------------