forked from qwerty/milfs
mejoras en la API
This commit is contained in:
parent
b4dbb0ded1
commit
1d1fcf266d
@ -6,14 +6,17 @@ function Conectarse(){
|
|||||||
if(!isset($db)) {
|
if(!isset($db)) {
|
||||||
@include("milfs/includes/datos.php");
|
@include("milfs/includes/datos.php");
|
||||||
if(!isset($db)) {
|
if(!isset($db)) {
|
||||||
include("../milfs/includes/datos.php");
|
@include("../milfs/includes/datos.php");
|
||||||
|
}
|
||||||
|
if(!isset($db)) {
|
||||||
|
include("../../includes/datos.php");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!($link=mysqli_connect($servidor,$usuario,$password,$db)))
|
if (!($link=mysqli_connect($servidor,$usuario,$password,$db)))
|
||||||
{
|
{
|
||||||
echo "Error conectando a la base de datos. ";
|
echo " Error conectando a la base de datos. ";
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
/* if (!mysqli_select_db($db,$link))
|
/* if (!mysqli_select_db($db,$link))
|
||||||
|
@ -11394,7 +11394,7 @@ function json($datos){
|
|||||||
$publico = "AND form_id.id_empresa = '$_SESSION[id_empresa]'";
|
$publico = "AND form_id.id_empresa = '$_SESSION[id_empresa]'";
|
||||||
$w_publico = "WHERE form_id.id_empresa = '$_SESSION[id_empresa]' ";
|
$w_publico = "WHERE form_id.id_empresa = '$_SESSION[id_empresa]' ";
|
||||||
}
|
}
|
||||||
$datos = mysql_seguridad($datos);
|
//$datos = mysql_seguridad($datos);
|
||||||
$link=Conectarse();
|
$link=Conectarse();
|
||||||
mysqli_set_charset($link, "utf8");
|
mysqli_set_charset($link, "utf8");
|
||||||
if($datos["id"] !=''){
|
if($datos["id"] !=''){
|
||||||
@ -11445,8 +11445,7 @@ mysqli_set_charset($link, "utf8");
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}else{}
|
||||||
|
|
||||||
|
|
||||||
if($datos["tipo"] == "array" ) {
|
if($datos["tipo"] == "array" ) {
|
||||||
$resultado = $features;
|
$resultado = $features;
|
||||||
@ -11511,7 +11510,7 @@ mysqli_set_charset($link, "utf8");
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$sql = mysqli_query($link,$consulta) or die("Error al ejecutar consulta 04 ");
|
$sql = mysqli_query($link,$consulta) or die("Error al ejecutar consulta 04 $consulta");
|
||||||
if (mysqli_num_rows($sql)!='0'){
|
if (mysqli_num_rows($sql)!='0'){
|
||||||
$i = 1;
|
$i = 1;
|
||||||
$features = array();
|
$features = array();
|
||||||
@ -18554,8 +18553,8 @@ function cmp($a, $b) {//Ordenar los numeros descendientemente
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function holamundo() {
|
function holamundo($div) {
|
||||||
|
if($div ==""){ return "Hola mundo";}
|
||||||
$respuesta = new xajaxResponse('utf-8');
|
$respuesta = new xajaxResponse('utf-8');
|
||||||
//$respuesta->addAssign("mensaje_$control","innerHTML","");
|
//$respuesta->addAssign("mensaje_$control","innerHTML","");
|
||||||
$respuesta->addAlert("Hola mundo!");
|
$respuesta->addAlert("Hola mundo!");
|
||||||
|
5
rest/composer.json
Normal file
5
rest/composer.json
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"require": {
|
||||||
|
"slim/slim": "^3.0"
|
||||||
|
}
|
||||||
|
}
|
316
rest/composer.lock
generated
Normal file
316
rest/composer.lock
generated
Normal file
@ -0,0 +1,316 @@
|
|||||||
|
{
|
||||||
|
"_readme": [
|
||||||
|
"This file locks the dependencies of your project to a known state",
|
||||||
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
|
"This file is @generated automatically"
|
||||||
|
],
|
||||||
|
"hash": "6f5d3d05d70b58db9144bb1ca70c8698",
|
||||||
|
"content-hash": "3b0766dbcef4dfb1a4a2012fef8611d8",
|
||||||
|
"packages": [
|
||||||
|
{
|
||||||
|
"name": "container-interop/container-interop",
|
||||||
|
"version": "1.2.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/container-interop/container-interop.git",
|
||||||
|
"reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
|
||||||
|
"reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"psr/container": "^1.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Interop\\Container\\": "src/Interop/Container/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
|
||||||
|
"homepage": "https://github.com/container-interop/container-interop",
|
||||||
|
"time": "2017-02-14 19:40:03"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nikic/fast-route",
|
||||||
|
"version": "v1.3.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nikic/FastRoute.git",
|
||||||
|
"reference": "181d480e08d9476e61381e04a71b34dc0432e812"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812",
|
||||||
|
"reference": "181d480e08d9476e61381e04a71b34dc0432e812",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35|~5.7"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"FastRoute\\": "src/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/functions.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nikita Popov",
|
||||||
|
"email": "nikic@php.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Fast request router for PHP",
|
||||||
|
"keywords": [
|
||||||
|
"router",
|
||||||
|
"routing"
|
||||||
|
],
|
||||||
|
"time": "2018-02-13 20:26:39"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "pimple/pimple",
|
||||||
|
"version": "v3.2.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/silexphp/Pimple.git",
|
||||||
|
"reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
|
||||||
|
"reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0",
|
||||||
|
"psr/container": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "^3.2"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.2.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Pimple": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Pimple, a simple Dependency Injection Container",
|
||||||
|
"homepage": "http://pimple.sensiolabs.org",
|
||||||
|
"keywords": [
|
||||||
|
"container",
|
||||||
|
"dependency injection"
|
||||||
|
],
|
||||||
|
"time": "2018-01-21 07:42:36"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/container",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/container.git",
|
||||||
|
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
||||||
|
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Container\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common Container Interface (PHP FIG PSR-11)",
|
||||||
|
"homepage": "https://github.com/php-fig/container",
|
||||||
|
"keywords": [
|
||||||
|
"PSR-11",
|
||||||
|
"container",
|
||||||
|
"container-interface",
|
||||||
|
"container-interop",
|
||||||
|
"psr"
|
||||||
|
],
|
||||||
|
"time": "2017-02-14 16:28:37"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/http-message",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/http-message.git",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Http\\Message\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for HTTP messages",
|
||||||
|
"homepage": "https://github.com/php-fig/http-message",
|
||||||
|
"keywords": [
|
||||||
|
"http",
|
||||||
|
"http-message",
|
||||||
|
"psr",
|
||||||
|
"psr-7",
|
||||||
|
"request",
|
||||||
|
"response"
|
||||||
|
],
|
||||||
|
"time": "2016-08-06 14:39:51"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "slim/slim",
|
||||||
|
"version": "3.11.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/slimphp/Slim.git",
|
||||||
|
"reference": "d378e70431e78ee92ee32ddde61ecc72edf5dc0a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/slimphp/Slim/zipball/d378e70431e78ee92ee32ddde61ecc72edf5dc0a",
|
||||||
|
"reference": "d378e70431e78ee92ee32ddde61ecc72edf5dc0a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"container-interop/container-interop": "^1.2",
|
||||||
|
"nikic/fast-route": "^1.0",
|
||||||
|
"php": ">=5.5.0",
|
||||||
|
"pimple/pimple": "^3.0",
|
||||||
|
"psr/container": "^1.0",
|
||||||
|
"psr/http-message": "^1.0"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"psr/http-message-implementation": "1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.0",
|
||||||
|
"squizlabs/php_codesniffer": "^2.5"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Slim\\": "Slim"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Rob Allen",
|
||||||
|
"email": "rob@akrabat.com",
|
||||||
|
"homepage": "http://akrabat.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Josh Lockhart",
|
||||||
|
"email": "hello@joshlockhart.com",
|
||||||
|
"homepage": "https://joshlockhart.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Gabriel Manricks",
|
||||||
|
"email": "gmanricks@me.com",
|
||||||
|
"homepage": "http://gabrielmanricks.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Andrew Smith",
|
||||||
|
"email": "a.smith@silentworks.co.uk",
|
||||||
|
"homepage": "http://silentworks.co.uk"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
|
||||||
|
"homepage": "https://slimframework.com",
|
||||||
|
"keywords": [
|
||||||
|
"api",
|
||||||
|
"framework",
|
||||||
|
"micro",
|
||||||
|
"router"
|
||||||
|
],
|
||||||
|
"time": "2018-09-16 10:54:21"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packages-dev": [],
|
||||||
|
"aliases": [],
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"stability-flags": [],
|
||||||
|
"prefer-stable": false,
|
||||||
|
"prefer-lowest": false,
|
||||||
|
"platform": [],
|
||||||
|
"platform-dev": []
|
||||||
|
}
|
3
rest/public/.htaccess
Normal file
3
rest/public/.htaccess
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
RewriteEngine On
|
||||||
|
RewriteCond %{REQUEST_FILENAME} !-f
|
||||||
|
RewriteRule ^ index.php [QSA,L]
|
23
rest/public/index.php
Normal file
23
rest/public/index.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
session_start();
|
||||||
|
//ini_set('display_errors', 'On');
|
||||||
|
if(isset($_REQUEST['debug'])) {
|
||||||
|
print_r( $_SESSION );
|
||||||
|
ini_set('display_errors', 'On');}
|
||||||
|
use \Psr\Http\Message\ServerRequestInterface as Request;
|
||||||
|
use \Psr\Http\Message\ResponseInterface as Response;
|
||||||
|
require ('../../xajax/xajax.inc.php');
|
||||||
|
|
||||||
|
$xajax = new xajax("");
|
||||||
|
require '../vendor/autoload.php';
|
||||||
|
require "../../funciones/conex.php";
|
||||||
|
require '../../funciones/funciones.php';
|
||||||
|
|
||||||
|
$xajax->processRequests();
|
||||||
|
// $xajax->printJavascript("xajax/");
|
||||||
|
$app = new \Slim\App;
|
||||||
|
require '../src/rutas/aplicaciones.php';
|
||||||
|
///Ruta aplicaciones
|
||||||
|
|
||||||
|
$app->run();
|
||||||
|
?>
|
23
rest/src/rutas/aplicaciones.php
Normal file
23
rest/src/rutas/aplicaciones.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
use \Psr\Http\Message\ServerRequestInterface as Request;
|
||||||
|
use \Psr\Http\Message\ResponseInterface as Response;
|
||||||
|
|
||||||
|
$app =new \Slim\app;
|
||||||
|
// aplicaicon por id
|
||||||
|
$app ->get('/api/aplicaciones/{id}', function(Request $request, Response $response){
|
||||||
|
$datos= array();
|
||||||
|
$datos['id']= $request->getAttribute('id');
|
||||||
|
$datos['tipo']='simple';
|
||||||
|
|
||||||
|
echo json($datos);
|
||||||
|
|
||||||
|
});
|
||||||
|
// todas las aplicaciones
|
||||||
|
$app ->get('/api/aplicaciones/', function(Request $request, Response $response){
|
||||||
|
|
||||||
|
$datos= array();
|
||||||
|
$datos['id']= '';
|
||||||
|
$datos['tipo']='simple';
|
||||||
|
echo json('');
|
||||||
|
|
||||||
|
});
|
7
rest/vendor/autoload.php
vendored
Normal file
7
rest/vendor/autoload.php
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload.php @generated by Composer
|
||||||
|
|
||||||
|
require_once __DIR__ . '/composer/autoload_real.php';
|
||||||
|
|
||||||
|
return ComposerAutoloaderInitf276a0def1050763d961e731ed5733c4::getLoader();
|
415
rest/vendor/composer/ClassLoader.php
vendored
Normal file
415
rest/vendor/composer/ClassLoader.php
vendored
Normal file
@ -0,0 +1,415 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Composer.
|
||||||
|
*
|
||||||
|
* (c) Nils Adermann <naderman@naderman.de>
|
||||||
|
* Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Composer\Autoload;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
||||||
|
*
|
||||||
|
* $loader = new \Composer\Autoload\ClassLoader();
|
||||||
|
*
|
||||||
|
* // register classes with namespaces
|
||||||
|
* $loader->add('Symfony\Component', __DIR__.'/component');
|
||||||
|
* $loader->add('Symfony', __DIR__.'/framework');
|
||||||
|
*
|
||||||
|
* // activate the autoloader
|
||||||
|
* $loader->register();
|
||||||
|
*
|
||||||
|
* // to enable searching the include path (eg. for PEAR packages)
|
||||||
|
* $loader->setUseIncludePath(true);
|
||||||
|
*
|
||||||
|
* In this example, if you try to use a class in the Symfony\Component
|
||||||
|
* namespace or one of its children (Symfony\Component\Console for instance),
|
||||||
|
* the autoloader will first look for the class under the component/
|
||||||
|
* directory, and it will then fallback to the framework/ directory if not
|
||||||
|
* found before giving up.
|
||||||
|
*
|
||||||
|
* This class is loosely based on the Symfony UniversalClassLoader.
|
||||||
|
*
|
||||||
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
* @see http://www.php-fig.org/psr/psr-0/
|
||||||
|
* @see http://www.php-fig.org/psr/psr-4/
|
||||||
|
*/
|
||||||
|
class ClassLoader
|
||||||
|
{
|
||||||
|
// PSR-4
|
||||||
|
private $prefixLengthsPsr4 = array();
|
||||||
|
private $prefixDirsPsr4 = array();
|
||||||
|
private $fallbackDirsPsr4 = array();
|
||||||
|
|
||||||
|
// PSR-0
|
||||||
|
private $prefixesPsr0 = array();
|
||||||
|
private $fallbackDirsPsr0 = array();
|
||||||
|
|
||||||
|
private $useIncludePath = false;
|
||||||
|
private $classMap = array();
|
||||||
|
private $classMapAuthoritative = false;
|
||||||
|
private $missingClasses = array();
|
||||||
|
|
||||||
|
public function getPrefixes()
|
||||||
|
{
|
||||||
|
if (!empty($this->prefixesPsr0)) {
|
||||||
|
return call_user_func_array('array_merge', $this->prefixesPsr0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPrefixesPsr4()
|
||||||
|
{
|
||||||
|
return $this->prefixDirsPsr4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFallbackDirs()
|
||||||
|
{
|
||||||
|
return $this->fallbackDirsPsr0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFallbackDirsPsr4()
|
||||||
|
{
|
||||||
|
return $this->fallbackDirsPsr4;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getClassMap()
|
||||||
|
{
|
||||||
|
return $this->classMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $classMap Class to filename map
|
||||||
|
*/
|
||||||
|
public function addClassMap(array $classMap)
|
||||||
|
{
|
||||||
|
if ($this->classMap) {
|
||||||
|
$this->classMap = array_merge($this->classMap, $classMap);
|
||||||
|
} else {
|
||||||
|
$this->classMap = $classMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-0 directories for a given prefix, either
|
||||||
|
* appending or prepending to the ones previously set for this prefix.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix
|
||||||
|
* @param array|string $paths The PSR-0 root directories
|
||||||
|
* @param bool $prepend Whether to prepend the directories
|
||||||
|
*/
|
||||||
|
public function add($prefix, $paths, $prepend = false)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
if ($prepend) {
|
||||||
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
|
(array) $paths,
|
||||||
|
$this->fallbackDirsPsr0
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
|
$this->fallbackDirsPsr0,
|
||||||
|
(array) $paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$first = $prefix[0];
|
||||||
|
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||||
|
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($prepend) {
|
||||||
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
|
(array) $paths,
|
||||||
|
$this->prefixesPsr0[$first][$prefix]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
|
$this->prefixesPsr0[$first][$prefix],
|
||||||
|
(array) $paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-4 directories for a given namespace, either
|
||||||
|
* appending or prepending to the ones previously set for this namespace.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
|
* @param array|string $paths The PSR-4 base directories
|
||||||
|
* @param bool $prepend Whether to prepend the directories
|
||||||
|
*
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function addPsr4($prefix, $paths, $prepend = false)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
// Register directories for the root namespace.
|
||||||
|
if ($prepend) {
|
||||||
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
|
(array) $paths,
|
||||||
|
$this->fallbackDirsPsr4
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
|
$this->fallbackDirsPsr4,
|
||||||
|
(array) $paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||||
|
// Register directories for a new namespace.
|
||||||
|
$length = strlen($prefix);
|
||||||
|
if ('\\' !== $prefix[$length - 1]) {
|
||||||
|
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||||
|
}
|
||||||
|
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||||
|
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||||
|
} elseif ($prepend) {
|
||||||
|
// Prepend directories for an already registered namespace.
|
||||||
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
|
(array) $paths,
|
||||||
|
$this->prefixDirsPsr4[$prefix]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Append directories for an already registered namespace.
|
||||||
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
|
$this->prefixDirsPsr4[$prefix],
|
||||||
|
(array) $paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-0 directories for a given prefix,
|
||||||
|
* replacing any others previously set for this prefix.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix
|
||||||
|
* @param array|string $paths The PSR-0 base directories
|
||||||
|
*/
|
||||||
|
public function set($prefix, $paths)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
$this->fallbackDirsPsr0 = (array) $paths;
|
||||||
|
} else {
|
||||||
|
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-4 directories for a given namespace,
|
||||||
|
* replacing any others previously set for this namespace.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
|
* @param array|string $paths The PSR-4 base directories
|
||||||
|
*
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function setPsr4($prefix, $paths)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
$this->fallbackDirsPsr4 = (array) $paths;
|
||||||
|
} else {
|
||||||
|
$length = strlen($prefix);
|
||||||
|
if ('\\' !== $prefix[$length - 1]) {
|
||||||
|
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||||
|
}
|
||||||
|
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||||
|
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turns on searching the include path for class files.
|
||||||
|
*
|
||||||
|
* @param bool $useIncludePath
|
||||||
|
*/
|
||||||
|
public function setUseIncludePath($useIncludePath)
|
||||||
|
{
|
||||||
|
$this->useIncludePath = $useIncludePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can be used to check if the autoloader uses the include path to check
|
||||||
|
* for classes.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function getUseIncludePath()
|
||||||
|
{
|
||||||
|
return $this->useIncludePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turns off searching the prefix and fallback directories for classes
|
||||||
|
* that have not been registered with the class map.
|
||||||
|
*
|
||||||
|
* @param bool $classMapAuthoritative
|
||||||
|
*/
|
||||||
|
public function setClassMapAuthoritative($classMapAuthoritative)
|
||||||
|
{
|
||||||
|
$this->classMapAuthoritative = $classMapAuthoritative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should class lookup fail if not found in the current class map?
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isClassMapAuthoritative()
|
||||||
|
{
|
||||||
|
return $this->classMapAuthoritative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers this instance as an autoloader.
|
||||||
|
*
|
||||||
|
* @param bool $prepend Whether to prepend the autoloader or not
|
||||||
|
*/
|
||||||
|
public function register($prepend = false)
|
||||||
|
{
|
||||||
|
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters this instance as an autoloader.
|
||||||
|
*/
|
||||||
|
public function unregister()
|
||||||
|
{
|
||||||
|
spl_autoload_unregister(array($this, 'loadClass'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the given class or interface.
|
||||||
|
*
|
||||||
|
* @param string $class The name of the class
|
||||||
|
* @return bool|null True if loaded, null otherwise
|
||||||
|
*/
|
||||||
|
public function loadClass($class)
|
||||||
|
{
|
||||||
|
if ($file = $this->findFile($class)) {
|
||||||
|
includeFile($file);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the path to the file where the class is defined.
|
||||||
|
*
|
||||||
|
* @param string $class The name of the class
|
||||||
|
*
|
||||||
|
* @return string|false The path if found, false otherwise
|
||||||
|
*/
|
||||||
|
public function findFile($class)
|
||||||
|
{
|
||||||
|
// work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
|
||||||
|
if ('\\' == $class[0]) {
|
||||||
|
$class = substr($class, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// class map lookup
|
||||||
|
if (isset($this->classMap[$class])) {
|
||||||
|
return $this->classMap[$class];
|
||||||
|
}
|
||||||
|
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = $this->findFileWithExtension($class, '.php');
|
||||||
|
|
||||||
|
// Search for Hack files if we are running on HHVM
|
||||||
|
if (false === $file && defined('HHVM_VERSION')) {
|
||||||
|
$file = $this->findFileWithExtension($class, '.hh');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false === $file) {
|
||||||
|
// Remember that this class does not exist.
|
||||||
|
$this->missingClasses[$class] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function findFileWithExtension($class, $ext)
|
||||||
|
{
|
||||||
|
// PSR-4 lookup
|
||||||
|
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
||||||
|
|
||||||
|
$first = $class[0];
|
||||||
|
if (isset($this->prefixLengthsPsr4[$first])) {
|
||||||
|
foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
|
||||||
|
if (0 === strpos($class, $prefix)) {
|
||||||
|
foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-4 fallback dirs
|
||||||
|
foreach ($this->fallbackDirsPsr4 as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-0 lookup
|
||||||
|
if (false !== $pos = strrpos($class, '\\')) {
|
||||||
|
// namespaced class name
|
||||||
|
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
||||||
|
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
||||||
|
} else {
|
||||||
|
// PEAR-like class name
|
||||||
|
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->prefixesPsr0[$first])) {
|
||||||
|
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
||||||
|
if (0 === strpos($class, $prefix)) {
|
||||||
|
foreach ($dirs as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-0 fallback dirs
|
||||||
|
foreach ($this->fallbackDirsPsr0 as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-0 include paths.
|
||||||
|
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scope isolated include.
|
||||||
|
*
|
||||||
|
* Prevents access to $this/self from included files.
|
||||||
|
*/
|
||||||
|
function includeFile($file)
|
||||||
|
{
|
||||||
|
include $file;
|
||||||
|
}
|
56
rest/vendor/composer/LICENSE
vendored
Normal file
56
rest/vendor/composer/LICENSE
vendored
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
|
Upstream-Name: Composer
|
||||||
|
Upstream-Contact: Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
Source: https://github.com/composer/composer
|
||||||
|
|
||||||
|
Files: *
|
||||||
|
Copyright: 2016, Nils Adermann <naderman@naderman.de>
|
||||||
|
2016, Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
License: Expat
|
||||||
|
|
||||||
|
Files: src/Composer/Util/TlsHelper.php
|
||||||
|
Copyright: 2016, Nils Adermann <naderman@naderman.de>
|
||||||
|
2016, Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
2013, Evan Coury <me@evancoury.com>
|
||||||
|
License: Expat and BSD-2-Clause
|
||||||
|
|
||||||
|
License: BSD-2-Clause
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
.
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
.
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||||
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
License: Expat
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is furnished
|
||||||
|
to do so, subject to the following conditions:
|
||||||
|
.
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
.
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
9
rest/vendor/composer/autoload_classmap.php
vendored
Normal file
9
rest/vendor/composer/autoload_classmap.php
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_classmap.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(dirname(__FILE__));
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
);
|
10
rest/vendor/composer/autoload_files.php
vendored
Normal file
10
rest/vendor/composer/autoload_files.php
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_files.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(dirname(__FILE__));
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php',
|
||||||
|
);
|
10
rest/vendor/composer/autoload_namespaces.php
vendored
Normal file
10
rest/vendor/composer/autoload_namespaces.php
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_namespaces.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(dirname(__FILE__));
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Pimple' => array($vendorDir . '/pimple/pimple/src'),
|
||||||
|
);
|
14
rest/vendor/composer/autoload_psr4.php
vendored
Normal file
14
rest/vendor/composer/autoload_psr4.php
vendored
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_psr4.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(dirname(__FILE__));
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Slim\\' => array($vendorDir . '/slim/slim/Slim'),
|
||||||
|
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
|
||||||
|
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
|
||||||
|
'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'),
|
||||||
|
'FastRoute\\' => array($vendorDir . '/nikic/fast-route/src'),
|
||||||
|
);
|
70
rest/vendor/composer/autoload_real.php
vendored
Normal file
70
rest/vendor/composer/autoload_real.php
vendored
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_real.php @generated by Composer
|
||||||
|
|
||||||
|
class ComposerAutoloaderInitf276a0def1050763d961e731ed5733c4
|
||||||
|
{
|
||||||
|
private static $loader;
|
||||||
|
|
||||||
|
public static function loadClassLoader($class)
|
||||||
|
{
|
||||||
|
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||||
|
require __DIR__ . '/ClassLoader.php';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getLoader()
|
||||||
|
{
|
||||||
|
if (null !== self::$loader) {
|
||||||
|
return self::$loader;
|
||||||
|
}
|
||||||
|
|
||||||
|
spl_autoload_register(array('ComposerAutoloaderInitf276a0def1050763d961e731ed5733c4', 'loadClassLoader'), true, true);
|
||||||
|
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
||||||
|
spl_autoload_unregister(array('ComposerAutoloaderInitf276a0def1050763d961e731ed5733c4', 'loadClassLoader'));
|
||||||
|
|
||||||
|
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
|
||||||
|
if ($useStaticLoader) {
|
||||||
|
require_once __DIR__ . '/autoload_static.php';
|
||||||
|
|
||||||
|
call_user_func(\Composer\Autoload\ComposerStaticInitf276a0def1050763d961e731ed5733c4::getInitializer($loader));
|
||||||
|
} else {
|
||||||
|
$map = require __DIR__ . '/autoload_namespaces.php';
|
||||||
|
foreach ($map as $namespace => $path) {
|
||||||
|
$loader->set($namespace, $path);
|
||||||
|
}
|
||||||
|
|
||||||
|
$map = require __DIR__ . '/autoload_psr4.php';
|
||||||
|
foreach ($map as $namespace => $path) {
|
||||||
|
$loader->setPsr4($namespace, $path);
|
||||||
|
}
|
||||||
|
|
||||||
|
$classMap = require __DIR__ . '/autoload_classmap.php';
|
||||||
|
if ($classMap) {
|
||||||
|
$loader->addClassMap($classMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$loader->register(true);
|
||||||
|
|
||||||
|
if ($useStaticLoader) {
|
||||||
|
$includeFiles = Composer\Autoload\ComposerStaticInitf276a0def1050763d961e731ed5733c4::$files;
|
||||||
|
} else {
|
||||||
|
$includeFiles = require __DIR__ . '/autoload_files.php';
|
||||||
|
}
|
||||||
|
foreach ($includeFiles as $fileIdentifier => $file) {
|
||||||
|
composerRequiref276a0def1050763d961e731ed5733c4($fileIdentifier, $file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $loader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function composerRequiref276a0def1050763d961e731ed5733c4($fileIdentifier, $file)
|
||||||
|
{
|
||||||
|
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||||
|
require $file;
|
||||||
|
|
||||||
|
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
||||||
|
}
|
||||||
|
}
|
75
rest/vendor/composer/autoload_static.php
vendored
Normal file
75
rest/vendor/composer/autoload_static.php
vendored
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_static.php @generated by Composer
|
||||||
|
|
||||||
|
namespace Composer\Autoload;
|
||||||
|
|
||||||
|
class ComposerStaticInitf276a0def1050763d961e731ed5733c4
|
||||||
|
{
|
||||||
|
public static $files = array (
|
||||||
|
'253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php',
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $prefixLengthsPsr4 = array (
|
||||||
|
'S' =>
|
||||||
|
array (
|
||||||
|
'Slim\\' => 5,
|
||||||
|
),
|
||||||
|
'P' =>
|
||||||
|
array (
|
||||||
|
'Psr\\Http\\Message\\' => 17,
|
||||||
|
'Psr\\Container\\' => 14,
|
||||||
|
),
|
||||||
|
'I' =>
|
||||||
|
array (
|
||||||
|
'Interop\\Container\\' => 18,
|
||||||
|
),
|
||||||
|
'F' =>
|
||||||
|
array (
|
||||||
|
'FastRoute\\' => 10,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $prefixDirsPsr4 = array (
|
||||||
|
'Slim\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/slim/slim/Slim',
|
||||||
|
),
|
||||||
|
'Psr\\Http\\Message\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/psr/http-message/src',
|
||||||
|
),
|
||||||
|
'Psr\\Container\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/psr/container/src',
|
||||||
|
),
|
||||||
|
'Interop\\Container\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/container-interop/container-interop/src/Interop/Container',
|
||||||
|
),
|
||||||
|
'FastRoute\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/nikic/fast-route/src',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $prefixesPsr0 = array (
|
||||||
|
'P' =>
|
||||||
|
array (
|
||||||
|
'Pimple' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/pimple/pimple/src',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
public static function getInitializer(ClassLoader $loader)
|
||||||
|
{
|
||||||
|
return \Closure::bind(function () use ($loader) {
|
||||||
|
$loader->prefixLengthsPsr4 = ComposerStaticInitf276a0def1050763d961e731ed5733c4::$prefixLengthsPsr4;
|
||||||
|
$loader->prefixDirsPsr4 = ComposerStaticInitf276a0def1050763d961e731ed5733c4::$prefixDirsPsr4;
|
||||||
|
$loader->prefixesPsr0 = ComposerStaticInitf276a0def1050763d961e731ed5733c4::$prefixesPsr0;
|
||||||
|
|
||||||
|
}, null, ClassLoader::class);
|
||||||
|
}
|
||||||
|
}
|
311
rest/vendor/composer/installed.json
vendored
Normal file
311
rest/vendor/composer/installed.json
vendored
Normal file
@ -0,0 +1,311 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "psr/container",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"version_normalized": "1.0.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/container.git",
|
||||||
|
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
||||||
|
"reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"time": "2017-02-14 16:28:37",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Container\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common Container Interface (PHP FIG PSR-11)",
|
||||||
|
"homepage": "https://github.com/php-fig/container",
|
||||||
|
"keywords": [
|
||||||
|
"PSR-11",
|
||||||
|
"container",
|
||||||
|
"container-interface",
|
||||||
|
"container-interop",
|
||||||
|
"psr"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "container-interop/container-interop",
|
||||||
|
"version": "1.2.0",
|
||||||
|
"version_normalized": "1.2.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/container-interop/container-interop.git",
|
||||||
|
"reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8",
|
||||||
|
"reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"psr/container": "^1.0"
|
||||||
|
},
|
||||||
|
"time": "2017-02-14 19:40:03",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Interop\\Container\\": "src/Interop/Container/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
|
||||||
|
"homepage": "https://github.com/container-interop/container-interop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "nikic/fast-route",
|
||||||
|
"version": "v1.3.0",
|
||||||
|
"version_normalized": "1.3.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/nikic/FastRoute.git",
|
||||||
|
"reference": "181d480e08d9476e61381e04a71b34dc0432e812"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812",
|
||||||
|
"reference": "181d480e08d9476e61381e04a71b34dc0432e812",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35|~5.7"
|
||||||
|
},
|
||||||
|
"time": "2018-02-13 20:26:39",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"FastRoute\\": "src/"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"src/functions.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nikita Popov",
|
||||||
|
"email": "nikic@php.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Fast request router for PHP",
|
||||||
|
"keywords": [
|
||||||
|
"router",
|
||||||
|
"routing"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "psr/http-message",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"version_normalized": "1.0.1.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-fig/http-message.git",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"time": "2016-08-06 14:39:51",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Psr\\Http\\Message\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP-FIG",
|
||||||
|
"homepage": "http://www.php-fig.org/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common interface for HTTP messages",
|
||||||
|
"homepage": "https://github.com/php-fig/http-message",
|
||||||
|
"keywords": [
|
||||||
|
"http",
|
||||||
|
"http-message",
|
||||||
|
"psr",
|
||||||
|
"psr-7",
|
||||||
|
"request",
|
||||||
|
"response"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "pimple/pimple",
|
||||||
|
"version": "v3.2.3",
|
||||||
|
"version_normalized": "3.2.3.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/silexphp/Pimple.git",
|
||||||
|
"reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32",
|
||||||
|
"reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0",
|
||||||
|
"psr/container": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "^3.2"
|
||||||
|
},
|
||||||
|
"time": "2018-01-21 07:42:36",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.2.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Pimple": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Pimple, a simple Dependency Injection Container",
|
||||||
|
"homepage": "http://pimple.sensiolabs.org",
|
||||||
|
"keywords": [
|
||||||
|
"container",
|
||||||
|
"dependency injection"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "slim/slim",
|
||||||
|
"version": "3.11.0",
|
||||||
|
"version_normalized": "3.11.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/slimphp/Slim.git",
|
||||||
|
"reference": "d378e70431e78ee92ee32ddde61ecc72edf5dc0a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/slimphp/Slim/zipball/d378e70431e78ee92ee32ddde61ecc72edf5dc0a",
|
||||||
|
"reference": "d378e70431e78ee92ee32ddde61ecc72edf5dc0a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"container-interop/container-interop": "^1.2",
|
||||||
|
"nikic/fast-route": "^1.0",
|
||||||
|
"php": ">=5.5.0",
|
||||||
|
"pimple/pimple": "^3.0",
|
||||||
|
"psr/container": "^1.0",
|
||||||
|
"psr/http-message": "^1.0"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"psr/http-message-implementation": "1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.0",
|
||||||
|
"squizlabs/php_codesniffer": "^2.5"
|
||||||
|
},
|
||||||
|
"time": "2018-09-16 10:54:21",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Slim\\": "Slim"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Rob Allen",
|
||||||
|
"email": "rob@akrabat.com",
|
||||||
|
"homepage": "http://akrabat.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Josh Lockhart",
|
||||||
|
"email": "hello@joshlockhart.com",
|
||||||
|
"homepage": "https://joshlockhart.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Gabriel Manricks",
|
||||||
|
"email": "gmanricks@me.com",
|
||||||
|
"homepage": "http://gabrielmanricks.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Andrew Smith",
|
||||||
|
"email": "a.smith@silentworks.co.uk",
|
||||||
|
"homepage": "http://silentworks.co.uk"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
|
||||||
|
"homepage": "https://slimframework.com",
|
||||||
|
"keywords": [
|
||||||
|
"api",
|
||||||
|
"framework",
|
||||||
|
"micro",
|
||||||
|
"router"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
3
rest/vendor/container-interop/container-interop/.gitignore
vendored
Normal file
3
rest/vendor/container-interop/container-interop/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
composer.lock
|
||||||
|
composer.phar
|
||||||
|
/vendor/
|
20
rest/vendor/container-interop/container-interop/LICENSE
vendored
Normal file
20
rest/vendor/container-interop/container-interop/LICENSE
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2013 container-interop
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
148
rest/vendor/container-interop/container-interop/README.md
vendored
Normal file
148
rest/vendor/container-interop/container-interop/README.md
vendored
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
# Container Interoperability
|
||||||
|
|
||||||
|
[![Latest Stable Version](https://poser.pugx.org/container-interop/container-interop/v/stable.png)](https://packagist.org/packages/container-interop/container-interop)
|
||||||
|
[![Total Downloads](https://poser.pugx.org/container-interop/container-interop/downloads.svg)](https://packagist.org/packages/container-interop/container-interop)
|
||||||
|
|
||||||
|
## Deprecation warning!
|
||||||
|
|
||||||
|
Starting Feb. 13th 2017, container-interop is officially deprecated in favor of [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md).
|
||||||
|
Container-interop has been the test-bed of PSR-11. From v1.2, container-interop directly extends PSR-11 interfaces.
|
||||||
|
Therefore, all containers implementing container-interop are now *de-facto* compatible with PSR-11.
|
||||||
|
|
||||||
|
- Projects implementing container-interop interfaces are encouraged to directly implement PSR-11 interfaces instead.
|
||||||
|
- Projects consuming container-interop interfaces are very strongly encouraged to directly type-hint on PSR-11 interfaces, in order to be compatible with PSR-11 containers that are not compatible with container-interop.
|
||||||
|
|
||||||
|
Regarding the delegate lookup feature, that is present in container-interop and not in PSR-11, the feature is actually a design pattern. It is therefore not deprecated. Documentation regarding this design pattern will be migrated from this repository into a separate website in the future.
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
*container-interop* tries to identify and standardize features in *container* objects (service locators,
|
||||||
|
dependency injection containers, etc.) to achieve interoperability.
|
||||||
|
|
||||||
|
Through discussions and trials, we try to create a standard, made of common interfaces but also recommendations.
|
||||||
|
|
||||||
|
If PHP projects that provide container implementations begin to adopt these common standards, then PHP
|
||||||
|
applications and projects that use containers can depend on the common interfaces instead of specific
|
||||||
|
implementations. This facilitates a high-level of interoperability and flexibility that allows users to consume
|
||||||
|
*any* container implementation that can be adapted to these interfaces.
|
||||||
|
|
||||||
|
The work done in this project is not officially endorsed by the [PHP-FIG](http://www.php-fig.org/), but it is being
|
||||||
|
worked on by members of PHP-FIG and other good developers. We adhere to the spirit and ideals of PHP-FIG, and hope
|
||||||
|
this project will pave the way for one or more future PSRs.
|
||||||
|
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
You can install this package through Composer:
|
||||||
|
|
||||||
|
```json
|
||||||
|
composer require container-interop/container-interop
|
||||||
|
```
|
||||||
|
|
||||||
|
The packages adheres to the [SemVer](http://semver.org/) specification, and there will be full backward compatibility
|
||||||
|
between minor versions.
|
||||||
|
|
||||||
|
## Standards
|
||||||
|
|
||||||
|
### Available
|
||||||
|
|
||||||
|
- [`ContainerInterface`](src/Interop/Container/ContainerInterface.php).
|
||||||
|
[Description](docs/ContainerInterface.md) [Meta Document](docs/ContainerInterface-meta.md).
|
||||||
|
Describes the interface of a container that exposes methods to read its entries.
|
||||||
|
- [*Delegate lookup feature*](docs/Delegate-lookup.md).
|
||||||
|
[Meta Document](docs/Delegate-lookup-meta.md).
|
||||||
|
Describes the ability for a container to delegate the lookup of its dependencies to a third-party container. This
|
||||||
|
feature lets several containers work together in a single application.
|
||||||
|
|
||||||
|
### Proposed
|
||||||
|
|
||||||
|
View open [request for comments](https://github.com/container-interop/container-interop/labels/RFC)
|
||||||
|
|
||||||
|
## Compatible projects
|
||||||
|
|
||||||
|
### Projects implementing `ContainerInterface`
|
||||||
|
|
||||||
|
- [Acclimate](https://github.com/jeremeamia/acclimate-container): Adapters for
|
||||||
|
Aura.Di, Laravel, Nette DI, Pimple, Symfony DI, ZF2 Service manager, ZF2
|
||||||
|
Dependency injection and any container using `ArrayAccess`
|
||||||
|
- [Aura.Di](https://github.com/auraphp/Aura.Di)
|
||||||
|
- [auryn-container-interop](https://github.com/elazar/auryn-container-interop)
|
||||||
|
- [Burlap](https://github.com/codeeverything/burlap)
|
||||||
|
- [Chernozem](https://github.com/pyrsmk/Chernozem)
|
||||||
|
- [Data Manager](https://github.com/chrismichaels84/data-manager)
|
||||||
|
- [Disco](https://github.com/bitexpert/disco)
|
||||||
|
- [InDI](https://github.com/idealogica/indi)
|
||||||
|
- [League/Container](http://container.thephpleague.com/)
|
||||||
|
- [Mouf](http://mouf-php.com)
|
||||||
|
- [Njasm Container](https://github.com/njasm/container)
|
||||||
|
- [PHP-DI](http://php-di.org)
|
||||||
|
- [Picotainer](https://github.com/thecodingmachine/picotainer)
|
||||||
|
- [PimpleInterop](https://github.com/moufmouf/pimple-interop)
|
||||||
|
- [Pimple3-ContainerInterop](https://github.com/Sam-Burns/pimple3-containerinterop) (using Pimple v3)
|
||||||
|
- [SitePoint Container](https://github.com/sitepoint/Container)
|
||||||
|
- [Thruster Container](https://github.com/ThrusterIO/container) (PHP7 only)
|
||||||
|
- [Ultra-Lite Container](https://github.com/ultra-lite/container)
|
||||||
|
- [Unbox](https://github.com/mindplay-dk/unbox)
|
||||||
|
- [XStatic](https://github.com/jeremeamia/xstatic)
|
||||||
|
- [Zend\ServiceManager](https://github.com/zendframework/zend-servicemanager)
|
||||||
|
- [Zit](https://github.com/inxilpro/Zit)
|
||||||
|
|
||||||
|
### Projects implementing the *delegate lookup* feature
|
||||||
|
|
||||||
|
- [Aura.Di](https://github.com/auraphp/Aura.Di)
|
||||||
|
- [Burlap](https://github.com/codeeverything/burlap)
|
||||||
|
- [Chernozem](https://github.com/pyrsmk/Chernozem)
|
||||||
|
- [InDI](https://github.com/idealogica/indi)
|
||||||
|
- [League/Container](http://container.thephpleague.com/)
|
||||||
|
- [Mouf](http://mouf-php.com)
|
||||||
|
- [Picotainer](https://github.com/thecodingmachine/picotainer)
|
||||||
|
- [PHP-DI](http://php-di.org)
|
||||||
|
- [PimpleInterop](https://github.com/moufmouf/pimple-interop)
|
||||||
|
- [Ultra-Lite Container](https://github.com/ultra-lite/container)
|
||||||
|
|
||||||
|
### Middlewares implementing `ContainerInterface`
|
||||||
|
|
||||||
|
- [Alias-Container](https://github.com/thecodingmachine/alias-container): add
|
||||||
|
aliases support to any container
|
||||||
|
- [Prefixer-Container](https://github.com/thecodingmachine/prefixer-container):
|
||||||
|
dynamically prefix identifiers
|
||||||
|
- [Lazy-Container](https://github.com/snapshotpl/lazy-container): lazy services
|
||||||
|
|
||||||
|
### Projects using `ContainerInterface`
|
||||||
|
|
||||||
|
The list below contains only a sample of all the projects consuming `ContainerInterface`. For a more complete list have a look [here](http://packanalyst.com/class?q=Interop%5CContainer%5CContainerInterface).
|
||||||
|
|
||||||
|
| | Downloads |
|
||||||
|
| --- | --- |
|
||||||
|
| [Adroit](https://github.com/bitexpert/adroit) | ![](https://img.shields.io/packagist/dt/bitexpert/adroit.svg) |
|
||||||
|
| [Behat](https://github.com/Behat/Behat/pull/974) | ![](https://img.shields.io/packagist/dt/behat/behat.svg) |
|
||||||
|
| [blast-facades](https://github.com/phpthinktank/blast-facades): Minimize complexity and represent dependencies as facades. | ![](https://img.shields.io/packagist/dt/blast/facades.svg) |
|
||||||
|
| [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di): an extension to [Silex](http://silex.sensiolabs.org/) that adds support for any *container-interop* compatible container | ![](https://img.shields.io/packagist/dt/mouf/interop.silex.di.svg) |
|
||||||
|
| [mindplay/walkway](https://github.com/mindplay-dk/walkway): a modular request router | ![](https://img.shields.io/packagist/dt/mindplay/walkway.svg) |
|
||||||
|
| [mindplay/middleman](https://github.com/mindplay-dk/middleman): minimalist PSR-7 middleware dispatcher | ![](https://img.shields.io/packagist/dt/mindplay/middleman.svg) |
|
||||||
|
| [PHP-DI/Invoker](https://github.com/PHP-DI/Invoker): extensible and configurable invoker/dispatcher | ![](https://img.shields.io/packagist/dt/php-di/invoker.svg) |
|
||||||
|
| [Prophiler](https://github.com/fabfuel/prophiler) | ![](https://img.shields.io/packagist/dt/fabfuel/prophiler.svg) |
|
||||||
|
| [Silly](https://github.com/mnapoli/silly): CLI micro-framework | ![](https://img.shields.io/packagist/dt/mnapoli/silly.svg) |
|
||||||
|
| [Slim v3](https://github.com/slimphp/Slim) | ![](https://img.shields.io/packagist/dt/slim/slim.svg) |
|
||||||
|
| [Splash](http://mouf-php.com/packages/mouf/mvc.splash-common/version/8.0-dev/README.md) | ![](https://img.shields.io/packagist/dt/mouf/mvc.splash-common.svg) |
|
||||||
|
| [Woohoo Labs. Harmony](https://github.com/woohoolabs/harmony): a flexible micro-framework | ![](https://img.shields.io/packagist/dt/woohoolabs/harmony.svg) |
|
||||||
|
| [zend-expressive](https://github.com/zendframework/zend-expressive) | ![](https://img.shields.io/packagist/dt/zendframework/zend-expressive.svg) |
|
||||||
|
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
Everyone is welcome to join and contribute.
|
||||||
|
|
||||||
|
The general workflow looks like this:
|
||||||
|
|
||||||
|
1. Someone opens a discussion (GitHub issue) to suggest an interface
|
||||||
|
1. Feedback is gathered
|
||||||
|
1. The interface is added to a development branch
|
||||||
|
1. We release alpha versions so that the interface can be experimented with
|
||||||
|
1. Discussions and edits ensue until the interface is deemed stable by a general consensus
|
||||||
|
1. A new minor version of the package is released
|
||||||
|
|
||||||
|
We try to not break BC by creating new interfaces instead of editing existing ones.
|
||||||
|
|
||||||
|
While we currently work on interfaces, we are open to anything that might help towards interoperability, may that
|
||||||
|
be code, best practices, etc.
|
15
rest/vendor/container-interop/container-interop/composer.json
vendored
Normal file
15
rest/vendor/container-interop/container-interop/composer.json
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "container-interop/container-interop",
|
||||||
|
"type": "library",
|
||||||
|
"description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
|
||||||
|
"homepage": "https://github.com/container-interop/container-interop",
|
||||||
|
"license": "MIT",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Interop\\Container\\": "src/Interop/Container/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"psr/container": "^1.0"
|
||||||
|
}
|
||||||
|
}
|
114
rest/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md
vendored
Normal file
114
rest/vendor/container-interop/container-interop/docs/ContainerInterface-meta.md
vendored
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
# ContainerInterface Meta Document
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
This document describes the process and discussions that lead to the `ContainerInterface`.
|
||||||
|
Its goal is to explain the reasons behind each decision.
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a
|
||||||
|
container to obtain objects and parameters.
|
||||||
|
|
||||||
|
By standardizing such a behavior, frameworks and libraries using the `ContainerInterface`
|
||||||
|
could work with any compatible container.
|
||||||
|
That would allow end users to choose their own container based on their own preferences.
|
||||||
|
|
||||||
|
It is important to distinguish the two usages of a container:
|
||||||
|
|
||||||
|
- configuring entries
|
||||||
|
- fetching entries
|
||||||
|
|
||||||
|
Most of the time, those two sides are not used by the same party.
|
||||||
|
While it is often end users who tend to configure entries, it is generally the framework that fetch
|
||||||
|
entries to build the application.
|
||||||
|
|
||||||
|
This is why this interface focuses only on how entries can be fetched from a container.
|
||||||
|
|
||||||
|
## Interface name
|
||||||
|
|
||||||
|
The interface name has been thoroughly discussed and was decided by a vote.
|
||||||
|
|
||||||
|
The list of options considered with their respective votes are:
|
||||||
|
|
||||||
|
- `ContainerInterface`: +8
|
||||||
|
- `ProviderInterface`: +2
|
||||||
|
- `LocatorInterface`: 0
|
||||||
|
- `ReadableContainerInterface`: -5
|
||||||
|
- `ServiceLocatorInterface`: -6
|
||||||
|
- `ObjectFactory`: -6
|
||||||
|
- `ObjectStore`: -8
|
||||||
|
- `ConsumerInterface`: -9
|
||||||
|
|
||||||
|
[Full results of the vote](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote)
|
||||||
|
|
||||||
|
The complete discussion can be read in [the issue #1](https://github.com/container-interop/container-interop/issues/1).
|
||||||
|
|
||||||
|
## Interface methods
|
||||||
|
|
||||||
|
The choice of which methods the interface would contain was made after a statistical analysis of existing containers.
|
||||||
|
The results of this analysis are available [in this document](https://gist.github.com/mnapoli/6159681).
|
||||||
|
|
||||||
|
The summary of the analysis showed that:
|
||||||
|
|
||||||
|
- all containers offer a method to get an entry by its id
|
||||||
|
- a large majority name such method `get()`
|
||||||
|
- for all containers, the `get()` method has 1 mandatory parameter of type string
|
||||||
|
- some containers have an optional additional argument for `get()`, but it doesn't have the same purpose between containers
|
||||||
|
- a large majority of the containers offer a method to test if it can return an entry by its id
|
||||||
|
- a majority name such method `has()`
|
||||||
|
- for all containers offering `has()`, the method has exactly 1 parameter of type string
|
||||||
|
- a large majority of the containers throw an exception rather than returning null when an entry is not found in `get()`
|
||||||
|
- a large majority of the containers don't implement `ArrayAccess`
|
||||||
|
|
||||||
|
The question of whether to include methods to define entries has been discussed in
|
||||||
|
[issue #1](https://github.com/container-interop/container-interop/issues/1).
|
||||||
|
It has been judged that such methods do not belong in the interface described here because it is out of its scope
|
||||||
|
(see the "Goal" section).
|
||||||
|
|
||||||
|
As a result, the `ContainerInterface` contains two methods:
|
||||||
|
|
||||||
|
- `get()`, returning anything, with one mandatory string parameter. Should throw an exception if the entry is not found.
|
||||||
|
- `has()`, returning a boolean, with one mandatory string parameter.
|
||||||
|
|
||||||
|
### Number of parameters in `get()` method
|
||||||
|
|
||||||
|
While `ContainerInterface` only defines one mandatory parameter in `get()`, it is not incompatible with
|
||||||
|
existing containers that have additional optional parameters. PHP allows an implementation to offer more parameters
|
||||||
|
as long as they are optional, because the implementation *does* satisfy the interface.
|
||||||
|
|
||||||
|
This issue has been discussed in [issue #6](https://github.com/container-interop/container-interop/issues/6).
|
||||||
|
|
||||||
|
### Type of the `$id` parameter
|
||||||
|
|
||||||
|
The type of the `$id` parameter in `get()` and `has()` has been discussed in
|
||||||
|
[issue #6](https://github.com/container-interop/container-interop/issues/6).
|
||||||
|
While `string` is used in all the containers that were analyzed, it was suggested that allowing
|
||||||
|
anything (such as objects) could allow containers to offer a more advanced query API.
|
||||||
|
|
||||||
|
An example given was to use the container as an object builder. The `$id` parameter would then be an
|
||||||
|
object that would describe how to create an instance.
|
||||||
|
|
||||||
|
The conclusion of the discussion was that this was beyond the scope of getting entries from a container without
|
||||||
|
knowing how the container provided them, and it was more fit for a factory.
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
Are listed here all people that contributed in the discussions or votes, by alphabetical order:
|
||||||
|
|
||||||
|
- [Amy Stephen](https://github.com/AmyStephen)
|
||||||
|
- [David Négrier](https://github.com/moufmouf)
|
||||||
|
- [Don Gilbert](https://github.com/dongilbert)
|
||||||
|
- [Jason Judge](https://github.com/judgej)
|
||||||
|
- [Jeremy Lindblom](https://github.com/jeremeamia)
|
||||||
|
- [Marco Pivetta](https://github.com/Ocramius)
|
||||||
|
- [Matthieu Napoli](https://github.com/mnapoli)
|
||||||
|
- [Paul M. Jones](https://github.com/pmjones)
|
||||||
|
- [Stephan Hochdörfer](https://github.com/shochdoerfer)
|
||||||
|
- [Taylor Otwell](https://github.com/taylorotwell)
|
||||||
|
|
||||||
|
## Relevant links
|
||||||
|
|
||||||
|
- [`ContainerInterface.php`](https://github.com/container-interop/container-interop/blob/master/src/Interop/Container/ContainerInterface.php)
|
||||||
|
- [List of all issues](https://github.com/container-interop/container-interop/issues?labels=ContainerInterface&milestone=&page=1&state=closed)
|
||||||
|
- [Vote for the interface name](https://github.com/container-interop/container-interop/wiki/%231-interface-name:-Vote)
|
158
rest/vendor/container-interop/container-interop/docs/ContainerInterface.md
vendored
Normal file
158
rest/vendor/container-interop/container-interop/docs/ContainerInterface.md
vendored
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
Container interface
|
||||||
|
===================
|
||||||
|
|
||||||
|
This document describes a common interface for dependency injection containers.
|
||||||
|
|
||||||
|
The goal set by `ContainerInterface` is to standardize how frameworks and libraries make use of a
|
||||||
|
container to obtain objects and parameters (called *entries* in the rest of this document).
|
||||||
|
|
||||||
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
|
||||||
|
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
|
||||||
|
interpreted as described in [RFC 2119][].
|
||||||
|
|
||||||
|
The word `implementor` in this document is to be interpreted as someone
|
||||||
|
implementing the `ContainerInterface` in a dependency injection-related library or framework.
|
||||||
|
Users of dependency injections containers (DIC) are referred to as `user`.
|
||||||
|
|
||||||
|
[RFC 2119]: http://tools.ietf.org/html/rfc2119
|
||||||
|
|
||||||
|
1. Specification
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
### 1.1 Basics
|
||||||
|
|
||||||
|
- The `Interop\Container\ContainerInterface` exposes two methods : `get` and `has`.
|
||||||
|
|
||||||
|
- `get` takes one mandatory parameter: an entry identifier. It MUST be a string.
|
||||||
|
A call to `get` can return anything (a *mixed* value), or throws an exception if the identifier
|
||||||
|
is not known to the container. Two successive calls to `get` with the same
|
||||||
|
identifier SHOULD return the same value. However, depending on the `implementor`
|
||||||
|
design and/or `user` configuration, different values might be returned, so
|
||||||
|
`user` SHOULD NOT rely on getting the same value on 2 successive calls.
|
||||||
|
While `ContainerInterface` only defines one mandatory parameter in `get()`, implementations
|
||||||
|
MAY accept additional optional parameters.
|
||||||
|
|
||||||
|
- `has` takes one unique parameter: an entry identifier. It MUST return `true`
|
||||||
|
if an entry identifier is known to the container and `false` if it is not.
|
||||||
|
`has($id)` returning true does not mean that `get($id)` will not throw an exception.
|
||||||
|
It does however mean that `get($id)` will not throw a `NotFoundException`.
|
||||||
|
|
||||||
|
### 1.2 Exceptions
|
||||||
|
|
||||||
|
Exceptions directly thrown by the container MUST implement the
|
||||||
|
[`Interop\Container\Exception\ContainerException`](../src/Interop/Container/Exception/ContainerException.php).
|
||||||
|
|
||||||
|
A call to the `get` method with a non-existing id SHOULD throw a
|
||||||
|
[`Interop\Container\Exception\NotFoundException`](../src/Interop/Container/Exception/NotFoundException.php).
|
||||||
|
|
||||||
|
### 1.3 Additional features
|
||||||
|
|
||||||
|
This section describes additional features that MAY be added to a container. Containers are not
|
||||||
|
required to implement these features to respect the ContainerInterface.
|
||||||
|
|
||||||
|
#### 1.3.1 Delegate lookup feature
|
||||||
|
|
||||||
|
The goal of the *delegate lookup* feature is to allow several containers to share entries.
|
||||||
|
Containers implementing this feature can perform dependency lookups in other containers.
|
||||||
|
|
||||||
|
Containers implementing this feature will offer a greater lever of interoperability
|
||||||
|
with other containers. Implementation of this feature is therefore RECOMMENDED.
|
||||||
|
|
||||||
|
A container implementing this feature:
|
||||||
|
|
||||||
|
- MUST implement the `ContainerInterface`
|
||||||
|
- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
|
||||||
|
or any possible way). The delegate container MUST implement the `ContainerInterface`.
|
||||||
|
|
||||||
|
When a container is configured to use a delegate container for dependencies:
|
||||||
|
|
||||||
|
- Calls to the `get` method should only return an entry if the entry is part of the container.
|
||||||
|
If the entry is not part of the container, an exception should be thrown
|
||||||
|
(as requested by the `ContainerInterface`).
|
||||||
|
- Calls to the `has` method should only return `true` if the entry is part of the container.
|
||||||
|
If the entry is not part of the container, `false` should be returned.
|
||||||
|
- If the fetched entry has dependencies, **instead** of performing
|
||||||
|
the dependency lookup in the container, the lookup is performed on the *delegate container*.
|
||||||
|
|
||||||
|
Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself.
|
||||||
|
|
||||||
|
It is however allowed for containers to provide exception cases for special entries, and a way to lookup
|
||||||
|
into the same container (or another container) instead of the delegate container.
|
||||||
|
|
||||||
|
2. Package
|
||||||
|
----------
|
||||||
|
|
||||||
|
The interfaces and classes described as well as relevant exception are provided as part of the
|
||||||
|
[container-interop/container-interop](https://packagist.org/packages/container-interop/container-interop) package.
|
||||||
|
|
||||||
|
3. `Interop\Container\ContainerInterface`
|
||||||
|
-----------------------------------------
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
namespace Interop\Container;
|
||||||
|
|
||||||
|
use Interop\Container\Exception\ContainerException;
|
||||||
|
use Interop\Container\Exception\NotFoundException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the interface of a container that exposes methods to read its entries.
|
||||||
|
*/
|
||||||
|
interface ContainerInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Finds an entry of the container by its identifier and returns it.
|
||||||
|
*
|
||||||
|
* @param string $id Identifier of the entry to look for.
|
||||||
|
*
|
||||||
|
* @throws NotFoundException No entry was found for this identifier.
|
||||||
|
* @throws ContainerException Error while retrieving the entry.
|
||||||
|
*
|
||||||
|
* @return mixed Entry.
|
||||||
|
*/
|
||||||
|
public function get($id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the container can return an entry for the given identifier.
|
||||||
|
* Returns false otherwise.
|
||||||
|
*
|
||||||
|
* `has($id)` returning true does not mean that `get($id)` will not throw an exception.
|
||||||
|
* It does however mean that `get($id)` will not throw a `NotFoundException`.
|
||||||
|
*
|
||||||
|
* @param string $id Identifier of the entry to look for.
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public function has($id);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
4. `Interop\Container\Exception\ContainerException`
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
namespace Interop\Container\Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base interface representing a generic exception in a container.
|
||||||
|
*/
|
||||||
|
interface ContainerException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
5. `Interop\Container\Exception\NotFoundException`
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
namespace Interop\Container\Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No entry was found in the container.
|
||||||
|
*/
|
||||||
|
interface NotFoundException extends ContainerException
|
||||||
|
{
|
||||||
|
}
|
||||||
|
```
|
259
rest/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md
vendored
Normal file
259
rest/vendor/container-interop/container-interop/docs/Delegate-lookup-meta.md
vendored
Normal file
@ -0,0 +1,259 @@
|
|||||||
|
Delegate lookup feature Meta Document
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
1. Summary
|
||||||
|
----------
|
||||||
|
|
||||||
|
This document describes the *delegate lookup feature*.
|
||||||
|
Containers are not required to implement this feature to respect the `ContainerInterface`.
|
||||||
|
However, containers implementing this feature will offer a greater lever of interoperability
|
||||||
|
with other containers, allowing multiple containers to share entries in the same application.
|
||||||
|
Implementation of this feature is therefore recommanded.
|
||||||
|
|
||||||
|
2. Why Bother?
|
||||||
|
--------------
|
||||||
|
|
||||||
|
The [`ContainerInterface`](../src/Interop/Container/ContainerInterface.php) ([meta doc](ContainerInterface.md))
|
||||||
|
standardizes how frameworks and libraries make use of a container to obtain objects and parameters.
|
||||||
|
|
||||||
|
By standardizing such a behavior, frameworks and libraries relying on the `ContainerInterface`
|
||||||
|
could work with any compatible container.
|
||||||
|
That would allow end users to choose their own container based on their own preferences.
|
||||||
|
|
||||||
|
The `ContainerInterface` is also enough if we want to have several containers side-by-side in the same
|
||||||
|
application. For instance, this is what the [CompositeContainer](https://github.com/jeremeamia/acclimate-container/blob/master/src/CompositeContainer.php)
|
||||||
|
class of [Acclimate](https://github.com/jeremeamia/acclimate-container) is designed for:
|
||||||
|
|
||||||
|
![Side by side containers](images/side_by_side_containers.png)
|
||||||
|
|
||||||
|
However, an instance in container 1 cannot reference an instance in container 2.
|
||||||
|
|
||||||
|
It would be better if an instance of container 1 could reference an instance in container 2,
|
||||||
|
and the opposite should be true.
|
||||||
|
|
||||||
|
![Interoperating containers](images/interoperating_containers.png)
|
||||||
|
|
||||||
|
In the sample above, entry 1 in container 1 is referencing entry 3 in container 2.
|
||||||
|
|
||||||
|
3. Scope
|
||||||
|
--------
|
||||||
|
|
||||||
|
### 3.1 Goals
|
||||||
|
|
||||||
|
The goal of the *delegate lookup* feature is to allow several containers to share entries.
|
||||||
|
|
||||||
|
4. Approaches
|
||||||
|
-------------
|
||||||
|
|
||||||
|
### 4.1 Chosen Approach
|
||||||
|
|
||||||
|
Containers implementing this feature can perform dependency lookups in other containers.
|
||||||
|
|
||||||
|
A container implementing this feature:
|
||||||
|
|
||||||
|
- must implement the `ContainerInterface`
|
||||||
|
- must provide a way to register a *delegate container* (using a constructor parameter, or a setter, or any
|
||||||
|
possible way). The *delegate container* must implement the `ContainerInterface`.
|
||||||
|
|
||||||
|
When a *delegate container* is configured on a container:
|
||||||
|
|
||||||
|
- Calls to the `get` method should only return an entry if the entry is part of the container.
|
||||||
|
If the entry is not part of the container, an exception should be thrown (as required in the `ContainerInterface`).
|
||||||
|
- Calls to the `has` method should only return *true* if the entry is part of the container.
|
||||||
|
If the entry is not part of the container, *false* should be returned.
|
||||||
|
- Finally, the important part: if the entry we are fetching has dependencies,
|
||||||
|
**instead** of perfoming the dependency lookup in the container, the lookup is performed on the *delegate container*.
|
||||||
|
|
||||||
|
Important! By default, the lookup should be performed on the delegate container **only**, not on the container itself.
|
||||||
|
|
||||||
|
It is however allowed for containers to provide exception cases for special entries, and a way to lookup into
|
||||||
|
the same container (or another container) instead of the delegate container.
|
||||||
|
|
||||||
|
### 4.2 Typical usage
|
||||||
|
|
||||||
|
The *delegate container* will usually be a composite container. A composite container is a container that
|
||||||
|
contains several other containers. When performing a lookup on a composite container, the inner containers are
|
||||||
|
queried until one container returns an entry.
|
||||||
|
An inner container implementing the *delegate lookup feature* will return entries it contains, but if these
|
||||||
|
entries have dependencies, the dependencies lookup calls will be performed on the composite container, giving
|
||||||
|
a chance to all containers to answer.
|
||||||
|
|
||||||
|
Interestingly enough, the order in which containers are added in the composite container matters. Indeed,
|
||||||
|
the first containers to be added in the composite container can "override" the entries of containers with
|
||||||
|
lower priority.
|
||||||
|
|
||||||
|
![Containers priority](images/priority.png)
|
||||||
|
|
||||||
|
In the example above, "container 2" contains a controller "myController" and the controller is referencing an
|
||||||
|
"entityManager" entry. "Container 1" contains also an entry named "entityManager".
|
||||||
|
Without the *delegate lookup* feature, when requesting the "myController" instance to container 2, it would take
|
||||||
|
in charge the instanciation of both entries.
|
||||||
|
|
||||||
|
However, using the *delegate lookup* feature, here is what happens when we ask the composite container for the
|
||||||
|
"myController" instance:
|
||||||
|
|
||||||
|
- The composite container asks container 1 if if contains the "myController" instance. The answer is no.
|
||||||
|
- The composite container asks container 2 if if contains the "myController" instance. The answer is yes.
|
||||||
|
- The composite container performs a `get` call on container 2 for the "myController" instance.
|
||||||
|
- Container 2 sees that "myController" has a dependency on "entityManager".
|
||||||
|
- Container 2 delegates the lookup of "entityManager" to the composite container.
|
||||||
|
- The composite container asks container 1 if if contains the "entityManager" instance. The answer is yes.
|
||||||
|
- The composite container performs a `get` call on container 1 for the "entityManager" instance.
|
||||||
|
|
||||||
|
In the end, we get a controller instanciated by container 2 that references an entityManager instanciated
|
||||||
|
by container 1.
|
||||||
|
|
||||||
|
### 4.3 Alternative: the fallback strategy
|
||||||
|
|
||||||
|
The first proposed approach we tried was to perform all the lookups in the "local" container,
|
||||||
|
and if a lookup fails in the container, to use the delegate container. In this scenario, the
|
||||||
|
delegate container is used in "fallback" mode.
|
||||||
|
|
||||||
|
This strategy has been described in @moufmouf blog post: http://mouf-php.com/container-interop-whats-next (solution 1).
|
||||||
|
It was also discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-33570697) and
|
||||||
|
[here](https://github.com/container-interop/container-interop/pull/20#issuecomment-56599631).
|
||||||
|
|
||||||
|
Problems with this strategy:
|
||||||
|
|
||||||
|
- Heavy problem regarding infinite loops
|
||||||
|
- Unable to overload a container entry with the delegate container entry
|
||||||
|
|
||||||
|
### 4.4 Alternative: force implementing an interface
|
||||||
|
|
||||||
|
The first proposed approach was to develop a `ParentAwareContainerInterface` interface.
|
||||||
|
It was proposed here: https://github.com/container-interop/container-interop/pull/8
|
||||||
|
|
||||||
|
The interface would have had the behaviour of the delegate lookup feature but would have forced the addition of
|
||||||
|
a `setParentContainter` method:
|
||||||
|
|
||||||
|
```php
|
||||||
|
interface ParentAwareContainerInterface extends ReadableContainerInterface {
|
||||||
|
/**
|
||||||
|
* Sets the parent container associated to that container. This container will call
|
||||||
|
* the parent container to fetch dependencies.
|
||||||
|
*
|
||||||
|
* @param ContainerInterface $container
|
||||||
|
*/
|
||||||
|
public function setParentContainer(ContainerInterface $container);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The interface idea was first questioned by @Ocramius [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777).
|
||||||
|
@Ocramius expressed the idea that an interface should not contain setters, otherwise, it is forcing implementation
|
||||||
|
details on the class implementing the interface.
|
||||||
|
Then @mnapoli made a proposal for a "convention" [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51841079),
|
||||||
|
this idea was further discussed until all participants in the discussion agreed to remove the interface idea
|
||||||
|
and replace it with a "standard" feature.
|
||||||
|
|
||||||
|
**Pros:**
|
||||||
|
|
||||||
|
If we had had an interface, we could have delegated the registration of the delegate/composite container to the
|
||||||
|
the delegate/composite container itself.
|
||||||
|
For instance:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$containerA = new ContainerA();
|
||||||
|
$containerB = new ContainerB();
|
||||||
|
|
||||||
|
$compositeContainer = new CompositeContainer([$containerA, $containerB]);
|
||||||
|
|
||||||
|
// The call to 'setParentContainer' is delegated to the CompositeContainer
|
||||||
|
// It is not the responsibility of the user anymore.
|
||||||
|
class CompositeContainer {
|
||||||
|
...
|
||||||
|
|
||||||
|
public function __construct($containers) {
|
||||||
|
foreach ($containers as $container) {
|
||||||
|
if ($container instanceof ParentAwareContainerInterface) {
|
||||||
|
$container->setParentContainer($this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
**Cons:**
|
||||||
|
|
||||||
|
Cons have been extensively discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-51721777).
|
||||||
|
Basically, forcing a setter into an interface is a bad idea. Setters are similar to constructor arguments,
|
||||||
|
and it's a bad idea to standardize a constructor: how the delegate container is configured into a container is an implementation detail. This outweights the benefits of the interface.
|
||||||
|
|
||||||
|
### 4.4 Alternative: no exception case for delegate lookups
|
||||||
|
|
||||||
|
Originally, the proposed wording for delegate lookup calls was:
|
||||||
|
|
||||||
|
> Important! The lookup MUST be performed on the delegate container **only**, not on the container itself.
|
||||||
|
|
||||||
|
This was later replaced by:
|
||||||
|
|
||||||
|
> Important! By default, the lookup SHOULD be performed on the delegate container **only**, not on the container itself.
|
||||||
|
>
|
||||||
|
> It is however allowed for containers to provide exception cases for special entries, and a way to lookup
|
||||||
|
> into the same container (or another container) instead of the delegate container.
|
||||||
|
|
||||||
|
Exception cases have been allowed to avoid breaking dependencies with some services that must be provided
|
||||||
|
by the container (on @njasm proposal). This was proposed here: https://github.com/container-interop/container-interop/pull/20#issuecomment-56597235
|
||||||
|
|
||||||
|
### 4.5 Alternative: having one of the containers act as the composite container
|
||||||
|
|
||||||
|
In real-life scenarios, we usually have a big framework (Symfony 2, Zend Framework 2, etc...) and we want to
|
||||||
|
add another DI container to this container. Most of the time, the "big" framework will be responsible for
|
||||||
|
creating the controller's instances, using it's own DI container. Until *container-interop* is fully adopted,
|
||||||
|
the "big" framework will not be aware of the existence of a composite container that it should use instead
|
||||||
|
of its own container.
|
||||||
|
|
||||||
|
For this real-life use cases, @mnapoli and @moufmouf proposed to extend the "big" framework's DI container
|
||||||
|
to make it act as a composite container.
|
||||||
|
|
||||||
|
This has been discussed [here](https://github.com/container-interop/container-interop/pull/8#issuecomment-40367194)
|
||||||
|
and [here](http://mouf-php.com/container-interop-whats-next#solution4).
|
||||||
|
|
||||||
|
This was implemented in Symfony 2 using:
|
||||||
|
|
||||||
|
- [interop.symfony.di](https://github.com/thecodingmachine/interop.symfony.di/tree/v0.1.0)
|
||||||
|
- [framework interop](https://github.com/mnapoli/framework-interop/)
|
||||||
|
|
||||||
|
This was implemented in Silex using:
|
||||||
|
|
||||||
|
- [interop.silex.di](https://github.com/thecodingmachine/interop.silex.di)
|
||||||
|
|
||||||
|
Having a container act as the composite container is not part of the delegate lookup standard because it is
|
||||||
|
simply a temporary design pattern used to make existing frameworks that do not support yet ContainerInterop
|
||||||
|
play nice with other DI containers.
|
||||||
|
|
||||||
|
|
||||||
|
5. Implementations
|
||||||
|
------------------
|
||||||
|
|
||||||
|
The following projects already implement the delegate lookup feature:
|
||||||
|
|
||||||
|
- [Mouf](http://mouf-php.com), through the [`setDelegateLookupContainer` method](https://github.com/thecodingmachine/mouf/blob/2.0/src/Mouf/MoufManager.php#L2120)
|
||||||
|
- [PHP-DI](http://php-di.org/), through the [`$wrapperContainer` parameter of the constructor](https://github.com/mnapoli/PHP-DI/blob/master/src/DI/Container.php#L72)
|
||||||
|
- [pimple-interop](https://github.com/moufmouf/pimple-interop), through the [`$container` parameter of the constructor](https://github.com/moufmouf/pimple-interop/blob/master/src/Interop/Container/Pimple/PimpleInterop.php#L62)
|
||||||
|
|
||||||
|
6. People
|
||||||
|
---------
|
||||||
|
|
||||||
|
Are listed here all people that contributed in the discussions, by alphabetical order:
|
||||||
|
|
||||||
|
- [Alexandru Pătrănescu](https://github.com/drealecs)
|
||||||
|
- [Ben Peachey](https://github.com/potherca)
|
||||||
|
- [David Négrier](https://github.com/moufmouf)
|
||||||
|
- [Jeremy Lindblom](https://github.com/jeremeamia)
|
||||||
|
- [Marco Pivetta](https://github.com/Ocramius)
|
||||||
|
- [Matthieu Napoli](https://github.com/mnapoli)
|
||||||
|
- [Nelson J Morais](https://github.com/njasm)
|
||||||
|
- [Phil Sturgeon](https://github.com/philsturgeon)
|
||||||
|
- [Stephan Hochdörfer](https://github.com/shochdoerfer)
|
||||||
|
|
||||||
|
7. Relevant Links
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
_**Note:** Order descending chronologically._
|
||||||
|
|
||||||
|
- [Pull request on the delegate lookup feature](https://github.com/container-interop/container-interop/pull/20)
|
||||||
|
- [Pull request on the interface idea](https://github.com/container-interop/container-interop/pull/8)
|
||||||
|
- [Original article exposing the delegate lookup idea along many others](http://mouf-php.com/container-interop-whats-next)
|
||||||
|
|
60
rest/vendor/container-interop/container-interop/docs/Delegate-lookup.md
vendored
Normal file
60
rest/vendor/container-interop/container-interop/docs/Delegate-lookup.md
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
Delegate lookup feature
|
||||||
|
=======================
|
||||||
|
|
||||||
|
This document describes a standard for dependency injection containers.
|
||||||
|
|
||||||
|
The goal set by the *delegate lookup* feature is to allow several containers to share entries.
|
||||||
|
Containers implementing this feature can perform dependency lookups in other containers.
|
||||||
|
|
||||||
|
Containers implementing this feature will offer a greater lever of interoperability
|
||||||
|
with other containers. Implementation of this feature is therefore RECOMMENDED.
|
||||||
|
|
||||||
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
|
||||||
|
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
|
||||||
|
interpreted as described in [RFC 2119][].
|
||||||
|
|
||||||
|
The word `implementor` in this document is to be interpreted as someone
|
||||||
|
implementing the delegate lookup feature in a dependency injection-related library or framework.
|
||||||
|
Users of dependency injections containers (DIC) are referred to as `user`.
|
||||||
|
|
||||||
|
[RFC 2119]: http://tools.ietf.org/html/rfc2119
|
||||||
|
|
||||||
|
1. Vocabulary
|
||||||
|
-------------
|
||||||
|
|
||||||
|
In a dependency injection container, the container is used to fetch entries.
|
||||||
|
Entries can have dependencies on other entries. Usually, these other entries are fetched by the container.
|
||||||
|
|
||||||
|
The *delegate lookup* feature is the ability for a container to fetch dependencies in
|
||||||
|
another container. In the rest of the document, the word "container" will reference the container
|
||||||
|
implemented by the implementor. The word "delegate container" will reference the container we are
|
||||||
|
fetching the dependencies from.
|
||||||
|
|
||||||
|
2. Specification
|
||||||
|
----------------
|
||||||
|
|
||||||
|
A container implementing the *delegate lookup* feature:
|
||||||
|
|
||||||
|
- MUST implement the [`ContainerInterface`](ContainerInterface.md)
|
||||||
|
- MUST provide a way to register a delegate container (using a constructor parameter, or a setter,
|
||||||
|
or any possible way). The delegate container MUST implement the [`ContainerInterface`](ContainerInterface.md).
|
||||||
|
|
||||||
|
When a container is configured to use a delegate container for dependencies:
|
||||||
|
|
||||||
|
- Calls to the `get` method should only return an entry if the entry is part of the container.
|
||||||
|
If the entry is not part of the container, an exception should be thrown
|
||||||
|
(as requested by the [`ContainerInterface`](ContainerInterface.md)).
|
||||||
|
- Calls to the `has` method should only return `true` if the entry is part of the container.
|
||||||
|
If the entry is not part of the container, `false` should be returned.
|
||||||
|
- If the fetched entry has dependencies, **instead** of performing
|
||||||
|
the dependency lookup in the container, the lookup is performed on the *delegate container*.
|
||||||
|
|
||||||
|
Important: By default, the dependency lookups SHOULD be performed on the delegate container **only**, not on the container itself.
|
||||||
|
|
||||||
|
It is however allowed for containers to provide exception cases for special entries, and a way to lookup
|
||||||
|
into the same container (or another container) instead of the delegate container.
|
||||||
|
|
||||||
|
3. Package / Interface
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
This feature is not tied to any code, interface or package.
|
BIN
rest/vendor/container-interop/container-interop/docs/images/interoperating_containers.png
vendored
Normal file
BIN
rest/vendor/container-interop/container-interop/docs/images/interoperating_containers.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
rest/vendor/container-interop/container-interop/docs/images/priority.png
vendored
Normal file
BIN
rest/vendor/container-interop/container-interop/docs/images/priority.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
BIN
rest/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png
vendored
Normal file
BIN
rest/vendor/container-interop/container-interop/docs/images/side_by_side_containers.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
15
rest/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
vendored
Normal file
15
rest/vendor/container-interop/container-interop/src/Interop/Container/ContainerInterface.php
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Interop\Container;
|
||||||
|
|
||||||
|
use Psr\Container\ContainerInterface as PsrContainerInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the interface of a container that exposes methods to read its entries.
|
||||||
|
*/
|
||||||
|
interface ContainerInterface extends PsrContainerInterface
|
||||||
|
{
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Interop\Container\Exception;
|
||||||
|
|
||||||
|
use Psr\Container\ContainerExceptionInterface as PsrContainerException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base interface representing a generic exception in a container.
|
||||||
|
*/
|
||||||
|
interface ContainerException extends PsrContainerException
|
||||||
|
{
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Interop\Container\Exception;
|
||||||
|
|
||||||
|
use Psr\Container\NotFoundExceptionInterface as PsrNotFoundException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No entry was found in the container.
|
||||||
|
*/
|
||||||
|
interface NotFoundException extends ContainerException, PsrNotFoundException
|
||||||
|
{
|
||||||
|
}
|
5
rest/vendor/nikic/fast-route/.gitignore
vendored
Normal file
5
rest/vendor/nikic/fast-route/.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
/vendor/
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# ignore lock file since we have no extra dependencies
|
||||||
|
composer.lock
|
1
rest/vendor/nikic/fast-route/.hhconfig
vendored
Normal file
1
rest/vendor/nikic/fast-route/.hhconfig
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
assume_php=false
|
20
rest/vendor/nikic/fast-route/.travis.yml
vendored
Normal file
20
rest/vendor/nikic/fast-route/.travis.yml
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
sudo: false
|
||||||
|
language: php
|
||||||
|
|
||||||
|
php:
|
||||||
|
- 5.4
|
||||||
|
- 5.5
|
||||||
|
- 5.6
|
||||||
|
- 7.0
|
||||||
|
- 7.1
|
||||||
|
- 7.2
|
||||||
|
- hhvm
|
||||||
|
|
||||||
|
script:
|
||||||
|
- ./vendor/bin/phpunit
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- travis_retry composer self-update
|
||||||
|
|
||||||
|
install:
|
||||||
|
- composer install
|
126
rest/vendor/nikic/fast-route/FastRoute.hhi
vendored
Normal file
126
rest/vendor/nikic/fast-route/FastRoute.hhi
vendored
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
<?hh // decl
|
||||||
|
|
||||||
|
namespace FastRoute {
|
||||||
|
class BadRouteException extends \LogicException {
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RouteParser {
|
||||||
|
public function parse(string $route): array<array>;
|
||||||
|
}
|
||||||
|
|
||||||
|
class RouteCollector {
|
||||||
|
public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator);
|
||||||
|
public function addRoute(mixed $httpMethod, string $route, mixed $handler): void;
|
||||||
|
public function getData(): array;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Route {
|
||||||
|
public function __construct(string $httpMethod, mixed $handler, string $regex, array $variables);
|
||||||
|
public function matches(string $str): bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DataGenerator {
|
||||||
|
public function addRoute(string $httpMethod, array $routeData, mixed $handler);
|
||||||
|
public function getData(): array;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Dispatcher {
|
||||||
|
const int NOT_FOUND = 0;
|
||||||
|
const int FOUND = 1;
|
||||||
|
const int METHOD_NOT_ALLOWED = 2;
|
||||||
|
public function dispatch(string $httpMethod, string $uri): array;
|
||||||
|
}
|
||||||
|
|
||||||
|
function simpleDispatcher(
|
||||||
|
(function(RouteCollector): void) $routeDefinitionCallback,
|
||||||
|
shape(
|
||||||
|
?'routeParser' => classname<RouteParser>,
|
||||||
|
?'dataGenerator' => classname<DataGenerator>,
|
||||||
|
?'dispatcher' => classname<Dispatcher>,
|
||||||
|
?'routeCollector' => classname<RouteCollector>,
|
||||||
|
) $options = shape()): Dispatcher;
|
||||||
|
|
||||||
|
function cachedDispatcher(
|
||||||
|
(function(RouteCollector): void) $routeDefinitionCallback,
|
||||||
|
shape(
|
||||||
|
?'routeParser' => classname<RouteParser>,
|
||||||
|
?'dataGenerator' => classname<DataGenerator>,
|
||||||
|
?'dispatcher' => classname<Dispatcher>,
|
||||||
|
?'routeCollector' => classname<RouteCollector>,
|
||||||
|
?'cacheDisabled' => bool,
|
||||||
|
?'cacheFile' => string,
|
||||||
|
) $options = shape()): Dispatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace FastRoute\DataGenerator {
|
||||||
|
abstract class RegexBasedAbstract implements \FastRoute\DataGenerator {
|
||||||
|
protected abstract function getApproxChunkSize();
|
||||||
|
protected abstract function processChunk($regexToRoutesMap);
|
||||||
|
|
||||||
|
public function addRoute(string $httpMethod, array $routeData, mixed $handler): void;
|
||||||
|
public function getData(): array;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CharCountBased extends RegexBasedAbstract {
|
||||||
|
protected function getApproxChunkSize(): int;
|
||||||
|
protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>;
|
||||||
|
}
|
||||||
|
|
||||||
|
class GroupCountBased extends RegexBasedAbstract {
|
||||||
|
protected function getApproxChunkSize(): int;
|
||||||
|
protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>;
|
||||||
|
}
|
||||||
|
|
||||||
|
class GroupPosBased extends RegexBasedAbstract {
|
||||||
|
protected function getApproxChunkSize(): int;
|
||||||
|
protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MarkBased extends RegexBasedAbstract {
|
||||||
|
protected function getApproxChunkSize(): int;
|
||||||
|
protected function processChunk(array<string, string> $regexToRoutesMap): array<string, mixed>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher {
|
||||||
|
abstract class RegexBasedAbstract implements \FastRoute\Dispatcher {
|
||||||
|
protected abstract function dispatchVariableRoute(array<array> $routeData, string $uri): array;
|
||||||
|
|
||||||
|
public function dispatch(string $httpMethod, string $uri): array;
|
||||||
|
}
|
||||||
|
|
||||||
|
class GroupPosBased extends RegexBasedAbstract {
|
||||||
|
public function __construct(array $data);
|
||||||
|
protected function dispatchVariableRoute(array<array> $routeData, string $uri): array;
|
||||||
|
}
|
||||||
|
|
||||||
|
class GroupCountBased extends RegexBasedAbstract {
|
||||||
|
public function __construct(array $data);
|
||||||
|
protected function dispatchVariableRoute(array<array> $routeData, string $uri): array;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CharCountBased extends RegexBasedAbstract {
|
||||||
|
public function __construct(array $data);
|
||||||
|
protected function dispatchVariableRoute(array<array> $routeData, string $uri): array;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MarkBased extends RegexBasedAbstract {
|
||||||
|
public function __construct(array $data);
|
||||||
|
protected function dispatchVariableRoute(array<array> $routeData, string $uri): array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace FastRoute\RouteParser {
|
||||||
|
class Std implements \FastRoute\RouteParser {
|
||||||
|
const string VARIABLE_REGEX = <<<'REGEX'
|
||||||
|
\{
|
||||||
|
\s* ([a-zA-Z][a-zA-Z0-9_]*) \s*
|
||||||
|
(?:
|
||||||
|
: \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*)
|
||||||
|
)?
|
||||||
|
\}
|
||||||
|
REGEX;
|
||||||
|
const string DEFAULT_DISPATCH_REGEX = '[^/]+';
|
||||||
|
public function parse(string $route): array<array>;
|
||||||
|
}
|
||||||
|
}
|
31
rest/vendor/nikic/fast-route/LICENSE
vendored
Normal file
31
rest/vendor/nikic/fast-route/LICENSE
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
Copyright (c) 2013 by Nikita Popov.
|
||||||
|
|
||||||
|
Some rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer in the documentation and/or other materials provided
|
||||||
|
with the distribution.
|
||||||
|
|
||||||
|
* The names of the contributors may not be used to endorse or
|
||||||
|
promote products derived from this software without specific
|
||||||
|
prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
313
rest/vendor/nikic/fast-route/README.md
vendored
Normal file
313
rest/vendor/nikic/fast-route/README.md
vendored
Normal file
@ -0,0 +1,313 @@
|
|||||||
|
FastRoute - Fast request router for PHP
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
This library provides a fast implementation of a regular expression based router. [Blog post explaining how the
|
||||||
|
implementation works and why it is fast.][blog_post]
|
||||||
|
|
||||||
|
Install
|
||||||
|
-------
|
||||||
|
|
||||||
|
To install with composer:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
composer require nikic/fast-route
|
||||||
|
```
|
||||||
|
|
||||||
|
Requires PHP 5.4 or newer.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
Here's a basic usage example:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require '/path/to/vendor/autoload.php';
|
||||||
|
|
||||||
|
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/users', 'get_all_users_handler');
|
||||||
|
// {id} must be a number (\d+)
|
||||||
|
$r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler');
|
||||||
|
// The /{title} suffix is optional
|
||||||
|
$r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Fetch method and URI from somewhere
|
||||||
|
$httpMethod = $_SERVER['REQUEST_METHOD'];
|
||||||
|
$uri = $_SERVER['REQUEST_URI'];
|
||||||
|
|
||||||
|
// Strip query string (?foo=bar) and decode URI
|
||||||
|
if (false !== $pos = strpos($uri, '?')) {
|
||||||
|
$uri = substr($uri, 0, $pos);
|
||||||
|
}
|
||||||
|
$uri = rawurldecode($uri);
|
||||||
|
|
||||||
|
$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
|
||||||
|
switch ($routeInfo[0]) {
|
||||||
|
case FastRoute\Dispatcher::NOT_FOUND:
|
||||||
|
// ... 404 Not Found
|
||||||
|
break;
|
||||||
|
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
|
||||||
|
$allowedMethods = $routeInfo[1];
|
||||||
|
// ... 405 Method Not Allowed
|
||||||
|
break;
|
||||||
|
case FastRoute\Dispatcher::FOUND:
|
||||||
|
$handler = $routeInfo[1];
|
||||||
|
$vars = $routeInfo[2];
|
||||||
|
// ... call $handler with $vars
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Defining routes
|
||||||
|
|
||||||
|
The routes are defined by calling the `FastRoute\simpleDispatcher()` function, which accepts
|
||||||
|
a callable taking a `FastRoute\RouteCollector` instance. The routes are added by calling
|
||||||
|
`addRoute()` on the collector instance:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$r->addRoute($method, $routePattern, $handler);
|
||||||
|
```
|
||||||
|
|
||||||
|
The `$method` is an uppercase HTTP method string for which a certain route should match. It
|
||||||
|
is possible to specify multiple valid methods using an array:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// These two calls
|
||||||
|
$r->addRoute('GET', '/test', 'handler');
|
||||||
|
$r->addRoute('POST', '/test', 'handler');
|
||||||
|
// Are equivalent to this one call
|
||||||
|
$r->addRoute(['GET', 'POST'], '/test', 'handler');
|
||||||
|
```
|
||||||
|
|
||||||
|
By default the `$routePattern` uses a syntax where `{foo}` specifies a placeholder with name `foo`
|
||||||
|
and matching the regex `[^/]+`. To adjust the pattern the placeholder matches, you can specify
|
||||||
|
a custom pattern by writing `{bar:[0-9]+}`. Some examples:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// Matches /user/42, but not /user/xyz
|
||||||
|
$r->addRoute('GET', '/user/{id:\d+}', 'handler');
|
||||||
|
|
||||||
|
// Matches /user/foobar, but not /user/foo/bar
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler');
|
||||||
|
|
||||||
|
// Matches /user/foo/bar as well
|
||||||
|
$r->addRoute('GET', '/user/{name:.+}', 'handler');
|
||||||
|
```
|
||||||
|
|
||||||
|
Custom patterns for route placeholders cannot use capturing groups. For example `{lang:(en|de)}`
|
||||||
|
is not a valid placeholder, because `()` is a capturing group. Instead you can use either
|
||||||
|
`{lang:en|de}` or `{lang:(?:en|de)}`.
|
||||||
|
|
||||||
|
Furthermore parts of the route enclosed in `[...]` are considered optional, so that `/foo[bar]`
|
||||||
|
will match both `/foo` and `/foobar`. Optional parts are only supported in a trailing position,
|
||||||
|
not in the middle of a route.
|
||||||
|
|
||||||
|
```php
|
||||||
|
// This route
|
||||||
|
$r->addRoute('GET', '/user/{id:\d+}[/{name}]', 'handler');
|
||||||
|
// Is equivalent to these two routes
|
||||||
|
$r->addRoute('GET', '/user/{id:\d+}', 'handler');
|
||||||
|
$r->addRoute('GET', '/user/{id:\d+}/{name}', 'handler');
|
||||||
|
|
||||||
|
// Multiple nested optional parts are possible as well
|
||||||
|
$r->addRoute('GET', '/user[/{id:\d+}[/{name}]]', 'handler');
|
||||||
|
|
||||||
|
// This route is NOT valid, because optional parts can only occur at the end
|
||||||
|
$r->addRoute('GET', '/user[/{id:\d+}]/{name}', 'handler');
|
||||||
|
```
|
||||||
|
|
||||||
|
The `$handler` parameter does not necessarily have to be a callback, it could also be a controller
|
||||||
|
class name or any other kind of data you wish to associate with the route. FastRoute only tells you
|
||||||
|
which handler corresponds to your URI, how you interpret it is up to you.
|
||||||
|
|
||||||
|
#### Shorcut methods for common request methods
|
||||||
|
|
||||||
|
For the `GET`, `POST`, `PUT`, `PATCH`, `DELETE` and `HEAD` request methods shortcut methods are available. For example:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$r->get('/get-route', 'get_handler');
|
||||||
|
$r->post('/post-route', 'post_handler');
|
||||||
|
```
|
||||||
|
|
||||||
|
Is equivalent to:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$r->addRoute('GET', '/get-route', 'get_handler');
|
||||||
|
$r->addRoute('POST', '/post-route', 'post_handler');
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Route Groups
|
||||||
|
|
||||||
|
Additionally, you can specify routes inside of a group. All routes defined inside a group will have a common prefix.
|
||||||
|
|
||||||
|
For example, defining your routes as:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$r->addGroup('/admin', function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/do-something', 'handler');
|
||||||
|
$r->addRoute('GET', '/do-another-thing', 'handler');
|
||||||
|
$r->addRoute('GET', '/do-something-else', 'handler');
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Will have the same result as:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$r->addRoute('GET', '/admin/do-something', 'handler');
|
||||||
|
$r->addRoute('GET', '/admin/do-another-thing', 'handler');
|
||||||
|
$r->addRoute('GET', '/admin/do-something-else', 'handler');
|
||||||
|
```
|
||||||
|
|
||||||
|
Nested groups are also supported, in which case the prefixes of all the nested groups are combined.
|
||||||
|
|
||||||
|
### Caching
|
||||||
|
|
||||||
|
The reason `simpleDispatcher` accepts a callback for defining the routes is to allow seamless
|
||||||
|
caching. By using `cachedDispatcher` instead of `simpleDispatcher` you can cache the generated
|
||||||
|
routing data and construct the dispatcher from the cached information:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$dispatcher = FastRoute\cachedDispatcher(function(FastRoute\RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
|
||||||
|
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler2');
|
||||||
|
}, [
|
||||||
|
'cacheFile' => __DIR__ . '/route.cache', /* required */
|
||||||
|
'cacheDisabled' => IS_DEBUG_ENABLED, /* optional, enabled by default */
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
|
||||||
|
The second parameter to the function is an options array, which can be used to specify the cache
|
||||||
|
file location, among other things.
|
||||||
|
|
||||||
|
### Dispatching a URI
|
||||||
|
|
||||||
|
A URI is dispatched by calling the `dispatch()` method of the created dispatcher. This method
|
||||||
|
accepts the HTTP method and a URI. Getting those two bits of information (and normalizing them
|
||||||
|
appropriately) is your job - this library is not bound to the PHP web SAPIs.
|
||||||
|
|
||||||
|
The `dispatch()` method returns an array whose first element contains a status code. It is one
|
||||||
|
of `Dispatcher::NOT_FOUND`, `Dispatcher::METHOD_NOT_ALLOWED` and `Dispatcher::FOUND`. For the
|
||||||
|
method not allowed status the second array element contains a list of HTTP methods allowed for
|
||||||
|
the supplied URI. For example:
|
||||||
|
|
||||||
|
[FastRoute\Dispatcher::METHOD_NOT_ALLOWED, ['GET', 'POST']]
|
||||||
|
|
||||||
|
> **NOTE:** The HTTP specification requires that a `405 Method Not Allowed` response include the
|
||||||
|
`Allow:` header to detail available methods for the requested resource. Applications using FastRoute
|
||||||
|
should use the second array element to add this header when relaying a 405 response.
|
||||||
|
|
||||||
|
For the found status the second array element is the handler that was associated with the route
|
||||||
|
and the third array element is a dictionary of placeholder names to their values. For example:
|
||||||
|
|
||||||
|
/* Routing against GET /user/nikic/42 */
|
||||||
|
|
||||||
|
[FastRoute\Dispatcher::FOUND, 'handler0', ['name' => 'nikic', 'id' => '42']]
|
||||||
|
|
||||||
|
### Overriding the route parser and dispatcher
|
||||||
|
|
||||||
|
The routing process makes use of three components: A route parser, a data generator and a
|
||||||
|
dispatcher. The three components adhere to the following interfaces:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
interface RouteParser {
|
||||||
|
public function parse($route);
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DataGenerator {
|
||||||
|
public function addRoute($httpMethod, $routeData, $handler);
|
||||||
|
public function getData();
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Dispatcher {
|
||||||
|
const NOT_FOUND = 0, FOUND = 1, METHOD_NOT_ALLOWED = 2;
|
||||||
|
|
||||||
|
public function dispatch($httpMethod, $uri);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The route parser takes a route pattern string and converts it into an array of route infos, where
|
||||||
|
each route info is again an array of it's parts. The structure is best understood using an example:
|
||||||
|
|
||||||
|
/* The route /user/{id:\d+}[/{name}] converts to the following array: */
|
||||||
|
[
|
||||||
|
[
|
||||||
|
'/user/',
|
||||||
|
['id', '\d+'],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/user/',
|
||||||
|
['id', '\d+'],
|
||||||
|
'/',
|
||||||
|
['name', '[^/]+'],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
|
||||||
|
This array can then be passed to the `addRoute()` method of a data generator. After all routes have
|
||||||
|
been added the `getData()` of the generator is invoked, which returns all the routing data required
|
||||||
|
by the dispatcher. The format of this data is not further specified - it is tightly coupled to
|
||||||
|
the corresponding dispatcher.
|
||||||
|
|
||||||
|
The dispatcher accepts the routing data via a constructor and provides a `dispatch()` method, which
|
||||||
|
you're already familiar with.
|
||||||
|
|
||||||
|
The route parser can be overwritten individually (to make use of some different pattern syntax),
|
||||||
|
however the data generator and dispatcher should always be changed as a pair, as the output from
|
||||||
|
the former is tightly coupled to the input of the latter. The reason the generator and the
|
||||||
|
dispatcher are separate is that only the latter is needed when using caching (as the output of
|
||||||
|
the former is what is being cached.)
|
||||||
|
|
||||||
|
When using the `simpleDispatcher` / `cachedDispatcher` functions from above the override happens
|
||||||
|
through the options array:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
|
||||||
|
/* ... */
|
||||||
|
}, [
|
||||||
|
'routeParser' => 'FastRoute\\RouteParser\\Std',
|
||||||
|
'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
|
||||||
|
'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased',
|
||||||
|
]);
|
||||||
|
```
|
||||||
|
|
||||||
|
The above options array corresponds to the defaults. By replacing `GroupCountBased` by
|
||||||
|
`GroupPosBased` you could switch to a different dispatching strategy.
|
||||||
|
|
||||||
|
### A Note on HEAD Requests
|
||||||
|
|
||||||
|
The HTTP spec requires servers to [support both GET and HEAD methods][2616-511]:
|
||||||
|
|
||||||
|
> The methods GET and HEAD MUST be supported by all general-purpose servers
|
||||||
|
|
||||||
|
To avoid forcing users to manually register HEAD routes for each resource we fallback to matching an
|
||||||
|
available GET route for a given resource. The PHP web SAPI transparently removes the entity body
|
||||||
|
from HEAD responses so this behavior has no effect on the vast majority of users.
|
||||||
|
|
||||||
|
However, implementers using FastRoute outside the web SAPI environment (e.g. a custom server) MUST
|
||||||
|
NOT send entity bodies generated in response to HEAD requests. If you are a non-SAPI user this is
|
||||||
|
*your responsibility*; FastRoute has no purview to prevent you from breaking HTTP in such cases.
|
||||||
|
|
||||||
|
Finally, note that applications MAY always specify their own HEAD method route for a given
|
||||||
|
resource to bypass this behavior entirely.
|
||||||
|
|
||||||
|
### Credits
|
||||||
|
|
||||||
|
This library is based on a router that [Levi Morrison][levi] implemented for the Aerys server.
|
||||||
|
|
||||||
|
A large number of tests, as well as HTTP compliance considerations, were provided by [Daniel Lowrey][rdlowrey].
|
||||||
|
|
||||||
|
|
||||||
|
[2616-511]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.1 "RFC 2616 Section 5.1.1"
|
||||||
|
[blog_post]: http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html
|
||||||
|
[levi]: https://github.com/morrisonlevi
|
||||||
|
[rdlowrey]: https://github.com/rdlowrey
|
24
rest/vendor/nikic/fast-route/composer.json
vendored
Normal file
24
rest/vendor/nikic/fast-route/composer.json
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "nikic/fast-route",
|
||||||
|
"description": "Fast request router for PHP",
|
||||||
|
"keywords": ["routing", "router"],
|
||||||
|
"license": "BSD-3-Clause",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Nikita Popov",
|
||||||
|
"email": "nikic@php.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"FastRoute\\": "src/"
|
||||||
|
},
|
||||||
|
"files": ["src/functions.php"]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35|~5.7"
|
||||||
|
}
|
||||||
|
}
|
24
rest/vendor/nikic/fast-route/phpunit.xml
vendored
Normal file
24
rest/vendor/nikic/fast-route/phpunit.xml
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<phpunit backupGlobals="false"
|
||||||
|
backupStaticAttributes="false"
|
||||||
|
colors="true"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
processIsolation="false"
|
||||||
|
syntaxCheck="false"
|
||||||
|
bootstrap="test/bootstrap.php"
|
||||||
|
>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="FastRoute Tests">
|
||||||
|
<directory>./test/</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
|
||||||
|
<filter>
|
||||||
|
<whitelist>
|
||||||
|
<directory>./src/</directory>
|
||||||
|
</whitelist>
|
||||||
|
</filter>
|
||||||
|
</phpunit>
|
28
rest/vendor/nikic/fast-route/psalm.xml
vendored
Normal file
28
rest/vendor/nikic/fast-route/psalm.xml
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<psalm
|
||||||
|
name="Example Psalm config with recommended defaults"
|
||||||
|
stopOnFirstError="false"
|
||||||
|
useDocblockTypes="true"
|
||||||
|
totallyTyped="false"
|
||||||
|
requireVoidReturnType="false"
|
||||||
|
>
|
||||||
|
<projectFiles>
|
||||||
|
<directory name="src" />
|
||||||
|
</projectFiles>
|
||||||
|
|
||||||
|
<issueHandlers>
|
||||||
|
<LessSpecificReturnType errorLevel="info" />
|
||||||
|
|
||||||
|
<!-- level 3 issues - slightly lazy code writing, but provably low false-negatives -->
|
||||||
|
<DeprecatedMethod errorLevel="info" />
|
||||||
|
|
||||||
|
<MissingClosureReturnType errorLevel="info" />
|
||||||
|
<MissingReturnType errorLevel="info" />
|
||||||
|
<MissingPropertyType errorLevel="info" />
|
||||||
|
<InvalidDocblock errorLevel="info" />
|
||||||
|
<MisplacedRequiredParam errorLevel="info" />
|
||||||
|
|
||||||
|
<PropertyNotSetInConstructor errorLevel="info" />
|
||||||
|
<MissingConstructor errorLevel="info" />
|
||||||
|
</issueHandlers>
|
||||||
|
</psalm>
|
7
rest/vendor/nikic/fast-route/src/BadRouteException.php
vendored
Normal file
7
rest/vendor/nikic/fast-route/src/BadRouteException.php
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
class BadRouteException extends \LogicException
|
||||||
|
{
|
||||||
|
}
|
26
rest/vendor/nikic/fast-route/src/DataGenerator.php
vendored
Normal file
26
rest/vendor/nikic/fast-route/src/DataGenerator.php
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
interface DataGenerator
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Adds a route to the data generator. The route data uses the
|
||||||
|
* same format that is returned by RouterParser::parser().
|
||||||
|
*
|
||||||
|
* The handler doesn't necessarily need to be a callable, it
|
||||||
|
* can be arbitrary data that will be returned when the route
|
||||||
|
* matches.
|
||||||
|
*
|
||||||
|
* @param string $httpMethod
|
||||||
|
* @param array $routeData
|
||||||
|
* @param mixed $handler
|
||||||
|
*/
|
||||||
|
public function addRoute($httpMethod, $routeData, $handler);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns dispatcher data in some unspecified format, which
|
||||||
|
* depends on the used method of dispatch.
|
||||||
|
*/
|
||||||
|
public function getData();
|
||||||
|
}
|
31
rest/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php
vendored
Normal file
31
rest/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\DataGenerator;
|
||||||
|
|
||||||
|
class CharCountBased extends RegexBasedAbstract
|
||||||
|
{
|
||||||
|
protected function getApproxChunkSize()
|
||||||
|
{
|
||||||
|
return 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function processChunk($regexToRoutesMap)
|
||||||
|
{
|
||||||
|
$routeMap = [];
|
||||||
|
$regexes = [];
|
||||||
|
|
||||||
|
$suffixLen = 0;
|
||||||
|
$suffix = '';
|
||||||
|
$count = count($regexToRoutesMap);
|
||||||
|
foreach ($regexToRoutesMap as $regex => $route) {
|
||||||
|
$suffixLen++;
|
||||||
|
$suffix .= "\t";
|
||||||
|
|
||||||
|
$regexes[] = '(?:' . $regex . '/(\t{' . $suffixLen . '})\t{' . ($count - $suffixLen) . '})';
|
||||||
|
$routeMap[$suffix] = [$route->handler, $route->variables];
|
||||||
|
}
|
||||||
|
|
||||||
|
$regex = '~^(?|' . implode('|', $regexes) . ')$~';
|
||||||
|
return ['regex' => $regex, 'suffix' => '/' . $suffix, 'routeMap' => $routeMap];
|
||||||
|
}
|
||||||
|
}
|
30
rest/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php
vendored
Normal file
30
rest/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\DataGenerator;
|
||||||
|
|
||||||
|
class GroupCountBased extends RegexBasedAbstract
|
||||||
|
{
|
||||||
|
protected function getApproxChunkSize()
|
||||||
|
{
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function processChunk($regexToRoutesMap)
|
||||||
|
{
|
||||||
|
$routeMap = [];
|
||||||
|
$regexes = [];
|
||||||
|
$numGroups = 0;
|
||||||
|
foreach ($regexToRoutesMap as $regex => $route) {
|
||||||
|
$numVariables = count($route->variables);
|
||||||
|
$numGroups = max($numGroups, $numVariables);
|
||||||
|
|
||||||
|
$regexes[] = $regex . str_repeat('()', $numGroups - $numVariables);
|
||||||
|
$routeMap[$numGroups + 1] = [$route->handler, $route->variables];
|
||||||
|
|
||||||
|
++$numGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
$regex = '~^(?|' . implode('|', $regexes) . ')$~';
|
||||||
|
return ['regex' => $regex, 'routeMap' => $routeMap];
|
||||||
|
}
|
||||||
|
}
|
27
rest/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php
vendored
Normal file
27
rest/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\DataGenerator;
|
||||||
|
|
||||||
|
class GroupPosBased extends RegexBasedAbstract
|
||||||
|
{
|
||||||
|
protected function getApproxChunkSize()
|
||||||
|
{
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function processChunk($regexToRoutesMap)
|
||||||
|
{
|
||||||
|
$routeMap = [];
|
||||||
|
$regexes = [];
|
||||||
|
$offset = 1;
|
||||||
|
foreach ($regexToRoutesMap as $regex => $route) {
|
||||||
|
$regexes[] = $regex;
|
||||||
|
$routeMap[$offset] = [$route->handler, $route->variables];
|
||||||
|
|
||||||
|
$offset += count($route->variables);
|
||||||
|
}
|
||||||
|
|
||||||
|
$regex = '~^(?:' . implode('|', $regexes) . ')$~';
|
||||||
|
return ['regex' => $regex, 'routeMap' => $routeMap];
|
||||||
|
}
|
||||||
|
}
|
27
rest/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php
vendored
Normal file
27
rest/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\DataGenerator;
|
||||||
|
|
||||||
|
class MarkBased extends RegexBasedAbstract
|
||||||
|
{
|
||||||
|
protected function getApproxChunkSize()
|
||||||
|
{
|
||||||
|
return 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function processChunk($regexToRoutesMap)
|
||||||
|
{
|
||||||
|
$routeMap = [];
|
||||||
|
$regexes = [];
|
||||||
|
$markName = 'a';
|
||||||
|
foreach ($regexToRoutesMap as $regex => $route) {
|
||||||
|
$regexes[] = $regex . '(*MARK:' . $markName . ')';
|
||||||
|
$routeMap[$markName] = [$route->handler, $route->variables];
|
||||||
|
|
||||||
|
++$markName;
|
||||||
|
}
|
||||||
|
|
||||||
|
$regex = '~^(?|' . implode('|', $regexes) . ')$~';
|
||||||
|
return ['regex' => $regex, 'routeMap' => $routeMap];
|
||||||
|
}
|
||||||
|
}
|
186
rest/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
vendored
Normal file
186
rest/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
vendored
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\DataGenerator;
|
||||||
|
|
||||||
|
use FastRoute\BadRouteException;
|
||||||
|
use FastRoute\DataGenerator;
|
||||||
|
use FastRoute\Route;
|
||||||
|
|
||||||
|
abstract class RegexBasedAbstract implements DataGenerator
|
||||||
|
{
|
||||||
|
/** @var mixed[][] */
|
||||||
|
protected $staticRoutes = [];
|
||||||
|
|
||||||
|
/** @var Route[][] */
|
||||||
|
protected $methodToRegexToRoutesMap = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
abstract protected function getApproxChunkSize();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed[]
|
||||||
|
*/
|
||||||
|
abstract protected function processChunk($regexToRoutesMap);
|
||||||
|
|
||||||
|
public function addRoute($httpMethod, $routeData, $handler)
|
||||||
|
{
|
||||||
|
if ($this->isStaticRoute($routeData)) {
|
||||||
|
$this->addStaticRoute($httpMethod, $routeData, $handler);
|
||||||
|
} else {
|
||||||
|
$this->addVariableRoute($httpMethod, $routeData, $handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed[]
|
||||||
|
*/
|
||||||
|
public function getData()
|
||||||
|
{
|
||||||
|
if (empty($this->methodToRegexToRoutesMap)) {
|
||||||
|
return [$this->staticRoutes, []];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$this->staticRoutes, $this->generateVariableRouteData()];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed[]
|
||||||
|
*/
|
||||||
|
private function generateVariableRouteData()
|
||||||
|
{
|
||||||
|
$data = [];
|
||||||
|
foreach ($this->methodToRegexToRoutesMap as $method => $regexToRoutesMap) {
|
||||||
|
$chunkSize = $this->computeChunkSize(count($regexToRoutesMap));
|
||||||
|
$chunks = array_chunk($regexToRoutesMap, $chunkSize, true);
|
||||||
|
$data[$method] = array_map([$this, 'processChunk'], $chunks);
|
||||||
|
}
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
private function computeChunkSize($count)
|
||||||
|
{
|
||||||
|
$numParts = max(1, round($count / $this->getApproxChunkSize()));
|
||||||
|
return (int) ceil($count / $numParts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed[]
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function isStaticRoute($routeData)
|
||||||
|
{
|
||||||
|
return count($routeData) === 1 && is_string($routeData[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function addStaticRoute($httpMethod, $routeData, $handler)
|
||||||
|
{
|
||||||
|
$routeStr = $routeData[0];
|
||||||
|
|
||||||
|
if (isset($this->staticRoutes[$httpMethod][$routeStr])) {
|
||||||
|
throw new BadRouteException(sprintf(
|
||||||
|
'Cannot register two routes matching "%s" for method "%s"',
|
||||||
|
$routeStr, $httpMethod
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->methodToRegexToRoutesMap[$httpMethod])) {
|
||||||
|
foreach ($this->methodToRegexToRoutesMap[$httpMethod] as $route) {
|
||||||
|
if ($route->matches($routeStr)) {
|
||||||
|
throw new BadRouteException(sprintf(
|
||||||
|
'Static route "%s" is shadowed by previously defined variable route "%s" for method "%s"',
|
||||||
|
$routeStr, $route->regex, $httpMethod
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->staticRoutes[$httpMethod][$routeStr] = $handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function addVariableRoute($httpMethod, $routeData, $handler)
|
||||||
|
{
|
||||||
|
list($regex, $variables) = $this->buildRegexForRoute($routeData);
|
||||||
|
|
||||||
|
if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) {
|
||||||
|
throw new BadRouteException(sprintf(
|
||||||
|
'Cannot register two routes matching "%s" for method "%s"',
|
||||||
|
$regex, $httpMethod
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->methodToRegexToRoutesMap[$httpMethod][$regex] = new Route(
|
||||||
|
$httpMethod, $handler, $regex, $variables
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed[]
|
||||||
|
* @return mixed[]
|
||||||
|
*/
|
||||||
|
private function buildRegexForRoute($routeData)
|
||||||
|
{
|
||||||
|
$regex = '';
|
||||||
|
$variables = [];
|
||||||
|
foreach ($routeData as $part) {
|
||||||
|
if (is_string($part)) {
|
||||||
|
$regex .= preg_quote($part, '~');
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($varName, $regexPart) = $part;
|
||||||
|
|
||||||
|
if (isset($variables[$varName])) {
|
||||||
|
throw new BadRouteException(sprintf(
|
||||||
|
'Cannot use the same placeholder "%s" twice', $varName
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->regexHasCapturingGroups($regexPart)) {
|
||||||
|
throw new BadRouteException(sprintf(
|
||||||
|
'Regex "%s" for parameter "%s" contains a capturing group',
|
||||||
|
$regexPart, $varName
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
$variables[$varName] = $varName;
|
||||||
|
$regex .= '(' . $regexPart . ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
return [$regex, $variables];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function regexHasCapturingGroups($regex)
|
||||||
|
{
|
||||||
|
if (false === strpos($regex, '(')) {
|
||||||
|
// Needs to have at least a ( to contain a capturing group
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Semi-accurate detection for capturing groups
|
||||||
|
return (bool) preg_match(
|
||||||
|
'~
|
||||||
|
(?:
|
||||||
|
\(\?\(
|
||||||
|
| \[ [^\]\\\\]* (?: \\\\ . [^\]\\\\]* )* \]
|
||||||
|
| \\\\ .
|
||||||
|
) (*SKIP)(*FAIL) |
|
||||||
|
\(
|
||||||
|
(?!
|
||||||
|
\? (?! <(?![!=]) | P< | \' )
|
||||||
|
| \*
|
||||||
|
)
|
||||||
|
~x',
|
||||||
|
$regex
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
26
rest/vendor/nikic/fast-route/src/Dispatcher.php
vendored
Normal file
26
rest/vendor/nikic/fast-route/src/Dispatcher.php
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
interface Dispatcher
|
||||||
|
{
|
||||||
|
const NOT_FOUND = 0;
|
||||||
|
const FOUND = 1;
|
||||||
|
const METHOD_NOT_ALLOWED = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatches against the provided HTTP method verb and URI.
|
||||||
|
*
|
||||||
|
* Returns array with one of the following formats:
|
||||||
|
*
|
||||||
|
* [self::NOT_FOUND]
|
||||||
|
* [self::METHOD_NOT_ALLOWED, ['GET', 'OTHER_ALLOWED_METHODS']]
|
||||||
|
* [self::FOUND, $handler, ['varName' => 'value', ...]]
|
||||||
|
*
|
||||||
|
* @param string $httpMethod
|
||||||
|
* @param string $uri
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function dispatch($httpMethod, $uri);
|
||||||
|
}
|
31
rest/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php
vendored
Normal file
31
rest/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
class CharCountBased extends RegexBasedAbstract
|
||||||
|
{
|
||||||
|
public function __construct($data)
|
||||||
|
{
|
||||||
|
list($this->staticRouteMap, $this->variableRouteData) = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function dispatchVariableRoute($routeData, $uri)
|
||||||
|
{
|
||||||
|
foreach ($routeData as $data) {
|
||||||
|
if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($handler, $varNames) = $data['routeMap'][end($matches)];
|
||||||
|
|
||||||
|
$vars = [];
|
||||||
|
$i = 0;
|
||||||
|
foreach ($varNames as $varName) {
|
||||||
|
$vars[$varName] = $matches[++$i];
|
||||||
|
}
|
||||||
|
return [self::FOUND, $handler, $vars];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [self::NOT_FOUND];
|
||||||
|
}
|
||||||
|
}
|
31
rest/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php
vendored
Normal file
31
rest/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
class GroupCountBased extends RegexBasedAbstract
|
||||||
|
{
|
||||||
|
public function __construct($data)
|
||||||
|
{
|
||||||
|
list($this->staticRouteMap, $this->variableRouteData) = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function dispatchVariableRoute($routeData, $uri)
|
||||||
|
{
|
||||||
|
foreach ($routeData as $data) {
|
||||||
|
if (!preg_match($data['regex'], $uri, $matches)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($handler, $varNames) = $data['routeMap'][count($matches)];
|
||||||
|
|
||||||
|
$vars = [];
|
||||||
|
$i = 0;
|
||||||
|
foreach ($varNames as $varName) {
|
||||||
|
$vars[$varName] = $matches[++$i];
|
||||||
|
}
|
||||||
|
return [self::FOUND, $handler, $vars];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [self::NOT_FOUND];
|
||||||
|
}
|
||||||
|
}
|
33
rest/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php
vendored
Normal file
33
rest/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
class GroupPosBased extends RegexBasedAbstract
|
||||||
|
{
|
||||||
|
public function __construct($data)
|
||||||
|
{
|
||||||
|
list($this->staticRouteMap, $this->variableRouteData) = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function dispatchVariableRoute($routeData, $uri)
|
||||||
|
{
|
||||||
|
foreach ($routeData as $data) {
|
||||||
|
if (!preg_match($data['regex'], $uri, $matches)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// find first non-empty match
|
||||||
|
for ($i = 1; '' === $matches[$i]; ++$i);
|
||||||
|
|
||||||
|
list($handler, $varNames) = $data['routeMap'][$i];
|
||||||
|
|
||||||
|
$vars = [];
|
||||||
|
foreach ($varNames as $varName) {
|
||||||
|
$vars[$varName] = $matches[$i++];
|
||||||
|
}
|
||||||
|
return [self::FOUND, $handler, $vars];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [self::NOT_FOUND];
|
||||||
|
}
|
||||||
|
}
|
31
rest/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php
vendored
Normal file
31
rest/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
class MarkBased extends RegexBasedAbstract
|
||||||
|
{
|
||||||
|
public function __construct($data)
|
||||||
|
{
|
||||||
|
list($this->staticRouteMap, $this->variableRouteData) = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function dispatchVariableRoute($routeData, $uri)
|
||||||
|
{
|
||||||
|
foreach ($routeData as $data) {
|
||||||
|
if (!preg_match($data['regex'], $uri, $matches)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($handler, $varNames) = $data['routeMap'][$matches['MARK']];
|
||||||
|
|
||||||
|
$vars = [];
|
||||||
|
$i = 0;
|
||||||
|
foreach ($varNames as $varName) {
|
||||||
|
$vars[$varName] = $matches[++$i];
|
||||||
|
}
|
||||||
|
return [self::FOUND, $handler, $vars];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [self::NOT_FOUND];
|
||||||
|
}
|
||||||
|
}
|
88
rest/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php
vendored
Normal file
88
rest/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php
vendored
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
use FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
abstract class RegexBasedAbstract implements Dispatcher
|
||||||
|
{
|
||||||
|
/** @var mixed[][] */
|
||||||
|
protected $staticRouteMap = [];
|
||||||
|
|
||||||
|
/** @var mixed[] */
|
||||||
|
protected $variableRouteData = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed[]
|
||||||
|
*/
|
||||||
|
abstract protected function dispatchVariableRoute($routeData, $uri);
|
||||||
|
|
||||||
|
public function dispatch($httpMethod, $uri)
|
||||||
|
{
|
||||||
|
if (isset($this->staticRouteMap[$httpMethod][$uri])) {
|
||||||
|
$handler = $this->staticRouteMap[$httpMethod][$uri];
|
||||||
|
return [self::FOUND, $handler, []];
|
||||||
|
}
|
||||||
|
|
||||||
|
$varRouteData = $this->variableRouteData;
|
||||||
|
if (isset($varRouteData[$httpMethod])) {
|
||||||
|
$result = $this->dispatchVariableRoute($varRouteData[$httpMethod], $uri);
|
||||||
|
if ($result[0] === self::FOUND) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// For HEAD requests, attempt fallback to GET
|
||||||
|
if ($httpMethod === 'HEAD') {
|
||||||
|
if (isset($this->staticRouteMap['GET'][$uri])) {
|
||||||
|
$handler = $this->staticRouteMap['GET'][$uri];
|
||||||
|
return [self::FOUND, $handler, []];
|
||||||
|
}
|
||||||
|
if (isset($varRouteData['GET'])) {
|
||||||
|
$result = $this->dispatchVariableRoute($varRouteData['GET'], $uri);
|
||||||
|
if ($result[0] === self::FOUND) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If nothing else matches, try fallback routes
|
||||||
|
if (isset($this->staticRouteMap['*'][$uri])) {
|
||||||
|
$handler = $this->staticRouteMap['*'][$uri];
|
||||||
|
return [self::FOUND, $handler, []];
|
||||||
|
}
|
||||||
|
if (isset($varRouteData['*'])) {
|
||||||
|
$result = $this->dispatchVariableRoute($varRouteData['*'], $uri);
|
||||||
|
if ($result[0] === self::FOUND) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find allowed methods for this URI by matching against all other HTTP methods as well
|
||||||
|
$allowedMethods = [];
|
||||||
|
|
||||||
|
foreach ($this->staticRouteMap as $method => $uriMap) {
|
||||||
|
if ($method !== $httpMethod && isset($uriMap[$uri])) {
|
||||||
|
$allowedMethods[] = $method;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($varRouteData as $method => $routeData) {
|
||||||
|
if ($method === $httpMethod) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->dispatchVariableRoute($routeData, $uri);
|
||||||
|
if ($result[0] === self::FOUND) {
|
||||||
|
$allowedMethods[] = $method;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If there are no allowed methods the route simply does not exist
|
||||||
|
if ($allowedMethods) {
|
||||||
|
return [self::METHOD_NOT_ALLOWED, $allowedMethods];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [self::NOT_FOUND];
|
||||||
|
}
|
||||||
|
}
|
47
rest/vendor/nikic/fast-route/src/Route.php
vendored
Normal file
47
rest/vendor/nikic/fast-route/src/Route.php
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
class Route
|
||||||
|
{
|
||||||
|
/** @var string */
|
||||||
|
public $httpMethod;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
public $regex;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
public $variables;
|
||||||
|
|
||||||
|
/** @var mixed */
|
||||||
|
public $handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a route (value object).
|
||||||
|
*
|
||||||
|
* @param string $httpMethod
|
||||||
|
* @param mixed $handler
|
||||||
|
* @param string $regex
|
||||||
|
* @param array $variables
|
||||||
|
*/
|
||||||
|
public function __construct($httpMethod, $handler, $regex, $variables)
|
||||||
|
{
|
||||||
|
$this->httpMethod = $httpMethod;
|
||||||
|
$this->handler = $handler;
|
||||||
|
$this->regex = $regex;
|
||||||
|
$this->variables = $variables;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests whether this route matches the given string.
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function matches($str)
|
||||||
|
{
|
||||||
|
$regex = '~^' . $this->regex . '$~';
|
||||||
|
return (bool) preg_match($regex, $str);
|
||||||
|
}
|
||||||
|
}
|
152
rest/vendor/nikic/fast-route/src/RouteCollector.php
vendored
Normal file
152
rest/vendor/nikic/fast-route/src/RouteCollector.php
vendored
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
class RouteCollector
|
||||||
|
{
|
||||||
|
/** @var RouteParser */
|
||||||
|
protected $routeParser;
|
||||||
|
|
||||||
|
/** @var DataGenerator */
|
||||||
|
protected $dataGenerator;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
protected $currentGroupPrefix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a route collector.
|
||||||
|
*
|
||||||
|
* @param RouteParser $routeParser
|
||||||
|
* @param DataGenerator $dataGenerator
|
||||||
|
*/
|
||||||
|
public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator)
|
||||||
|
{
|
||||||
|
$this->routeParser = $routeParser;
|
||||||
|
$this->dataGenerator = $dataGenerator;
|
||||||
|
$this->currentGroupPrefix = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a route to the collection.
|
||||||
|
*
|
||||||
|
* The syntax used in the $route string depends on the used route parser.
|
||||||
|
*
|
||||||
|
* @param string|string[] $httpMethod
|
||||||
|
* @param string $route
|
||||||
|
* @param mixed $handler
|
||||||
|
*/
|
||||||
|
public function addRoute($httpMethod, $route, $handler)
|
||||||
|
{
|
||||||
|
$route = $this->currentGroupPrefix . $route;
|
||||||
|
$routeDatas = $this->routeParser->parse($route);
|
||||||
|
foreach ((array) $httpMethod as $method) {
|
||||||
|
foreach ($routeDatas as $routeData) {
|
||||||
|
$this->dataGenerator->addRoute($method, $routeData, $handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a route group with a common prefix.
|
||||||
|
*
|
||||||
|
* All routes created in the passed callback will have the given group prefix prepended.
|
||||||
|
*
|
||||||
|
* @param string $prefix
|
||||||
|
* @param callable $callback
|
||||||
|
*/
|
||||||
|
public function addGroup($prefix, callable $callback)
|
||||||
|
{
|
||||||
|
$previousGroupPrefix = $this->currentGroupPrefix;
|
||||||
|
$this->currentGroupPrefix = $previousGroupPrefix . $prefix;
|
||||||
|
$callback($this);
|
||||||
|
$this->currentGroupPrefix = $previousGroupPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a GET route to the collection
|
||||||
|
*
|
||||||
|
* This is simply an alias of $this->addRoute('GET', $route, $handler)
|
||||||
|
*
|
||||||
|
* @param string $route
|
||||||
|
* @param mixed $handler
|
||||||
|
*/
|
||||||
|
public function get($route, $handler)
|
||||||
|
{
|
||||||
|
$this->addRoute('GET', $route, $handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a POST route to the collection
|
||||||
|
*
|
||||||
|
* This is simply an alias of $this->addRoute('POST', $route, $handler)
|
||||||
|
*
|
||||||
|
* @param string $route
|
||||||
|
* @param mixed $handler
|
||||||
|
*/
|
||||||
|
public function post($route, $handler)
|
||||||
|
{
|
||||||
|
$this->addRoute('POST', $route, $handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a PUT route to the collection
|
||||||
|
*
|
||||||
|
* This is simply an alias of $this->addRoute('PUT', $route, $handler)
|
||||||
|
*
|
||||||
|
* @param string $route
|
||||||
|
* @param mixed $handler
|
||||||
|
*/
|
||||||
|
public function put($route, $handler)
|
||||||
|
{
|
||||||
|
$this->addRoute('PUT', $route, $handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a DELETE route to the collection
|
||||||
|
*
|
||||||
|
* This is simply an alias of $this->addRoute('DELETE', $route, $handler)
|
||||||
|
*
|
||||||
|
* @param string $route
|
||||||
|
* @param mixed $handler
|
||||||
|
*/
|
||||||
|
public function delete($route, $handler)
|
||||||
|
{
|
||||||
|
$this->addRoute('DELETE', $route, $handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a PATCH route to the collection
|
||||||
|
*
|
||||||
|
* This is simply an alias of $this->addRoute('PATCH', $route, $handler)
|
||||||
|
*
|
||||||
|
* @param string $route
|
||||||
|
* @param mixed $handler
|
||||||
|
*/
|
||||||
|
public function patch($route, $handler)
|
||||||
|
{
|
||||||
|
$this->addRoute('PATCH', $route, $handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a HEAD route to the collection
|
||||||
|
*
|
||||||
|
* This is simply an alias of $this->addRoute('HEAD', $route, $handler)
|
||||||
|
*
|
||||||
|
* @param string $route
|
||||||
|
* @param mixed $handler
|
||||||
|
*/
|
||||||
|
public function head($route, $handler)
|
||||||
|
{
|
||||||
|
$this->addRoute('HEAD', $route, $handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the collected route data, as provided by the data generator.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getData()
|
||||||
|
{
|
||||||
|
return $this->dataGenerator->getData();
|
||||||
|
}
|
||||||
|
}
|
37
rest/vendor/nikic/fast-route/src/RouteParser.php
vendored
Normal file
37
rest/vendor/nikic/fast-route/src/RouteParser.php
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
interface RouteParser
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Parses a route string into multiple route data arrays.
|
||||||
|
*
|
||||||
|
* The expected output is defined using an example:
|
||||||
|
*
|
||||||
|
* For the route string "/fixedRoutePart/{varName}[/moreFixed/{varName2:\d+}]", if {varName} is interpreted as
|
||||||
|
* a placeholder and [...] is interpreted as an optional route part, the expected result is:
|
||||||
|
*
|
||||||
|
* [
|
||||||
|
* // first route: without optional part
|
||||||
|
* [
|
||||||
|
* "/fixedRoutePart/",
|
||||||
|
* ["varName", "[^/]+"],
|
||||||
|
* ],
|
||||||
|
* // second route: with optional part
|
||||||
|
* [
|
||||||
|
* "/fixedRoutePart/",
|
||||||
|
* ["varName", "[^/]+"],
|
||||||
|
* "/moreFixed/",
|
||||||
|
* ["varName2", [0-9]+"],
|
||||||
|
* ],
|
||||||
|
* ]
|
||||||
|
*
|
||||||
|
* Here one route string was converted into two route data arrays.
|
||||||
|
*
|
||||||
|
* @param string $route Route string to parse
|
||||||
|
*
|
||||||
|
* @return mixed[][] Array of route data arrays
|
||||||
|
*/
|
||||||
|
public function parse($route);
|
||||||
|
}
|
87
rest/vendor/nikic/fast-route/src/RouteParser/Std.php
vendored
Normal file
87
rest/vendor/nikic/fast-route/src/RouteParser/Std.php
vendored
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\RouteParser;
|
||||||
|
|
||||||
|
use FastRoute\BadRouteException;
|
||||||
|
use FastRoute\RouteParser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses route strings of the following form:
|
||||||
|
*
|
||||||
|
* "/user/{name}[/{id:[0-9]+}]"
|
||||||
|
*/
|
||||||
|
class Std implements RouteParser
|
||||||
|
{
|
||||||
|
const VARIABLE_REGEX = <<<'REGEX'
|
||||||
|
\{
|
||||||
|
\s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s*
|
||||||
|
(?:
|
||||||
|
: \s* ([^{}]*(?:\{(?-1)\}[^{}]*)*)
|
||||||
|
)?
|
||||||
|
\}
|
||||||
|
REGEX;
|
||||||
|
const DEFAULT_DISPATCH_REGEX = '[^/]+';
|
||||||
|
|
||||||
|
public function parse($route)
|
||||||
|
{
|
||||||
|
$routeWithoutClosingOptionals = rtrim($route, ']');
|
||||||
|
$numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals);
|
||||||
|
|
||||||
|
// Split on [ while skipping placeholders
|
||||||
|
$segments = preg_split('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \[~x', $routeWithoutClosingOptionals);
|
||||||
|
if ($numOptionals !== count($segments) - 1) {
|
||||||
|
// If there are any ] in the middle of the route, throw a more specific error message
|
||||||
|
if (preg_match('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \]~x', $routeWithoutClosingOptionals)) {
|
||||||
|
throw new BadRouteException('Optional segments can only occur at the end of a route');
|
||||||
|
}
|
||||||
|
throw new BadRouteException("Number of opening '[' and closing ']' does not match");
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentRoute = '';
|
||||||
|
$routeDatas = [];
|
||||||
|
foreach ($segments as $n => $segment) {
|
||||||
|
if ($segment === '' && $n !== 0) {
|
||||||
|
throw new BadRouteException('Empty optional part');
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentRoute .= $segment;
|
||||||
|
$routeDatas[] = $this->parsePlaceholders($currentRoute);
|
||||||
|
}
|
||||||
|
return $routeDatas;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a route string that does not contain optional segments.
|
||||||
|
*
|
||||||
|
* @param string
|
||||||
|
* @return mixed[]
|
||||||
|
*/
|
||||||
|
private function parsePlaceholders($route)
|
||||||
|
{
|
||||||
|
if (!preg_match_all(
|
||||||
|
'~' . self::VARIABLE_REGEX . '~x', $route, $matches,
|
||||||
|
PREG_OFFSET_CAPTURE | PREG_SET_ORDER
|
||||||
|
)) {
|
||||||
|
return [$route];
|
||||||
|
}
|
||||||
|
|
||||||
|
$offset = 0;
|
||||||
|
$routeData = [];
|
||||||
|
foreach ($matches as $set) {
|
||||||
|
if ($set[0][1] > $offset) {
|
||||||
|
$routeData[] = substr($route, $offset, $set[0][1] - $offset);
|
||||||
|
}
|
||||||
|
$routeData[] = [
|
||||||
|
$set[1][0],
|
||||||
|
isset($set[2]) ? trim($set[2][0]) : self::DEFAULT_DISPATCH_REGEX
|
||||||
|
];
|
||||||
|
$offset = $set[0][1] + strlen($set[0][0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($offset !== strlen($route)) {
|
||||||
|
$routeData[] = substr($route, $offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $routeData;
|
||||||
|
}
|
||||||
|
}
|
12
rest/vendor/nikic/fast-route/src/bootstrap.php
vendored
Normal file
12
rest/vendor/nikic/fast-route/src/bootstrap.php
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
require __DIR__ . '/functions.php';
|
||||||
|
|
||||||
|
spl_autoload_register(function ($class) {
|
||||||
|
if (strpos($class, 'FastRoute\\') === 0) {
|
||||||
|
$name = substr($class, strlen('FastRoute'));
|
||||||
|
require __DIR__ . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php';
|
||||||
|
}
|
||||||
|
});
|
74
rest/vendor/nikic/fast-route/src/functions.php
vendored
Normal file
74
rest/vendor/nikic/fast-route/src/functions.php
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
if (!function_exists('FastRoute\simpleDispatcher')) {
|
||||||
|
/**
|
||||||
|
* @param callable $routeDefinitionCallback
|
||||||
|
* @param array $options
|
||||||
|
*
|
||||||
|
* @return Dispatcher
|
||||||
|
*/
|
||||||
|
function simpleDispatcher(callable $routeDefinitionCallback, array $options = [])
|
||||||
|
{
|
||||||
|
$options += [
|
||||||
|
'routeParser' => 'FastRoute\\RouteParser\\Std',
|
||||||
|
'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
|
||||||
|
'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased',
|
||||||
|
'routeCollector' => 'FastRoute\\RouteCollector',
|
||||||
|
];
|
||||||
|
|
||||||
|
/** @var RouteCollector $routeCollector */
|
||||||
|
$routeCollector = new $options['routeCollector'](
|
||||||
|
new $options['routeParser'], new $options['dataGenerator']
|
||||||
|
);
|
||||||
|
$routeDefinitionCallback($routeCollector);
|
||||||
|
|
||||||
|
return new $options['dispatcher']($routeCollector->getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param callable $routeDefinitionCallback
|
||||||
|
* @param array $options
|
||||||
|
*
|
||||||
|
* @return Dispatcher
|
||||||
|
*/
|
||||||
|
function cachedDispatcher(callable $routeDefinitionCallback, array $options = [])
|
||||||
|
{
|
||||||
|
$options += [
|
||||||
|
'routeParser' => 'FastRoute\\RouteParser\\Std',
|
||||||
|
'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
|
||||||
|
'dispatcher' => 'FastRoute\\Dispatcher\\GroupCountBased',
|
||||||
|
'routeCollector' => 'FastRoute\\RouteCollector',
|
||||||
|
'cacheDisabled' => false,
|
||||||
|
];
|
||||||
|
|
||||||
|
if (!isset($options['cacheFile'])) {
|
||||||
|
throw new \LogicException('Must specify "cacheFile" option');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$options['cacheDisabled'] && file_exists($options['cacheFile'])) {
|
||||||
|
$dispatchData = require $options['cacheFile'];
|
||||||
|
if (!is_array($dispatchData)) {
|
||||||
|
throw new \RuntimeException('Invalid cache file "' . $options['cacheFile'] . '"');
|
||||||
|
}
|
||||||
|
return new $options['dispatcher']($dispatchData);
|
||||||
|
}
|
||||||
|
|
||||||
|
$routeCollector = new $options['routeCollector'](
|
||||||
|
new $options['routeParser'], new $options['dataGenerator']
|
||||||
|
);
|
||||||
|
$routeDefinitionCallback($routeCollector);
|
||||||
|
|
||||||
|
/** @var RouteCollector $routeCollector */
|
||||||
|
$dispatchData = $routeCollector->getData();
|
||||||
|
if (!$options['cacheDisabled']) {
|
||||||
|
file_put_contents(
|
||||||
|
$options['cacheFile'],
|
||||||
|
'<?php return ' . var_export($dispatchData, true) . ';'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new $options['dispatcher']($dispatchData);
|
||||||
|
}
|
||||||
|
}
|
16
rest/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php
vendored
Normal file
16
rest/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
class CharCountBasedTest extends DispatcherTest
|
||||||
|
{
|
||||||
|
protected function getDispatcherClass()
|
||||||
|
{
|
||||||
|
return 'FastRoute\\Dispatcher\\CharCountBased';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getDataGeneratorClass()
|
||||||
|
{
|
||||||
|
return 'FastRoute\\DataGenerator\\CharCountBased';
|
||||||
|
}
|
||||||
|
}
|
581
rest/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php
vendored
Normal file
581
rest/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php
vendored
Normal file
@ -0,0 +1,581 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
use FastRoute\RouteCollector;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
abstract class DispatcherTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Delegate dispatcher selection to child test classes
|
||||||
|
*/
|
||||||
|
abstract protected function getDispatcherClass();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delegate dataGenerator selection to child test classes
|
||||||
|
*/
|
||||||
|
abstract protected function getDataGeneratorClass();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set appropriate options for the specific Dispatcher class we're testing
|
||||||
|
*/
|
||||||
|
private function generateDispatcherOptions()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'dataGenerator' => $this->getDataGeneratorClass(),
|
||||||
|
'dispatcher' => $this->getDispatcherClass()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideFoundDispatchCases
|
||||||
|
*/
|
||||||
|
public function testFoundDispatches($method, $uri, $callback, $handler, $argDict)
|
||||||
|
{
|
||||||
|
$dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
|
||||||
|
$info = $dispatcher->dispatch($method, $uri);
|
||||||
|
$this->assertSame($dispatcher::FOUND, $info[0]);
|
||||||
|
$this->assertSame($handler, $info[1]);
|
||||||
|
$this->assertSame($argDict, $info[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideNotFoundDispatchCases
|
||||||
|
*/
|
||||||
|
public function testNotFoundDispatches($method, $uri, $callback)
|
||||||
|
{
|
||||||
|
$dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
|
||||||
|
$routeInfo = $dispatcher->dispatch($method, $uri);
|
||||||
|
$this->assertArrayNotHasKey(1, $routeInfo,
|
||||||
|
'NOT_FOUND result must only contain a single element in the returned info array'
|
||||||
|
);
|
||||||
|
$this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideMethodNotAllowedDispatchCases
|
||||||
|
*/
|
||||||
|
public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods)
|
||||||
|
{
|
||||||
|
$dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
|
||||||
|
$routeInfo = $dispatcher->dispatch($method, $uri);
|
||||||
|
$this->assertArrayHasKey(1, $routeInfo,
|
||||||
|
'METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1'
|
||||||
|
);
|
||||||
|
|
||||||
|
list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri);
|
||||||
|
$this->assertSame($dispatcher::METHOD_NOT_ALLOWED, $routedStatus);
|
||||||
|
$this->assertSame($availableMethods, $methodArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \FastRoute\BadRouteException
|
||||||
|
* @expectedExceptionMessage Cannot use the same placeholder "test" twice
|
||||||
|
*/
|
||||||
|
public function testDuplicateVariableNameError()
|
||||||
|
{
|
||||||
|
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0');
|
||||||
|
}, $this->generateDispatcherOptions());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \FastRoute\BadRouteException
|
||||||
|
* @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET"
|
||||||
|
*/
|
||||||
|
public function testDuplicateVariableRoute()
|
||||||
|
{
|
||||||
|
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{id}', 'handler0'); // oops, forgot \d+ restriction ;)
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler1');
|
||||||
|
}, $this->generateDispatcherOptions());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \FastRoute\BadRouteException
|
||||||
|
* @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET"
|
||||||
|
*/
|
||||||
|
public function testDuplicateStaticRoute()
|
||||||
|
{
|
||||||
|
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user', 'handler0');
|
||||||
|
$r->addRoute('GET', '/user', 'handler1');
|
||||||
|
}, $this->generateDispatcherOptions());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \FastRoute\BadRouteException
|
||||||
|
* @expectedExceptionMessage Static route "/user/nikic" is shadowed by previously defined variable route "/user/([^/]+)" for method "GET"
|
||||||
|
*/
|
||||||
|
public function testShadowedStaticRoute()
|
||||||
|
{
|
||||||
|
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||||
|
$r->addRoute('GET', '/user/nikic', 'handler1');
|
||||||
|
}, $this->generateDispatcherOptions());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \FastRoute\BadRouteException
|
||||||
|
* @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group
|
||||||
|
*/
|
||||||
|
public function testCapturing()
|
||||||
|
{
|
||||||
|
\FastRoute\simpleDispatcher(function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/{lang:(en|de)}', 'handler0');
|
||||||
|
}, $this->generateDispatcherOptions());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideFoundDispatchCases()
|
||||||
|
{
|
||||||
|
$cases = [];
|
||||||
|
|
||||||
|
// 0 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/resource/123/456', 'handler0');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/resource/123/456';
|
||||||
|
$handler = 'handler0';
|
||||||
|
$argDict = [];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 1 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/handler0', 'handler0');
|
||||||
|
$r->addRoute('GET', '/handler1', 'handler1');
|
||||||
|
$r->addRoute('GET', '/handler2', 'handler2');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/handler2';
|
||||||
|
$handler = 'handler2';
|
||||||
|
$argDict = [];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 2 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
|
||||||
|
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler2');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/user/rdlowrey';
|
||||||
|
$handler = 'handler2';
|
||||||
|
$argDict = ['name' => 'rdlowrey'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 3 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
// reuse $callback from #2
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/user/12345';
|
||||||
|
$handler = 'handler1';
|
||||||
|
$argDict = ['id' => '12345'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 4 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
// reuse $callback from #3
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/user/NaN';
|
||||||
|
$handler = 'handler2';
|
||||||
|
$argDict = ['name' => 'NaN'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 5 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
// reuse $callback from #4
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/user/rdlowrey/12345';
|
||||||
|
$handler = 'handler0';
|
||||||
|
$argDict = ['name' => 'rdlowrey', 'id' => '12345'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 6 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler0');
|
||||||
|
$r->addRoute('GET', '/user/12345/extension', 'handler1');
|
||||||
|
$r->addRoute('GET', '/user/{id:[0-9]+}.{extension}', 'handler2');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/user/12345.svg';
|
||||||
|
$handler = 'handler2';
|
||||||
|
$argDict = ['id' => '12345', 'extension' => 'svg'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 7 ----- Test GET method fallback on HEAD route miss ------------------------------------>
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||||
|
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1');
|
||||||
|
$r->addRoute('GET', '/static0', 'handler2');
|
||||||
|
$r->addRoute('GET', '/static1', 'handler3');
|
||||||
|
$r->addRoute('HEAD', '/static1', 'handler4');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'HEAD';
|
||||||
|
$uri = '/user/rdlowrey';
|
||||||
|
$handler = 'handler0';
|
||||||
|
$argDict = ['name' => 'rdlowrey'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 8 ----- Test GET method fallback on HEAD route miss ------------------------------------>
|
||||||
|
|
||||||
|
// reuse $callback from #7
|
||||||
|
|
||||||
|
$method = 'HEAD';
|
||||||
|
$uri = '/user/rdlowrey/1234';
|
||||||
|
$handler = 'handler1';
|
||||||
|
$argDict = ['name' => 'rdlowrey', 'id' => '1234'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 9 ----- Test GET method fallback on HEAD route miss ------------------------------------>
|
||||||
|
|
||||||
|
// reuse $callback from #8
|
||||||
|
|
||||||
|
$method = 'HEAD';
|
||||||
|
$uri = '/static0';
|
||||||
|
$handler = 'handler2';
|
||||||
|
$argDict = [];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 10 ---- Test existing HEAD route used if available (no fallback) ----------------------->
|
||||||
|
|
||||||
|
// reuse $callback from #9
|
||||||
|
|
||||||
|
$method = 'HEAD';
|
||||||
|
$uri = '/static1';
|
||||||
|
$handler = 'handler4';
|
||||||
|
$argDict = [];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 11 ---- More specified routes are not shadowed by less specific of another method ------>
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||||
|
$r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'POST';
|
||||||
|
$uri = '/user/rdlowrey';
|
||||||
|
$handler = 'handler1';
|
||||||
|
$argDict = ['name' => 'rdlowrey'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 12 ---- Handler of more specific routes is used, if it occurs first -------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||||
|
$r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1');
|
||||||
|
$r->addRoute('POST', '/user/{name}', 'handler2');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'POST';
|
||||||
|
$uri = '/user/rdlowrey';
|
||||||
|
$handler = 'handler1';
|
||||||
|
$argDict = ['name' => 'rdlowrey'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 13 ---- Route with constant suffix ----------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler0');
|
||||||
|
$r->addRoute('GET', '/user/{name}/edit', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/user/rdlowrey/edit';
|
||||||
|
$handler = 'handler1';
|
||||||
|
$argDict = ['name' => 'rdlowrey'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $handler, $argDict];
|
||||||
|
|
||||||
|
// 14 ---- Handle multiple methods with the same handler ---------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost');
|
||||||
|
$r->addRoute(['DELETE'], '/user', 'handlerDelete');
|
||||||
|
$r->addRoute([], '/user', 'handlerNone');
|
||||||
|
};
|
||||||
|
|
||||||
|
$argDict = [];
|
||||||
|
$cases[] = ['GET', '/user', $callback, 'handlerGetPost', $argDict];
|
||||||
|
$cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict];
|
||||||
|
$cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict];
|
||||||
|
|
||||||
|
// 17 ----
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('POST', '/user.json', 'handler0');
|
||||||
|
$r->addRoute('GET', '/{entity}.json', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']];
|
||||||
|
|
||||||
|
// 18 ----
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '', 'handler0');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['GET', '', $callback, 'handler0', []];
|
||||||
|
|
||||||
|
// 19 ----
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('HEAD', '/a/{foo}', 'handler0');
|
||||||
|
$r->addRoute('GET', '/b/{foo}', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']];
|
||||||
|
|
||||||
|
// 20 ----
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('HEAD', '/a', 'handler0');
|
||||||
|
$r->addRoute('GET', '/b', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['HEAD', '/b', $callback, 'handler1', []];
|
||||||
|
|
||||||
|
// 21 ----
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/foo', 'handler0');
|
||||||
|
$r->addRoute('HEAD', '/{bar}', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']];
|
||||||
|
|
||||||
|
// 22 ----
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('*', '/user', 'handler0');
|
||||||
|
$r->addRoute('*', '/{user}', 'handler1');
|
||||||
|
$r->addRoute('GET', '/user', 'handler2');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['GET', '/user', $callback, 'handler2', []];
|
||||||
|
|
||||||
|
// 23 ----
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('*', '/user', 'handler0');
|
||||||
|
$r->addRoute('GET', '/user', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['POST', '/user', $callback, 'handler0', []];
|
||||||
|
|
||||||
|
// 24 ----
|
||||||
|
|
||||||
|
$cases[] = ['HEAD', '/user', $callback, 'handler1', []];
|
||||||
|
|
||||||
|
// 25 ----
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/{bar}', 'handler0');
|
||||||
|
$r->addRoute('*', '/foo', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']];
|
||||||
|
|
||||||
|
// 26 ----
|
||||||
|
|
||||||
|
$callback = function(RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user', 'handler0');
|
||||||
|
$r->addRoute('*', '/{foo:.*}', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']];
|
||||||
|
|
||||||
|
// x -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
return $cases;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideNotFoundDispatchCases()
|
||||||
|
{
|
||||||
|
$cases = [];
|
||||||
|
|
||||||
|
// 0 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/resource/123/456', 'handler0');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/not-found';
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback];
|
||||||
|
|
||||||
|
// 1 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
// reuse callback from #0
|
||||||
|
$method = 'POST';
|
||||||
|
$uri = '/not-found';
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback];
|
||||||
|
|
||||||
|
// 2 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
// reuse callback from #1
|
||||||
|
$method = 'PUT';
|
||||||
|
$uri = '/not-found';
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback];
|
||||||
|
|
||||||
|
// 3 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/handler0', 'handler0');
|
||||||
|
$r->addRoute('GET', '/handler1', 'handler1');
|
||||||
|
$r->addRoute('GET', '/handler2', 'handler2');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/not-found';
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback];
|
||||||
|
|
||||||
|
// 4 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
|
||||||
|
$r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
|
||||||
|
$r->addRoute('GET', '/user/{name}', 'handler2');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/not-found';
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback];
|
||||||
|
|
||||||
|
// 5 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
// reuse callback from #4
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/user/rdlowrey/12345/not-found';
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback];
|
||||||
|
|
||||||
|
// 6 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
// reuse callback from #5
|
||||||
|
$method = 'HEAD';
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback];
|
||||||
|
|
||||||
|
// x -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
return $cases;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideMethodNotAllowedDispatchCases()
|
||||||
|
{
|
||||||
|
$cases = [];
|
||||||
|
|
||||||
|
// 0 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/resource/123/456', 'handler0');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'POST';
|
||||||
|
$uri = '/resource/123/456';
|
||||||
|
$allowedMethods = ['GET'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $allowedMethods];
|
||||||
|
|
||||||
|
// 1 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/resource/123/456', 'handler0');
|
||||||
|
$r->addRoute('POST', '/resource/123/456', 'handler1');
|
||||||
|
$r->addRoute('PUT', '/resource/123/456', 'handler2');
|
||||||
|
$r->addRoute('*', '/', 'handler3');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'DELETE';
|
||||||
|
$uri = '/resource/123/456';
|
||||||
|
$allowedMethods = ['GET', 'POST', 'PUT'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $allowedMethods];
|
||||||
|
|
||||||
|
// 2 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
|
||||||
|
$r->addRoute('POST', '/user/{name}/{id:[0-9]+}', 'handler1');
|
||||||
|
$r->addRoute('PUT', '/user/{name}/{id:[0-9]+}', 'handler2');
|
||||||
|
$r->addRoute('PATCH', '/user/{name}/{id:[0-9]+}', 'handler3');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'DELETE';
|
||||||
|
$uri = '/user/rdlowrey/42';
|
||||||
|
$allowedMethods = ['GET', 'POST', 'PUT', 'PATCH'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $allowedMethods];
|
||||||
|
|
||||||
|
// 3 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('POST', '/user/{name}', 'handler1');
|
||||||
|
$r->addRoute('PUT', '/user/{name:[a-z]+}', 'handler2');
|
||||||
|
$r->addRoute('PATCH', '/user/{name:[a-z]+}', 'handler3');
|
||||||
|
};
|
||||||
|
|
||||||
|
$method = 'GET';
|
||||||
|
$uri = '/user/rdlowrey';
|
||||||
|
$allowedMethods = ['POST', 'PUT', 'PATCH'];
|
||||||
|
|
||||||
|
$cases[] = [$method, $uri, $callback, $allowedMethods];
|
||||||
|
|
||||||
|
// 4 -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost');
|
||||||
|
$r->addRoute(['DELETE'], '/user', 'handlerDelete');
|
||||||
|
$r->addRoute([], '/user', 'handlerNone');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['PUT', '/user', $callback, ['GET', 'POST', 'DELETE']];
|
||||||
|
|
||||||
|
// 5
|
||||||
|
|
||||||
|
$callback = function (RouteCollector $r) {
|
||||||
|
$r->addRoute('POST', '/user.json', 'handler0');
|
||||||
|
$r->addRoute('GET', '/{entity}.json', 'handler1');
|
||||||
|
};
|
||||||
|
|
||||||
|
$cases[] = ['PUT', '/user.json', $callback, ['POST', 'GET']];
|
||||||
|
|
||||||
|
// x -------------------------------------------------------------------------------------->
|
||||||
|
|
||||||
|
return $cases;
|
||||||
|
}
|
||||||
|
}
|
16
rest/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php
vendored
Normal file
16
rest/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
class GroupCountBasedTest extends DispatcherTest
|
||||||
|
{
|
||||||
|
protected function getDispatcherClass()
|
||||||
|
{
|
||||||
|
return 'FastRoute\\Dispatcher\\GroupCountBased';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getDataGeneratorClass()
|
||||||
|
{
|
||||||
|
return 'FastRoute\\DataGenerator\\GroupCountBased';
|
||||||
|
}
|
||||||
|
}
|
16
rest/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php
vendored
Normal file
16
rest/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
class GroupPosBasedTest extends DispatcherTest
|
||||||
|
{
|
||||||
|
protected function getDispatcherClass()
|
||||||
|
{
|
||||||
|
return 'FastRoute\\Dispatcher\\GroupPosBased';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getDataGeneratorClass()
|
||||||
|
{
|
||||||
|
return 'FastRoute\\DataGenerator\\GroupPosBased';
|
||||||
|
}
|
||||||
|
}
|
24
rest/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php
vendored
Normal file
24
rest/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\Dispatcher;
|
||||||
|
|
||||||
|
class MarkBasedTest extends DispatcherTest
|
||||||
|
{
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
preg_match('/(*MARK:A)a/', 'a', $matches);
|
||||||
|
if (!isset($matches['MARK'])) {
|
||||||
|
$this->markTestSkipped('PHP 5.6 required for MARK support');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getDispatcherClass()
|
||||||
|
{
|
||||||
|
return 'FastRoute\\Dispatcher\\MarkBased';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getDataGeneratorClass()
|
||||||
|
{
|
||||||
|
return 'FastRoute\\DataGenerator\\MarkBased';
|
||||||
|
}
|
||||||
|
}
|
44
rest/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php
vendored
Normal file
44
rest/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class HackTypecheckerTest extends TestCase
|
||||||
|
{
|
||||||
|
const SERVER_ALREADY_RUNNING_CODE = 77;
|
||||||
|
|
||||||
|
public function testTypechecks($recurse = true)
|
||||||
|
{
|
||||||
|
if (!defined('HHVM_VERSION')) {
|
||||||
|
$this->markTestSkipped('HHVM only');
|
||||||
|
}
|
||||||
|
if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) {
|
||||||
|
$this->markTestSkipped('classname<T> requires HHVM 3.9+');
|
||||||
|
}
|
||||||
|
|
||||||
|
// The typechecker recurses the whole tree, so it makes sure
|
||||||
|
// that everything in fixtures/ is valid when this runs.
|
||||||
|
|
||||||
|
$output = [];
|
||||||
|
$exit_code = null;
|
||||||
|
exec(
|
||||||
|
'hh_server --check ' . escapeshellarg(__DIR__ . '/../../') . ' 2>&1',
|
||||||
|
$output,
|
||||||
|
$exit_code
|
||||||
|
);
|
||||||
|
if ($exit_code === self::SERVER_ALREADY_RUNNING_CODE) {
|
||||||
|
$this->assertTrue(
|
||||||
|
$recurse,
|
||||||
|
'Typechecker still running after running hh_client stop'
|
||||||
|
);
|
||||||
|
// Server already running - 3.10 => 3.11 regression:
|
||||||
|
// https://github.com/facebook/hhvm/issues/6646
|
||||||
|
exec('hh_client stop 2>/dev/null');
|
||||||
|
$this->testTypechecks(/* recurse = */ false);
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
$this->assertSame(0, $exit_code, implode("\n", $output));
|
||||||
|
}
|
||||||
|
}
|
29
rest/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php
vendored
Normal file
29
rest/vendor/nikic/fast-route/test/HackTypechecker/fixtures/all_options.php
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
<?hh
|
||||||
|
|
||||||
|
namespace FastRoute\TestFixtures;
|
||||||
|
|
||||||
|
function all_options_simple(): \FastRoute\Dispatcher {
|
||||||
|
return \FastRoute\simpleDispatcher(
|
||||||
|
$collector ==> {},
|
||||||
|
shape(
|
||||||
|
'routeParser' => \FastRoute\RouteParser\Std::class,
|
||||||
|
'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class,
|
||||||
|
'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class,
|
||||||
|
'routeCollector' => \FastRoute\RouteCollector::class,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function all_options_cached(): \FastRoute\Dispatcher {
|
||||||
|
return \FastRoute\cachedDispatcher(
|
||||||
|
$collector ==> {},
|
||||||
|
shape(
|
||||||
|
'routeParser' => \FastRoute\RouteParser\Std::class,
|
||||||
|
'dataGenerator' => \FastRoute\DataGenerator\GroupCountBased::class,
|
||||||
|
'dispatcher' => \FastRoute\Dispatcher\GroupCountBased::class,
|
||||||
|
'routeCollector' => \FastRoute\RouteCollector::class,
|
||||||
|
'cacheFile' => '/dev/null',
|
||||||
|
'cacheDisabled' => false,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
11
rest/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php
vendored
Normal file
11
rest/vendor/nikic/fast-route/test/HackTypechecker/fixtures/empty_options.php
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?hh
|
||||||
|
|
||||||
|
namespace FastRoute\TestFixtures;
|
||||||
|
|
||||||
|
function empty_options_simple(): \FastRoute\Dispatcher {
|
||||||
|
return \FastRoute\simpleDispatcher($collector ==> {}, shape());
|
||||||
|
}
|
||||||
|
|
||||||
|
function empty_options_cached(): \FastRoute\Dispatcher {
|
||||||
|
return \FastRoute\cachedDispatcher($collector ==> {}, shape());
|
||||||
|
}
|
11
rest/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php
vendored
Normal file
11
rest/vendor/nikic/fast-route/test/HackTypechecker/fixtures/no_options.php
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?hh
|
||||||
|
|
||||||
|
namespace FastRoute\TestFixtures;
|
||||||
|
|
||||||
|
function no_options_simple(): \FastRoute\Dispatcher {
|
||||||
|
return \FastRoute\simpleDispatcher($collector ==> {});
|
||||||
|
}
|
||||||
|
|
||||||
|
function no_options_cached(): \FastRoute\Dispatcher {
|
||||||
|
return \FastRoute\cachedDispatcher($collector ==> {});
|
||||||
|
}
|
108
rest/vendor/nikic/fast-route/test/RouteCollectorTest.php
vendored
Normal file
108
rest/vendor/nikic/fast-route/test/RouteCollectorTest.php
vendored
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class RouteCollectorTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testShortcuts()
|
||||||
|
{
|
||||||
|
$r = new DummyRouteCollector();
|
||||||
|
|
||||||
|
$r->delete('/delete', 'delete');
|
||||||
|
$r->get('/get', 'get');
|
||||||
|
$r->head('/head', 'head');
|
||||||
|
$r->patch('/patch', 'patch');
|
||||||
|
$r->post('/post', 'post');
|
||||||
|
$r->put('/put', 'put');
|
||||||
|
|
||||||
|
$expected = [
|
||||||
|
['DELETE', '/delete', 'delete'],
|
||||||
|
['GET', '/get', 'get'],
|
||||||
|
['HEAD', '/head', 'head'],
|
||||||
|
['PATCH', '/patch', 'patch'],
|
||||||
|
['POST', '/post', 'post'],
|
||||||
|
['PUT', '/put', 'put'],
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->assertSame($expected, $r->routes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGroups()
|
||||||
|
{
|
||||||
|
$r = new DummyRouteCollector();
|
||||||
|
|
||||||
|
$r->delete('/delete', 'delete');
|
||||||
|
$r->get('/get', 'get');
|
||||||
|
$r->head('/head', 'head');
|
||||||
|
$r->patch('/patch', 'patch');
|
||||||
|
$r->post('/post', 'post');
|
||||||
|
$r->put('/put', 'put');
|
||||||
|
|
||||||
|
$r->addGroup('/group-one', function (DummyRouteCollector $r) {
|
||||||
|
$r->delete('/delete', 'delete');
|
||||||
|
$r->get('/get', 'get');
|
||||||
|
$r->head('/head', 'head');
|
||||||
|
$r->patch('/patch', 'patch');
|
||||||
|
$r->post('/post', 'post');
|
||||||
|
$r->put('/put', 'put');
|
||||||
|
|
||||||
|
$r->addGroup('/group-two', function (DummyRouteCollector $r) {
|
||||||
|
$r->delete('/delete', 'delete');
|
||||||
|
$r->get('/get', 'get');
|
||||||
|
$r->head('/head', 'head');
|
||||||
|
$r->patch('/patch', 'patch');
|
||||||
|
$r->post('/post', 'post');
|
||||||
|
$r->put('/put', 'put');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$r->addGroup('/admin', function (DummyRouteCollector $r) {
|
||||||
|
$r->get('-some-info', 'admin-some-info');
|
||||||
|
});
|
||||||
|
$r->addGroup('/admin-', function (DummyRouteCollector $r) {
|
||||||
|
$r->get('more-info', 'admin-more-info');
|
||||||
|
});
|
||||||
|
|
||||||
|
$expected = [
|
||||||
|
['DELETE', '/delete', 'delete'],
|
||||||
|
['GET', '/get', 'get'],
|
||||||
|
['HEAD', '/head', 'head'],
|
||||||
|
['PATCH', '/patch', 'patch'],
|
||||||
|
['POST', '/post', 'post'],
|
||||||
|
['PUT', '/put', 'put'],
|
||||||
|
['DELETE', '/group-one/delete', 'delete'],
|
||||||
|
['GET', '/group-one/get', 'get'],
|
||||||
|
['HEAD', '/group-one/head', 'head'],
|
||||||
|
['PATCH', '/group-one/patch', 'patch'],
|
||||||
|
['POST', '/group-one/post', 'post'],
|
||||||
|
['PUT', '/group-one/put', 'put'],
|
||||||
|
['DELETE', '/group-one/group-two/delete', 'delete'],
|
||||||
|
['GET', '/group-one/group-two/get', 'get'],
|
||||||
|
['HEAD', '/group-one/group-two/head', 'head'],
|
||||||
|
['PATCH', '/group-one/group-two/patch', 'patch'],
|
||||||
|
['POST', '/group-one/group-two/post', 'post'],
|
||||||
|
['PUT', '/group-one/group-two/put', 'put'],
|
||||||
|
['GET', '/admin-some-info', 'admin-some-info'],
|
||||||
|
['GET', '/admin-more-info', 'admin-more-info'],
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->assertSame($expected, $r->routes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class DummyRouteCollector extends RouteCollector
|
||||||
|
{
|
||||||
|
public $routes = [];
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addRoute($method, $route, $handler)
|
||||||
|
{
|
||||||
|
$route = $this->currentGroupPrefix . $route;
|
||||||
|
$this->routes[] = [$method, $route, $handler];
|
||||||
|
}
|
||||||
|
}
|
154
rest/vendor/nikic/fast-route/test/RouteParser/StdTest.php
vendored
Normal file
154
rest/vendor/nikic/fast-route/test/RouteParser/StdTest.php
vendored
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace FastRoute\RouteParser;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class StdTest extends TestCase
|
||||||
|
{
|
||||||
|
/** @dataProvider provideTestParse */
|
||||||
|
public function testParse($routeString, $expectedRouteDatas)
|
||||||
|
{
|
||||||
|
$parser = new Std();
|
||||||
|
$routeDatas = $parser->parse($routeString);
|
||||||
|
$this->assertSame($expectedRouteDatas, $routeDatas);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @dataProvider provideTestParseError */
|
||||||
|
public function testParseError($routeString, $expectedExceptionMessage)
|
||||||
|
{
|
||||||
|
$parser = new Std();
|
||||||
|
$this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage);
|
||||||
|
$parser->parse($routeString);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideTestParse()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
'/test',
|
||||||
|
[
|
||||||
|
['/test'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test/{param}',
|
||||||
|
[
|
||||||
|
['/test/', ['param', '[^/]+']],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/te{ param }st',
|
||||||
|
[
|
||||||
|
['/te', ['param', '[^/]+'], 'st']
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test/{param1}/test2/{param2}',
|
||||||
|
[
|
||||||
|
['/test/', ['param1', '[^/]+'], '/test2/', ['param2', '[^/]+']]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test/{param:\d+}',
|
||||||
|
[
|
||||||
|
['/test/', ['param', '\d+']]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test/{ param : \d{1,9} }',
|
||||||
|
[
|
||||||
|
['/test/', ['param', '\d{1,9}']]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test[opt]',
|
||||||
|
[
|
||||||
|
['/test'],
|
||||||
|
['/testopt'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test[/{param}]',
|
||||||
|
[
|
||||||
|
['/test'],
|
||||||
|
['/test/', ['param', '[^/]+']],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/{param}[opt]',
|
||||||
|
[
|
||||||
|
['/', ['param', '[^/]+']],
|
||||||
|
['/', ['param', '[^/]+'], 'opt']
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test[/{name}[/{id:[0-9]+}]]',
|
||||||
|
[
|
||||||
|
['/test'],
|
||||||
|
['/test/', ['name', '[^/]+']],
|
||||||
|
['/test/', ['name', '[^/]+'], '/', ['id', '[0-9]+']],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'',
|
||||||
|
[
|
||||||
|
[''],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'[test]',
|
||||||
|
[
|
||||||
|
[''],
|
||||||
|
['test'],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/{foo-bar}',
|
||||||
|
[
|
||||||
|
['/', ['foo-bar', '[^/]+']]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/{_foo:.*}',
|
||||||
|
[
|
||||||
|
['/', ['_foo', '.*']]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function provideTestParseError()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[
|
||||||
|
'/test[opt',
|
||||||
|
"Number of opening '[' and closing ']' does not match"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test[opt[opt2]',
|
||||||
|
"Number of opening '[' and closing ']' does not match"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/testopt]',
|
||||||
|
"Number of opening '[' and closing ']' does not match"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test[]',
|
||||||
|
'Empty optional part'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test[[opt]]',
|
||||||
|
'Empty optional part'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'[[test]]',
|
||||||
|
'Empty optional part'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'/test[/opt]/required',
|
||||||
|
'Optional segments can only occur at the end of a route'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
11
rest/vendor/nikic/fast-route/test/bootstrap.php
vendored
Normal file
11
rest/vendor/nikic/fast-route/test/bootstrap.php
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../src/functions.php';
|
||||||
|
|
||||||
|
spl_autoload_register(function ($class) {
|
||||||
|
if (strpos($class, 'FastRoute\\') === 0) {
|
||||||
|
$dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/';
|
||||||
|
$name = substr($class, strlen('FastRoute'));
|
||||||
|
require __DIR__ . '/../' . $dir . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php';
|
||||||
|
}
|
||||||
|
});
|
3
rest/vendor/pimple/pimple/.gitignore
vendored
Normal file
3
rest/vendor/pimple/pimple/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
phpunit.xml
|
||||||
|
composer.lock
|
||||||
|
/vendor/
|
40
rest/vendor/pimple/pimple/.travis.yml
vendored
Normal file
40
rest/vendor/pimple/pimple/.travis.yml
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
language: php
|
||||||
|
|
||||||
|
env:
|
||||||
|
matrix:
|
||||||
|
- PIMPLE_EXT=no
|
||||||
|
- PIMPLE_EXT=yes
|
||||||
|
global:
|
||||||
|
- REPORT_EXIT_STATUS=1
|
||||||
|
|
||||||
|
php:
|
||||||
|
- 5.3
|
||||||
|
- 5.4
|
||||||
|
- 5.5
|
||||||
|
- 5.6
|
||||||
|
- 7.0
|
||||||
|
- 7.1
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- composer self-update
|
||||||
|
- COMPOSER_ROOT_VERSION=dev-master composer install
|
||||||
|
- if [ "$PIMPLE_EXT" == "yes" ]; then sh -c "cd ext/pimple && phpize && ./configure && make && sudo make install"; fi
|
||||||
|
- if [ "$PIMPLE_EXT" == "yes" ]; then echo "extension=pimple.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; fi
|
||||||
|
|
||||||
|
script:
|
||||||
|
- cd ext/pimple
|
||||||
|
- if [ "$PIMPLE_EXT" == "yes" ]; then yes n | make test | tee output ; grep -E 'Tests failed +. +0' output; fi
|
||||||
|
- if [ "$PIMPLE_EXT" == "yes" ]; then export SYMFONY_DEPRECATIONS_HELPER=weak; fi
|
||||||
|
- cd ../..
|
||||||
|
- ./vendor/bin/simple-phpunit
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- php: hhvm
|
||||||
|
dist: trusty
|
||||||
|
env: PIMPLE_EXT=no
|
||||||
|
exclude:
|
||||||
|
- php: 7.0
|
||||||
|
env: PIMPLE_EXT=yes
|
||||||
|
- php: 7.1
|
||||||
|
env: PIMPLE_EXT=yes
|
59
rest/vendor/pimple/pimple/CHANGELOG
vendored
Normal file
59
rest/vendor/pimple/pimple/CHANGELOG
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
* 3.2.3 (2017-XX-XX)
|
||||||
|
|
||||||
|
* n/a
|
||||||
|
|
||||||
|
* 3.2.2 (2017-07-23)
|
||||||
|
|
||||||
|
* reverted extending a protected closure throws an exception (deprecated it instead)
|
||||||
|
|
||||||
|
* 3.2.1 (2017-07-17)
|
||||||
|
|
||||||
|
* fixed PHP error
|
||||||
|
|
||||||
|
* 3.2.0 (2017-07-17)
|
||||||
|
|
||||||
|
* added a PSR-11 service locator
|
||||||
|
* added a PSR-11 wrapper
|
||||||
|
* added ServiceIterator
|
||||||
|
* fixed extending a protected closure (now throws InvalidServiceIdentifierException)
|
||||||
|
|
||||||
|
* 3.1.0 (2017-07-03)
|
||||||
|
|
||||||
|
* deprecated the C extension
|
||||||
|
* added support for PSR-11 exceptions
|
||||||
|
|
||||||
|
* 3.0.2 (2015-09-11)
|
||||||
|
|
||||||
|
* refactored the C extension
|
||||||
|
* minor non-significant changes
|
||||||
|
|
||||||
|
* 3.0.1 (2015-07-30)
|
||||||
|
|
||||||
|
* simplified some code
|
||||||
|
* fixed a segfault in the C extension
|
||||||
|
|
||||||
|
* 3.0.0 (2014-07-24)
|
||||||
|
|
||||||
|
* removed the Pimple class alias (use Pimple\Container instead)
|
||||||
|
|
||||||
|
* 2.1.1 (2014-07-24)
|
||||||
|
|
||||||
|
* fixed compiler warnings for the C extension
|
||||||
|
* fixed code when dealing with circular references
|
||||||
|
|
||||||
|
* 2.1.0 (2014-06-24)
|
||||||
|
|
||||||
|
* moved the Pimple to Pimple\Container (with a BC layer -- Pimple is now a
|
||||||
|
deprecated alias which will be removed in Pimple 3.0)
|
||||||
|
* added Pimple\ServiceProviderInterface (and Pimple::register())
|
||||||
|
|
||||||
|
* 2.0.0 (2014-02-10)
|
||||||
|
|
||||||
|
* changed extend to automatically re-assign the extended service and keep it as shared or factory
|
||||||
|
(to keep BC, extend still returns the extended service)
|
||||||
|
* changed services to be shared by default (use factory() for factory
|
||||||
|
services)
|
||||||
|
|
||||||
|
* 1.0.0
|
||||||
|
|
||||||
|
* initial version
|
19
rest/vendor/pimple/pimple/LICENSE
vendored
Normal file
19
rest/vendor/pimple/pimple/LICENSE
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Copyright (c) 2009-2017 Fabien Potencier
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is furnished
|
||||||
|
to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
326
rest/vendor/pimple/pimple/README.rst
vendored
Normal file
326
rest/vendor/pimple/pimple/README.rst
vendored
Normal file
@ -0,0 +1,326 @@
|
|||||||
|
Pimple
|
||||||
|
======
|
||||||
|
|
||||||
|
.. caution::
|
||||||
|
|
||||||
|
This is the documentation for Pimple 3.x. If you are using Pimple 1.x, read
|
||||||
|
the `Pimple 1.x documentation`_. Reading the Pimple 1.x code is also a good
|
||||||
|
way to learn more about how to create a simple Dependency Injection
|
||||||
|
Container (recent versions of Pimple are more focused on performance).
|
||||||
|
|
||||||
|
Pimple is a small Dependency Injection Container for PHP.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
Before using Pimple in your project, add it to your ``composer.json`` file:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
$ ./composer.phar require pimple/pimple "^3.0"
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
Creating a container is a matter of creating a ``Container`` instance:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
use Pimple\Container;
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
|
||||||
|
As many other dependency injection containers, Pimple manages two different
|
||||||
|
kind of data: **services** and **parameters**.
|
||||||
|
|
||||||
|
Defining Services
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
A service is an object that does something as part of a larger system. Examples
|
||||||
|
of services: a database connection, a templating engine, or a mailer. Almost
|
||||||
|
any **global** object can be a service.
|
||||||
|
|
||||||
|
Services are defined by **anonymous functions** that return an instance of an
|
||||||
|
object:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
// define some services
|
||||||
|
$container['session_storage'] = function ($c) {
|
||||||
|
return new SessionStorage('SESSION_ID');
|
||||||
|
};
|
||||||
|
|
||||||
|
$container['session'] = function ($c) {
|
||||||
|
return new Session($c['session_storage']);
|
||||||
|
};
|
||||||
|
|
||||||
|
Notice that the anonymous function has access to the current container
|
||||||
|
instance, allowing references to other services or parameters.
|
||||||
|
|
||||||
|
As objects are only created when you get them, the order of the definitions
|
||||||
|
does not matter.
|
||||||
|
|
||||||
|
Using the defined services is also very easy:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
// get the session object
|
||||||
|
$session = $container['session'];
|
||||||
|
|
||||||
|
// the above call is roughly equivalent to the following code:
|
||||||
|
// $storage = new SessionStorage('SESSION_ID');
|
||||||
|
// $session = new Session($storage);
|
||||||
|
|
||||||
|
Defining Factory Services
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
By default, each time you get a service, Pimple returns the **same instance**
|
||||||
|
of it. If you want a different instance to be returned for all calls, wrap your
|
||||||
|
anonymous function with the ``factory()`` method
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
$container['session'] = $container->factory(function ($c) {
|
||||||
|
return new Session($c['session_storage']);
|
||||||
|
});
|
||||||
|
|
||||||
|
Now, each call to ``$container['session']`` returns a new instance of the
|
||||||
|
session.
|
||||||
|
|
||||||
|
Defining Parameters
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Defining a parameter allows to ease the configuration of your container from
|
||||||
|
the outside and to store global values:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
// define some parameters
|
||||||
|
$container['cookie_name'] = 'SESSION_ID';
|
||||||
|
$container['session_storage_class'] = 'SessionStorage';
|
||||||
|
|
||||||
|
If you change the ``session_storage`` service definition like below:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
$container['session_storage'] = function ($c) {
|
||||||
|
return new $c['session_storage_class']($c['cookie_name']);
|
||||||
|
};
|
||||||
|
|
||||||
|
You can now easily change the cookie name by overriding the
|
||||||
|
``cookie_name`` parameter instead of redefining the service
|
||||||
|
definition.
|
||||||
|
|
||||||
|
Protecting Parameters
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Because Pimple sees anonymous functions as service definitions, you need to
|
||||||
|
wrap anonymous functions with the ``protect()`` method to store them as
|
||||||
|
parameters:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
$container['random_func'] = $container->protect(function () {
|
||||||
|
return rand();
|
||||||
|
});
|
||||||
|
|
||||||
|
Modifying Services after Definition
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
In some cases you may want to modify a service definition after it has been
|
||||||
|
defined. You can use the ``extend()`` method to define additional code to be
|
||||||
|
run on your service just after it is created:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
$container['session_storage'] = function ($c) {
|
||||||
|
return new $c['session_storage_class']($c['cookie_name']);
|
||||||
|
};
|
||||||
|
|
||||||
|
$container->extend('session_storage', function ($storage, $c) {
|
||||||
|
$storage->...();
|
||||||
|
|
||||||
|
return $storage;
|
||||||
|
});
|
||||||
|
|
||||||
|
The first argument is the name of the service to extend, the second a function
|
||||||
|
that gets access to the object instance and the container.
|
||||||
|
|
||||||
|
Extending a Container
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
If you use the same libraries over and over, you might want to reuse some
|
||||||
|
services from one project to the next one; package your services into a
|
||||||
|
**provider** by implementing ``Pimple\ServiceProviderInterface``:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
use Pimple\Container;
|
||||||
|
|
||||||
|
class FooProvider implements Pimple\ServiceProviderInterface
|
||||||
|
{
|
||||||
|
public function register(Container $pimple)
|
||||||
|
{
|
||||||
|
// register some services and parameters
|
||||||
|
// on $pimple
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Then, register the provider on a Container:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
$pimple->register(new FooProvider());
|
||||||
|
|
||||||
|
Fetching the Service Creation Function
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
When you access an object, Pimple automatically calls the anonymous function
|
||||||
|
that you defined, which creates the service object for you. If you want to get
|
||||||
|
raw access to this function, you can use the ``raw()`` method:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
$container['session'] = function ($c) {
|
||||||
|
return new Session($c['session_storage']);
|
||||||
|
};
|
||||||
|
|
||||||
|
$sessionFunction = $container->raw('session');
|
||||||
|
|
||||||
|
PSR-11 compatibility
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
For historical reasons, the ``Container`` class does not implement the PSR-11
|
||||||
|
``ContainerInterface``. However, Pimple provides a helper class that will let
|
||||||
|
you decouple your code from the Pimple container class.
|
||||||
|
|
||||||
|
The PSR-11 container class
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The ``Pimple\Psr11\Container`` class lets you access the content of an
|
||||||
|
underlying Pimple container using ``Psr\Container\ContainerInterface``
|
||||||
|
methods:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
use Pimple\Container;
|
||||||
|
use Pimple\Psr11\Container as PsrContainer;
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
$container['service'] = function ($c) {
|
||||||
|
return new Service();
|
||||||
|
};
|
||||||
|
$psr11 = new PsrContainer($container);
|
||||||
|
|
||||||
|
$controller = function (PsrContainer $container) {
|
||||||
|
$service = $container->get('service');
|
||||||
|
};
|
||||||
|
$controller($psr11);
|
||||||
|
|
||||||
|
Using the PSR-11 ServiceLocator
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Sometimes, a service needs access to several other services without being sure
|
||||||
|
that all of them will actually be used. In those cases, you may want the
|
||||||
|
instantiation of the services to be lazy.
|
||||||
|
|
||||||
|
The traditional solution is to inject the entire service container to get only
|
||||||
|
the services really needed. However, this is not recommended because it gives
|
||||||
|
services a too broad access to the rest of the application and it hides their
|
||||||
|
actual dependencies.
|
||||||
|
|
||||||
|
The ``ServiceLocator`` is intended to solve this problem by giving access to a
|
||||||
|
set of predefined services while instantiating them only when actually needed.
|
||||||
|
|
||||||
|
It also allows you to make your services available under a different name than
|
||||||
|
the one used to register them. For instance, you may want to use an object
|
||||||
|
that expects an instance of ``EventDispatcherInterface`` to be available under
|
||||||
|
the name ``event_dispatcher`` while your event dispatcher has been
|
||||||
|
registered under the name ``dispatcher``:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
use Monolog\Logger;
|
||||||
|
use Pimple\Psr11\ServiceLocator;
|
||||||
|
use Psr\Container\ContainerInterface;
|
||||||
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||||
|
|
||||||
|
class MyService
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* "logger" must be an instance of Psr\Log\LoggerInterface
|
||||||
|
* "event_dispatcher" must be an instance of Symfony\Component\EventDispatcher\EventDispatcherInterface
|
||||||
|
*/
|
||||||
|
private $services;
|
||||||
|
|
||||||
|
public function __construct(ContainerInterface $services)
|
||||||
|
{
|
||||||
|
$this->services = $services;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$container['logger'] = function ($c) {
|
||||||
|
return new Monolog\Logger();
|
||||||
|
};
|
||||||
|
$container['dispatcher'] = function () {
|
||||||
|
return new EventDispatcher();
|
||||||
|
};
|
||||||
|
|
||||||
|
$container['service'] = function ($c) {
|
||||||
|
$locator = new ServiceLocator($c, array('logger', 'event_dispatcher' => 'dispatcher'));
|
||||||
|
|
||||||
|
return new MyService($locator);
|
||||||
|
};
|
||||||
|
|
||||||
|
Referencing a Collection of Services Lazily
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Passing a collection of services instances in an array may prove inefficient
|
||||||
|
if the class that consumes the collection only needs to iterate over it at a
|
||||||
|
later stage, when one of its method is called. It can also lead to problems
|
||||||
|
if there is a circular dependency between one of the services stored in the
|
||||||
|
collection and the class that consumes it.
|
||||||
|
|
||||||
|
The ``ServiceIterator`` class helps you solve these issues. It receives a
|
||||||
|
list of service names during instantiation and will retrieve the services
|
||||||
|
when iterated over:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
use Pimple\Container;
|
||||||
|
use Pimple\ServiceIterator;
|
||||||
|
|
||||||
|
class AuthorizationService
|
||||||
|
{
|
||||||
|
private $voters;
|
||||||
|
|
||||||
|
public function __construct($voters)
|
||||||
|
{
|
||||||
|
$this->voters = $voters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function canAccess($resource)
|
||||||
|
{
|
||||||
|
foreach ($this->voters as $voter) {
|
||||||
|
if (true === $voter->canAccess($resource) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
|
||||||
|
$container['voter1'] = function ($c) {
|
||||||
|
return new SomeVoter();
|
||||||
|
}
|
||||||
|
$container['voter2'] = function ($c) {
|
||||||
|
return new SomeOtherVoter($c['auth']);
|
||||||
|
}
|
||||||
|
$container['auth'] = function ($c) {
|
||||||
|
return new AuthorizationService(new ServiceIterator($c, array('voter1', 'voter2'));
|
||||||
|
}
|
||||||
|
|
||||||
|
.. _Pimple 1.x documentation: https://github.com/silexphp/Pimple/tree/1.1
|
29
rest/vendor/pimple/pimple/composer.json
vendored
Normal file
29
rest/vendor/pimple/pimple/composer.json
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"name": "pimple/pimple",
|
||||||
|
"type": "library",
|
||||||
|
"description": "Pimple, a simple Dependency Injection Container",
|
||||||
|
"keywords": ["dependency injection", "container"],
|
||||||
|
"homepage": "http://pimple.sensiolabs.org",
|
||||||
|
"license": "MIT",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.0",
|
||||||
|
"psr/container": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "^3.2"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": { "Pimple": "src/" }
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "3.2.x-dev"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
30
rest/vendor/pimple/pimple/ext/pimple/.gitignore
vendored
Normal file
30
rest/vendor/pimple/pimple/ext/pimple/.gitignore
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
*.sw*
|
||||||
|
.deps
|
||||||
|
Makefile
|
||||||
|
Makefile.fragments
|
||||||
|
Makefile.global
|
||||||
|
Makefile.objects
|
||||||
|
acinclude.m4
|
||||||
|
aclocal.m4
|
||||||
|
build/
|
||||||
|
config.cache
|
||||||
|
config.guess
|
||||||
|
config.h
|
||||||
|
config.h.in
|
||||||
|
config.log
|
||||||
|
config.nice
|
||||||
|
config.status
|
||||||
|
config.sub
|
||||||
|
configure
|
||||||
|
configure.in
|
||||||
|
install-sh
|
||||||
|
libtool
|
||||||
|
ltmain.sh
|
||||||
|
missing
|
||||||
|
mkinstalldirs
|
||||||
|
run-tests.php
|
||||||
|
*.loT
|
||||||
|
.libs/
|
||||||
|
modules/
|
||||||
|
*.la
|
||||||
|
*.lo
|
12
rest/vendor/pimple/pimple/ext/pimple/README.md
vendored
Normal file
12
rest/vendor/pimple/pimple/ext/pimple/README.md
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
This is Pimple 2 implemented in C
|
||||||
|
|
||||||
|
* PHP >= 5.3
|
||||||
|
* Not tested under Windows, might work
|
||||||
|
|
||||||
|
Install
|
||||||
|
=======
|
||||||
|
|
||||||
|
> phpize
|
||||||
|
> ./configure
|
||||||
|
> make
|
||||||
|
> make install
|
63
rest/vendor/pimple/pimple/ext/pimple/config.m4
vendored
Normal file
63
rest/vendor/pimple/pimple/ext/pimple/config.m4
vendored
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
dnl $Id$
|
||||||
|
dnl config.m4 for extension pimple
|
||||||
|
|
||||||
|
dnl Comments in this file start with the string 'dnl'.
|
||||||
|
dnl Remove where necessary. This file will not work
|
||||||
|
dnl without editing.
|
||||||
|
|
||||||
|
dnl If your extension references something external, use with:
|
||||||
|
|
||||||
|
dnl PHP_ARG_WITH(pimple, for pimple support,
|
||||||
|
dnl Make sure that the comment is aligned:
|
||||||
|
dnl [ --with-pimple Include pimple support])
|
||||||
|
|
||||||
|
dnl Otherwise use enable:
|
||||||
|
|
||||||
|
PHP_ARG_ENABLE(pimple, whether to enable pimple support,
|
||||||
|
dnl Make sure that the comment is aligned:
|
||||||
|
[ --enable-pimple Enable pimple support])
|
||||||
|
|
||||||
|
if test "$PHP_PIMPLE" != "no"; then
|
||||||
|
dnl Write more examples of tests here...
|
||||||
|
|
||||||
|
dnl # --with-pimple -> check with-path
|
||||||
|
dnl SEARCH_PATH="/usr/local /usr" # you might want to change this
|
||||||
|
dnl SEARCH_FOR="/include/pimple.h" # you most likely want to change this
|
||||||
|
dnl if test -r $PHP_PIMPLE/$SEARCH_FOR; then # path given as parameter
|
||||||
|
dnl PIMPLE_DIR=$PHP_PIMPLE
|
||||||
|
dnl else # search default path list
|
||||||
|
dnl AC_MSG_CHECKING([for pimple files in default path])
|
||||||
|
dnl for i in $SEARCH_PATH ; do
|
||||||
|
dnl if test -r $i/$SEARCH_FOR; then
|
||||||
|
dnl PIMPLE_DIR=$i
|
||||||
|
dnl AC_MSG_RESULT(found in $i)
|
||||||
|
dnl fi
|
||||||
|
dnl done
|
||||||
|
dnl fi
|
||||||
|
dnl
|
||||||
|
dnl if test -z "$PIMPLE_DIR"; then
|
||||||
|
dnl AC_MSG_RESULT([not found])
|
||||||
|
dnl AC_MSG_ERROR([Please reinstall the pimple distribution])
|
||||||
|
dnl fi
|
||||||
|
|
||||||
|
dnl # --with-pimple -> add include path
|
||||||
|
dnl PHP_ADD_INCLUDE($PIMPLE_DIR/include)
|
||||||
|
|
||||||
|
dnl # --with-pimple -> check for lib and symbol presence
|
||||||
|
dnl LIBNAME=pimple # you may want to change this
|
||||||
|
dnl LIBSYMBOL=pimple # you most likely want to change this
|
||||||
|
|
||||||
|
dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
|
||||||
|
dnl [
|
||||||
|
dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $PIMPLE_DIR/lib, PIMPLE_SHARED_LIBADD)
|
||||||
|
dnl AC_DEFINE(HAVE_PIMPLELIB,1,[ ])
|
||||||
|
dnl ],[
|
||||||
|
dnl AC_MSG_ERROR([wrong pimple lib version or lib not found])
|
||||||
|
dnl ],[
|
||||||
|
dnl -L$PIMPLE_DIR/lib -lm
|
||||||
|
dnl ])
|
||||||
|
dnl
|
||||||
|
dnl PHP_SUBST(PIMPLE_SHARED_LIBADD)
|
||||||
|
|
||||||
|
PHP_NEW_EXTENSION(pimple, pimple.c, $ext_shared)
|
||||||
|
fi
|
13
rest/vendor/pimple/pimple/ext/pimple/config.w32
vendored
Normal file
13
rest/vendor/pimple/pimple/ext/pimple/config.w32
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// $Id$
|
||||||
|
// vim:ft=javascript
|
||||||
|
|
||||||
|
// If your extension references something external, use ARG_WITH
|
||||||
|
// ARG_WITH("pimple", "for pimple support", "no");
|
||||||
|
|
||||||
|
// Otherwise, use ARG_ENABLE
|
||||||
|
// ARG_ENABLE("pimple", "enable pimple support", "no");
|
||||||
|
|
||||||
|
if (PHP_PIMPLE != "no") {
|
||||||
|
EXTENSION("pimple", "pimple.c");
|
||||||
|
}
|
||||||
|
|
137
rest/vendor/pimple/pimple/ext/pimple/php_pimple.h
vendored
Normal file
137
rest/vendor/pimple/pimple/ext/pimple/php_pimple.h
vendored
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Pimple.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Fabien Potencier
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is furnished
|
||||||
|
* to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PHP_PIMPLE_H
|
||||||
|
#define PHP_PIMPLE_H
|
||||||
|
|
||||||
|
extern zend_module_entry pimple_module_entry;
|
||||||
|
#define phpext_pimple_ptr &pimple_module_entry
|
||||||
|
|
||||||
|
#ifdef PHP_WIN32
|
||||||
|
# define PHP_PIMPLE_API __declspec(dllexport)
|
||||||
|
#elif defined(__GNUC__) && __GNUC__ >= 4
|
||||||
|
# define PHP_PIMPLE_API __attribute__ ((visibility("default")))
|
||||||
|
#else
|
||||||
|
# define PHP_PIMPLE_API
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ZTS
|
||||||
|
#include "TSRM.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PIMPLE_VERSION "3.2.3-DEV"
|
||||||
|
|
||||||
|
#define PIMPLE_NS "Pimple"
|
||||||
|
#define PSR_CONTAINER_NS "Psr\\Container"
|
||||||
|
#define PIMPLE_EXCEPTION_NS "Pimple\\Exception"
|
||||||
|
|
||||||
|
#define PIMPLE_DEFAULT_ZVAL_CACHE_NUM 5
|
||||||
|
#define PIMPLE_DEFAULT_ZVAL_VALUES_NUM 10
|
||||||
|
|
||||||
|
#define PIMPLE_DEPRECATE do { \
|
||||||
|
int er = EG(error_reporting); \
|
||||||
|
EG(error_reporting) = 0;\
|
||||||
|
php_error(E_DEPRECATED, "The Pimple C extension is deprecated since version 3.1 and will be removed in 4.0."); \
|
||||||
|
EG(error_reporting) = er; \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
zend_module_entry *get_module(void);
|
||||||
|
|
||||||
|
PHP_MINIT_FUNCTION(pimple);
|
||||||
|
PHP_MINFO_FUNCTION(pimple);
|
||||||
|
|
||||||
|
PHP_METHOD(FrozenServiceException, __construct);
|
||||||
|
PHP_METHOD(InvalidServiceIdentifierException, __construct);
|
||||||
|
PHP_METHOD(UnknownIdentifierException, __construct);
|
||||||
|
|
||||||
|
PHP_METHOD(Pimple, __construct);
|
||||||
|
PHP_METHOD(Pimple, factory);
|
||||||
|
PHP_METHOD(Pimple, protect);
|
||||||
|
PHP_METHOD(Pimple, raw);
|
||||||
|
PHP_METHOD(Pimple, extend);
|
||||||
|
PHP_METHOD(Pimple, keys);
|
||||||
|
PHP_METHOD(Pimple, register);
|
||||||
|
PHP_METHOD(Pimple, offsetSet);
|
||||||
|
PHP_METHOD(Pimple, offsetUnset);
|
||||||
|
PHP_METHOD(Pimple, offsetGet);
|
||||||
|
PHP_METHOD(Pimple, offsetExists);
|
||||||
|
|
||||||
|
PHP_METHOD(PimpleClosure, invoker);
|
||||||
|
|
||||||
|
typedef struct _pimple_bucket_value {
|
||||||
|
zval *value; /* Must be the first element */
|
||||||
|
zval *raw;
|
||||||
|
zend_object_handle handle_num;
|
||||||
|
enum {
|
||||||
|
PIMPLE_IS_PARAM = 0,
|
||||||
|
PIMPLE_IS_SERVICE = 2
|
||||||
|
} type;
|
||||||
|
zend_bool initialized;
|
||||||
|
zend_fcall_info_cache fcc;
|
||||||
|
} pimple_bucket_value;
|
||||||
|
|
||||||
|
typedef struct _pimple_object {
|
||||||
|
zend_object zobj;
|
||||||
|
HashTable values;
|
||||||
|
HashTable factories;
|
||||||
|
HashTable protected;
|
||||||
|
} pimple_object;
|
||||||
|
|
||||||
|
typedef struct _pimple_closure_object {
|
||||||
|
zend_object zobj;
|
||||||
|
zval *callable;
|
||||||
|
zval *factory;
|
||||||
|
} pimple_closure_object;
|
||||||
|
|
||||||
|
static const char sensiolabs_logo[] = "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHYAAAAUCAMAAABvRTlyAAAAz1BMVEUAAAAAAAAAAAAsThWB5j4AAACD6T8AAACC6D+C6D6C6D+C6D4AAAAAAACC6D4AAAAAAACC6D8AAAAAAAAAAAAAAAAAAAAAAACC6D4AAAAAAAAAAACC6D4AAAAAAAAAAAAAAAAAAAAAAACC6D8AAACC6D4AAAAAAAAAAAAAAAAAAACC6D8AAACC6D6C6D+B6D+C6D+C6D+C6D8AAACC6D6C6D4AAACC6D/K/2KC6D+B6D6C6D6C6D+C6D8sTxUyWRhEeiEAAACC6D+C5z6B6D7drnEVAAAAQXRSTlMAE3oCNSUuDHFHzxaF9UFsu+irX+zlKzYimaJXktyOSFD6BolxqT7QGMMdarMIpuO28r9EolXKgR16OphfXYd4V14GtB4AAAMpSURBVEjHvVSJctowEF1jjME2RziMwUCoMfd9heZqG4n//6buLpJjkmYm03byZmxJa2nf6u2uQcG2bfhqRN4LoTKBzyGDm68M7mAwcOEdjo4zhA/Rf9Go/CVtTgiRhXfIC3EDH8F/eUX1/9KexRo+QgOdtHDsEe/sM7QT32/+K61Z1LFXcXJxN4pTbu1aTQUzuy2PIA0rDo0/0Aa5XFaJvKaVTrubywXvaa1Wq4Vu/Snr3Y7Aojh4VccwykW2N2oQ8wmjyut6+Q1t5ywIG5Npj1sh5E0B7YOzFDjfuRfaOh3O+MbbVNfTWS9COZk3Obd2su5d0a6IU9KLREbw8gEehWSr1r2sPWciXLG38r5NdW0xu9eioU87omjC9yNaMi5GNf6WppVSOqXCFkmCvMB3p9SROLoYQn5pDgQOujA1xjYvqH+plUdkwnmII8VxR/PKYkrfLLomhVlE3b/LhNbNr7hp0H2JaOc4v8dFB58HSsFTSafaqtY1sT3GO8wsy5rhokYPlRJdjPMajyYqTt1EHF/2uqSWQWmAjCUSmQ1MS3g8Btf1XOsy7YIC0CB1b5Xw1Vhba0zbxiCAQLH9TNPmHJXQUtJAN0KcDsoqLxsNvJrJExa7mKIdp2lRE2WexiS4pqWk/0jROlw6K6bV9YOBDGAuqMJ0bnuUKGB0L27bxgRhGEbzihbhxxXaQC88Vkwq8ldCi86RApWUb0Q+4VDosBCc+1s81lUdnBavH4Zp2mm3O44USwOfvSo9oBiwpFg71lMS1VKJLKljS3j9p+fOTvXXlsSNuEv6YPaZda9uRope0VJfKdo7fPiYfSmvFjXQbkhY0d9hCbBWIktRgEDieDhf1N3wbbkmNNgRy8hyl620yGQat/grV3HMpc2HDKTVmOPFz6ylPCKt/nXcAyV260jaAowwIW0YuBzrOgb/KrddZS9OmJaLgpWK4JX2DDuklcLZSDGcn8Vmx9YDNvT6UsjyBApRyFQVX7Vxm9TGxE16nmfRd8/zQoDmggQOTRh5Hv8pMt9Q/L2JmSwkMCE7dA4BuDjHJwfu0Om4QAhOjrN5XkIatglfiN/bUPdCQFjTYgAAAABJRU5ErkJggg==\">";
|
||||||
|
|
||||||
|
static void pimple_exception_call_parent_constructor(zval *this_ptr, const char *format, const char *arg1 TSRMLS_DC);
|
||||||
|
|
||||||
|
static int pimple_zval_to_pimpleval(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC);
|
||||||
|
static int pimple_zval_is_valid_callback(zval *_zval, pimple_bucket_value *_pimple_bucket_value TSRMLS_DC);
|
||||||
|
|
||||||
|
static void pimple_bucket_dtor(pimple_bucket_value *bucket);
|
||||||
|
static void pimple_free_bucket(pimple_bucket_value *bucket);
|
||||||
|
|
||||||
|
static zval *pimple_object_read_dimension(zval *object, zval *offset, int type TSRMLS_DC);
|
||||||
|
static void pimple_object_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC);
|
||||||
|
static int pimple_object_has_dimension(zval *object, zval *offset, int check_empty TSRMLS_DC);
|
||||||
|
static void pimple_object_unset_dimension(zval *object, zval *offset TSRMLS_DC);
|
||||||
|
static zend_object_value pimple_object_create(zend_class_entry *ce TSRMLS_DC);
|
||||||
|
static void pimple_free_object_storage(pimple_object *obj TSRMLS_DC);
|
||||||
|
|
||||||
|
static void pimple_closure_free_object_storage(pimple_closure_object *obj TSRMLS_DC);
|
||||||
|
static zend_object_value pimple_closure_object_create(zend_class_entry *ce TSRMLS_DC);
|
||||||
|
static zend_function *pimple_closure_get_constructor(zval * TSRMLS_DC);
|
||||||
|
static int pimple_closure_get_closure(zval *obj, zend_class_entry **ce_ptr, union _zend_function **fptr_ptr, zval **zobj_ptr TSRMLS_DC);
|
||||||
|
|
||||||
|
#ifdef ZTS
|
||||||
|
#define PIMPLE_G(v) TSRMG(pimple_globals_id, zend_pimple_globals *, v)
|
||||||
|
#else
|
||||||
|
#define PIMPLE_G(v) (pimple_globals.v)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PHP_PIMPLE_H */
|
||||||
|
|
1114
rest/vendor/pimple/pimple/ext/pimple/pimple.c
vendored
Normal file
1114
rest/vendor/pimple/pimple/ext/pimple/pimple.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
81
rest/vendor/pimple/pimple/ext/pimple/pimple_compat.h
vendored
Normal file
81
rest/vendor/pimple/pimple/ext/pimple/pimple_compat.h
vendored
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Pimple.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Fabien Potencier
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is furnished
|
||||||
|
* to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PIMPLE_COMPAT_H_
|
||||||
|
#define PIMPLE_COMPAT_H_
|
||||||
|
|
||||||
|
#include "Zend/zend_extensions.h" /* for ZEND_EXTENSION_API_NO */
|
||||||
|
|
||||||
|
#define PHP_5_0_X_API_NO 220040412
|
||||||
|
#define PHP_5_1_X_API_NO 220051025
|
||||||
|
#define PHP_5_2_X_API_NO 220060519
|
||||||
|
#define PHP_5_3_X_API_NO 220090626
|
||||||
|
#define PHP_5_4_X_API_NO 220100525
|
||||||
|
#define PHP_5_5_X_API_NO 220121212
|
||||||
|
#define PHP_5_6_X_API_NO 220131226
|
||||||
|
|
||||||
|
#define IS_PHP_56 ZEND_EXTENSION_API_NO == PHP_5_6_X_API_NO
|
||||||
|
#define IS_AT_LEAST_PHP_56 ZEND_EXTENSION_API_NO >= PHP_5_6_X_API_NO
|
||||||
|
|
||||||
|
#define IS_PHP_55 ZEND_EXTENSION_API_NO == PHP_5_5_X_API_NO
|
||||||
|
#define IS_AT_LEAST_PHP_55 ZEND_EXTENSION_API_NO >= PHP_5_5_X_API_NO
|
||||||
|
|
||||||
|
#define IS_PHP_54 ZEND_EXTENSION_API_NO == PHP_5_4_X_API_NO
|
||||||
|
#define IS_AT_LEAST_PHP_54 ZEND_EXTENSION_API_NO >= PHP_5_4_X_API_NO
|
||||||
|
|
||||||
|
#define IS_PHP_53 ZEND_EXTENSION_API_NO == PHP_5_3_X_API_NO
|
||||||
|
#define IS_AT_LEAST_PHP_53 ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
|
||||||
|
|
||||||
|
#if IS_PHP_53
|
||||||
|
#define object_properties_init(obj, ce) do { \
|
||||||
|
zend_hash_copy(obj->properties, &ce->default_properties, zval_copy_property_ctor(ce), NULL, sizeof(zval *)); \
|
||||||
|
} while (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ZEND_OBJ_INIT(obj, ce) do { \
|
||||||
|
zend_object_std_init(obj, ce TSRMLS_CC); \
|
||||||
|
object_properties_init((obj), (ce)); \
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
#if IS_PHP_53 || IS_PHP_54
|
||||||
|
static void zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, HashPosition *pos) {
|
||||||
|
Bucket *p;
|
||||||
|
|
||||||
|
p = pos ? (*pos) : ht->pInternalPointer;
|
||||||
|
|
||||||
|
if (!p) {
|
||||||
|
Z_TYPE_P(key) = IS_NULL;
|
||||||
|
} else if (p->nKeyLength) {
|
||||||
|
Z_TYPE_P(key) = IS_STRING;
|
||||||
|
Z_STRVAL_P(key) = estrndup(p->arKey, p->nKeyLength - 1);
|
||||||
|
Z_STRLEN_P(key) = p->nKeyLength - 1;
|
||||||
|
} else {
|
||||||
|
Z_TYPE_P(key) = IS_LONG;
|
||||||
|
Z_LVAL_P(key) = p->h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PIMPLE_COMPAT_H_ */
|
45
rest/vendor/pimple/pimple/ext/pimple/tests/001.phpt
vendored
Normal file
45
rest/vendor/pimple/pimple/ext/pimple/tests/001.phpt
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
--TEST--
|
||||||
|
Test for read_dim/write_dim handlers
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$p[42] = 'foo';
|
||||||
|
$p['foo'] = 42;
|
||||||
|
|
||||||
|
echo $p[42];
|
||||||
|
echo "\n";
|
||||||
|
echo $p['foo'];
|
||||||
|
echo "\n";
|
||||||
|
try {
|
||||||
|
var_dump($p['nonexistant']);
|
||||||
|
echo "Exception excpected";
|
||||||
|
} catch (InvalidArgumentException $e) { }
|
||||||
|
|
||||||
|
$p[54.2] = 'foo2';
|
||||||
|
echo $p[54];
|
||||||
|
echo "\n";
|
||||||
|
$p[242.99] = 'foo99';
|
||||||
|
echo $p[242];
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
|
||||||
|
$p[5] = 'bar';
|
||||||
|
$p[5] = 'baz';
|
||||||
|
echo $p[5];
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
|
||||||
|
$p['str'] = 'str';
|
||||||
|
$p['str'] = 'strstr';
|
||||||
|
echo $p['str'];
|
||||||
|
?>
|
||||||
|
|
||||||
|
--EXPECTF--
|
||||||
|
foo
|
||||||
|
42
|
||||||
|
foo2
|
||||||
|
foo99
|
||||||
|
baz
|
||||||
|
strstr
|
15
rest/vendor/pimple/pimple/ext/pimple/tests/002.phpt
vendored
Normal file
15
rest/vendor/pimple/pimple/ext/pimple/tests/002.phpt
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
--TEST--
|
||||||
|
Test for constructor
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
var_dump($p[42]);
|
||||||
|
|
||||||
|
$p = new Pimple\Container(array(42=>'foo'));
|
||||||
|
var_dump($p[42]);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
NULL
|
||||||
|
string(3) "foo"
|
16
rest/vendor/pimple/pimple/ext/pimple/tests/003.phpt
vendored
Normal file
16
rest/vendor/pimple/pimple/ext/pimple/tests/003.phpt
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
--TEST--
|
||||||
|
Test empty dimensions
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$p[] = 42;
|
||||||
|
var_dump($p[0]);
|
||||||
|
$p[41] = 'foo';
|
||||||
|
$p[] = 'bar';
|
||||||
|
var_dump($p[42]);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
int(42)
|
||||||
|
string(3) "bar"
|
30
rest/vendor/pimple/pimple/ext/pimple/tests/004.phpt
vendored
Normal file
30
rest/vendor/pimple/pimple/ext/pimple/tests/004.phpt
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
--TEST--
|
||||||
|
Test has/unset dim handlers
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$p[] = 42;
|
||||||
|
var_dump($p[0]);
|
||||||
|
unset($p[0]);
|
||||||
|
var_dump($p[0]);
|
||||||
|
$p['foo'] = 'bar';
|
||||||
|
var_dump(isset($p['foo']));
|
||||||
|
unset($p['foo']);
|
||||||
|
try {
|
||||||
|
var_dump($p['foo']);
|
||||||
|
echo "Excpected exception";
|
||||||
|
} catch (InvalidArgumentException $e) { }
|
||||||
|
var_dump(isset($p['bar']));
|
||||||
|
$p['bar'] = NULL;
|
||||||
|
var_dump(isset($p['bar']));
|
||||||
|
var_dump(empty($p['bar']));
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
int(42)
|
||||||
|
NULL
|
||||||
|
bool(true)
|
||||||
|
bool(false)
|
||||||
|
bool(true)
|
||||||
|
bool(true)
|
27
rest/vendor/pimple/pimple/ext/pimple/tests/005.phpt
vendored
Normal file
27
rest/vendor/pimple/pimple/ext/pimple/tests/005.phpt
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
--TEST--
|
||||||
|
Test simple class inheritance
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class MyPimple extends Pimple\Container
|
||||||
|
{
|
||||||
|
public $someAttr = 'fooAttr';
|
||||||
|
|
||||||
|
public function offsetget($o)
|
||||||
|
{
|
||||||
|
var_dump("hit");
|
||||||
|
return parent::offsetget($o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$p = new MyPimple;
|
||||||
|
$p[42] = 'foo';
|
||||||
|
echo $p[42];
|
||||||
|
echo "\n";
|
||||||
|
echo $p->someAttr;
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
string(3) "hit"
|
||||||
|
foo
|
||||||
|
fooAttr
|
51
rest/vendor/pimple/pimple/ext/pimple/tests/006.phpt
vendored
Normal file
51
rest/vendor/pimple/pimple/ext/pimple/tests/006.phpt
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
--TEST--
|
||||||
|
Test complex class inheritance
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class MyPimple extends Pimple\Container
|
||||||
|
{
|
||||||
|
public function offsetget($o)
|
||||||
|
{
|
||||||
|
var_dump("hit offsetget in " . __CLASS__);
|
||||||
|
return parent::offsetget($o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestPimple extends MyPimple
|
||||||
|
{
|
||||||
|
public function __construct($values)
|
||||||
|
{
|
||||||
|
array_shift($values);
|
||||||
|
parent::__construct($values);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function offsetget($o)
|
||||||
|
{
|
||||||
|
var_dump('hit offsetget in ' . __CLASS__);
|
||||||
|
return parent::offsetget($o);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function offsetset($o, $v)
|
||||||
|
{
|
||||||
|
var_dump('hit offsetset');
|
||||||
|
return parent::offsetset($o, $v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$defaultValues = array('foo' => 'bar', 88 => 'baz');
|
||||||
|
|
||||||
|
$p = new TestPimple($defaultValues);
|
||||||
|
$p[42] = 'foo';
|
||||||
|
var_dump($p[42]);
|
||||||
|
var_dump($p[0]);
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
string(13) "hit offsetset"
|
||||||
|
string(27) "hit offsetget in TestPimple"
|
||||||
|
string(25) "hit offsetget in MyPimple"
|
||||||
|
string(3) "foo"
|
||||||
|
string(27) "hit offsetget in TestPimple"
|
||||||
|
string(25) "hit offsetget in MyPimple"
|
||||||
|
string(3) "baz"
|
22
rest/vendor/pimple/pimple/ext/pimple/tests/007.phpt
vendored
Normal file
22
rest/vendor/pimple/pimple/ext/pimple/tests/007.phpt
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
--TEST--
|
||||||
|
Test for read_dim/write_dim handlers
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$p[42] = 'foo';
|
||||||
|
$p['foo'] = 42;
|
||||||
|
|
||||||
|
echo $p[42];
|
||||||
|
echo "\n";
|
||||||
|
echo $p['foo'];
|
||||||
|
echo "\n";
|
||||||
|
try {
|
||||||
|
var_dump($p['nonexistant']);
|
||||||
|
echo "Exception excpected";
|
||||||
|
} catch (InvalidArgumentException $e) { }
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
foo
|
||||||
|
42
|
29
rest/vendor/pimple/pimple/ext/pimple/tests/008.phpt
vendored
Normal file
29
rest/vendor/pimple/pimple/ext/pimple/tests/008.phpt
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
--TEST--
|
||||||
|
Test frozen services
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$p[42] = 'foo';
|
||||||
|
$p[42] = 'bar';
|
||||||
|
|
||||||
|
$p['foo'] = function () { };
|
||||||
|
$p['foo'] = function () { };
|
||||||
|
|
||||||
|
$a = $p['foo'];
|
||||||
|
|
||||||
|
try {
|
||||||
|
$p['foo'] = function () { };
|
||||||
|
echo "Exception excpected";
|
||||||
|
} catch (RuntimeException $e) { }
|
||||||
|
|
||||||
|
$p[42] = function() { };
|
||||||
|
$a = $p[42];
|
||||||
|
|
||||||
|
try {
|
||||||
|
$p[42] = function () { };
|
||||||
|
echo "Exception excpected";
|
||||||
|
} catch (RuntimeException $e) { }
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
13
rest/vendor/pimple/pimple/ext/pimple/tests/009.phpt
vendored
Normal file
13
rest/vendor/pimple/pimple/ext/pimple/tests/009.phpt
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
--TEST--
|
||||||
|
Test service is called as callback, and only once
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$p['foo'] = function($arg) use ($p) { var_dump($p === $arg); };
|
||||||
|
$a = $p['foo'];
|
||||||
|
$b = $p['foo']; /* should return not calling the callback */
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
bool(true)
|
45
rest/vendor/pimple/pimple/ext/pimple/tests/010.phpt
vendored
Normal file
45
rest/vendor/pimple/pimple/ext/pimple/tests/010.phpt
vendored
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
--TEST--
|
||||||
|
Test service is called as callback for every callback type
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
function callme()
|
||||||
|
{
|
||||||
|
return 'called';
|
||||||
|
}
|
||||||
|
|
||||||
|
$a = function() { return 'called'; };
|
||||||
|
|
||||||
|
class Foo
|
||||||
|
{
|
||||||
|
public static function bar()
|
||||||
|
{
|
||||||
|
return 'called';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$p['foo'] = 'callme';
|
||||||
|
echo $p['foo'] . "\n";
|
||||||
|
|
||||||
|
$p['bar'] = $a;
|
||||||
|
echo $p['bar'] . "\n";
|
||||||
|
|
||||||
|
$p['baz'] = "Foo::bar";
|
||||||
|
echo $p['baz'] . "\n";
|
||||||
|
|
||||||
|
$p['foobar'] = array('Foo', 'bar');
|
||||||
|
var_dump($p['foobar']);
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
callme
|
||||||
|
called
|
||||||
|
Foo::bar
|
||||||
|
array(2) {
|
||||||
|
[0]=>
|
||||||
|
string(3) "Foo"
|
||||||
|
[1]=>
|
||||||
|
string(3) "bar"
|
||||||
|
}
|
19
rest/vendor/pimple/pimple/ext/pimple/tests/011.phpt
vendored
Normal file
19
rest/vendor/pimple/pimple/ext/pimple/tests/011.phpt
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
--TEST--
|
||||||
|
Test service callback throwing an exception
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class CallBackException extends RuntimeException { }
|
||||||
|
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$p['foo'] = function () { throw new CallBackException; };
|
||||||
|
try {
|
||||||
|
echo $p['foo'] . "\n";
|
||||||
|
echo "should not come here";
|
||||||
|
} catch (CallBackException $e) {
|
||||||
|
echo "all right!";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
all right!
|
28
rest/vendor/pimple/pimple/ext/pimple/tests/012.phpt
vendored
Normal file
28
rest/vendor/pimple/pimple/ext/pimple/tests/012.phpt
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
--TEST--
|
||||||
|
Test service factory
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
|
||||||
|
$p->factory($f = function() { var_dump('called-1'); return 'ret-1';});
|
||||||
|
|
||||||
|
$p[] = $f;
|
||||||
|
|
||||||
|
$p[] = function () { var_dump('called-2'); return 'ret-2'; };
|
||||||
|
|
||||||
|
var_dump($p[0]);
|
||||||
|
var_dump($p[0]);
|
||||||
|
var_dump($p[1]);
|
||||||
|
var_dump($p[1]);
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
string(8) "called-1"
|
||||||
|
string(5) "ret-1"
|
||||||
|
string(8) "called-1"
|
||||||
|
string(5) "ret-1"
|
||||||
|
string(8) "called-2"
|
||||||
|
string(5) "ret-2"
|
||||||
|
string(5) "ret-2"
|
33
rest/vendor/pimple/pimple/ext/pimple/tests/013.phpt
vendored
Normal file
33
rest/vendor/pimple/pimple/ext/pimple/tests/013.phpt
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
--TEST--
|
||||||
|
Test keys()
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
|
||||||
|
var_dump($p->keys());
|
||||||
|
|
||||||
|
$p['foo'] = 'bar';
|
||||||
|
$p[] = 'foo';
|
||||||
|
|
||||||
|
var_dump($p->keys());
|
||||||
|
|
||||||
|
unset($p['foo']);
|
||||||
|
|
||||||
|
var_dump($p->keys());
|
||||||
|
?>
|
||||||
|
--EXPECTF--
|
||||||
|
array(0) {
|
||||||
|
}
|
||||||
|
array(2) {
|
||||||
|
[0]=>
|
||||||
|
string(3) "foo"
|
||||||
|
[1]=>
|
||||||
|
int(0)
|
||||||
|
}
|
||||||
|
array(1) {
|
||||||
|
[0]=>
|
||||||
|
int(0)
|
||||||
|
}
|
30
rest/vendor/pimple/pimple/ext/pimple/tests/014.phpt
vendored
Normal file
30
rest/vendor/pimple/pimple/ext/pimple/tests/014.phpt
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
--TEST--
|
||||||
|
Test raw()
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$f = function () { var_dump('called-2'); return 'ret-2'; };
|
||||||
|
|
||||||
|
$p['foo'] = $f;
|
||||||
|
$p[42] = $f;
|
||||||
|
|
||||||
|
var_dump($p['foo']);
|
||||||
|
var_dump($p->raw('foo'));
|
||||||
|
var_dump($p[42]);
|
||||||
|
|
||||||
|
unset($p['foo']);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$p->raw('foo');
|
||||||
|
echo "expected exception";
|
||||||
|
} catch (InvalidArgumentException $e) { }
|
||||||
|
--EXPECTF--
|
||||||
|
string(8) "called-2"
|
||||||
|
string(5) "ret-2"
|
||||||
|
object(Closure)#%i (0) {
|
||||||
|
}
|
||||||
|
string(8) "called-2"
|
||||||
|
string(5) "ret-2"
|
17
rest/vendor/pimple/pimple/ext/pimple/tests/015.phpt
vendored
Normal file
17
rest/vendor/pimple/pimple/ext/pimple/tests/015.phpt
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
--TEST--
|
||||||
|
Test protect()
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$f = function () { return 'foo'; };
|
||||||
|
$p['foo'] = $f;
|
||||||
|
|
||||||
|
$p->protect($f);
|
||||||
|
|
||||||
|
var_dump($p['foo']);
|
||||||
|
--EXPECTF--
|
||||||
|
object(Closure)#%i (0) {
|
||||||
|
}
|
24
rest/vendor/pimple/pimple/ext/pimple/tests/016.phpt
vendored
Normal file
24
rest/vendor/pimple/pimple/ext/pimple/tests/016.phpt
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
--TEST--
|
||||||
|
Test extend()
|
||||||
|
--SKIPIF--
|
||||||
|
<?php if (!extension_loaded("pimple")) print "skip"; ?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
This is part of Pimple::extend() code :
|
||||||
|
|
||||||
|
$extended = function ($c) use ($callable, $factory) {
|
||||||
|
return $callable($factory($c), $c);
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
|
$p = new Pimple\Container();
|
||||||
|
$p[12] = function ($v) { var_dump($v); return 'foo';}; /* $factory in code above */
|
||||||
|
|
||||||
|
$c = $p->extend(12, function ($w) { var_dump($w); return 'bar'; }); /* $callable in code above */
|
||||||
|
|
||||||
|
var_dump($c('param'));
|
||||||
|
--EXPECTF--
|
||||||
|
string(5) "param"
|
||||||
|
string(3) "foo"
|
||||||
|
string(3) "bar"
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user