PK CUTK8%
LICENSE.mdnu ٘ Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC.
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.
- Neither the name of Laminas Foundation nor the names of its contributors may
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.
PK CUTF[ [ COPYRIGHT.mdnu ٘ Copyright (c) 2020 Laminas Project a Series of LF Projects, LLC. (https://getlaminas.org/)
PK CUT=H H .laminas-ci.jsonnu ٘ {
"ignore_php_platform_requirements": {
"8.1": true
}
}
PK CUTx= = .coveralls.ymlnu ٘ coverage_clover: clover.xml
json_path: coveralls-upload.json
PK CUT?FC FC
composer.locknu ٘ {
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d1d8e7f5c6c58431100bf2ff5d7a2d2b",
"packages": [
{
"name": "brick/varexporter",
"version": "0.3.5",
"source": {
"type": "git",
"url": "https://github.com/brick/varexporter.git",
"reference": "05241f28dfcba2b51b11e2d750e296316ebbe518"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brick/varexporter/zipball/05241f28dfcba2b51b11e2d750e296316ebbe518",
"reference": "05241f28dfcba2b51b11e2d750e296316ebbe518",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.0",
"php": "^7.2 || ^8.0"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
"phpunit/phpunit": "^8.5 || ^9.0",
"vimeo/psalm": "4.4.1"
},
"type": "library",
"autoload": {
"psr-4": {
"Brick\\VarExporter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "A powerful alternative to var_export(), which can export closures and objects without __set_state()",
"keywords": [
"var_export"
],
"support": {
"issues": "https://github.com/brick/varexporter/issues",
"source": "https://github.com/brick/varexporter/tree/0.3.5"
},
"time": "2021-02-10T13:53:07+00:00"
},
{
"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",
"support": {
"issues": "https://github.com/container-interop/container-interop/issues",
"source": "https://github.com/container-interop/container-interop/tree/master"
},
"abandoned": "psr/container",
"time": "2017-02-14T19:40:03+00:00"
},
{
"name": "laminas/laminas-config",
"version": "3.7.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-config.git",
"reference": "e43d13dcfc273d4392812eb395ce636f73f34dfd"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-config/zipball/e43d13dcfc273d4392812eb395ce636f73f34dfd",
"reference": "e43d13dcfc273d4392812eb395ce636f73f34dfd",
"shasum": ""
},
"require": {
"ext-json": "*",
"laminas/laminas-stdlib": "^3.6",
"php": "^7.3 || ~8.0.0 || ~8.1.0",
"psr/container": "^1.0"
},
"conflict": {
"container-interop/container-interop": "<1.2.0",
"zendframework/zend-config": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~1.0.0",
"laminas/laminas-filter": "^2.7.2",
"laminas/laminas-i18n": "^2.10.3",
"laminas/laminas-servicemanager": "^3.7",
"phpunit/phpunit": "^9.5.5"
},
"suggest": {
"laminas/laminas-filter": "^2.7.2; install if you want to use the Filter processor",
"laminas/laminas-i18n": "^2.7.4; install if you want to use the Translator processor",
"laminas/laminas-servicemanager": "^2.7.8 || ^3.3; if you need an extensible plugin manager for use with the Config Factory"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Config\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "provides a nested object property based user interface for accessing this configuration data within application code",
"homepage": "https://laminas.dev",
"keywords": [
"config",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-config/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-config/issues",
"rss": "https://github.com/laminas/laminas-config/releases.atom",
"source": "https://github.com/laminas/laminas-config"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-10-01T16:07:46+00:00"
},
{
"name": "laminas/laminas-escaper",
"version": "2.9.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-escaper.git",
"reference": "891ad70986729e20ed2e86355fcf93c9dc238a5f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/891ad70986729e20ed2e86355fcf93c9dc238a5f",
"reference": "891ad70986729e20ed2e86355fcf93c9dc238a5f",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"zendframework/zend-escaper": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.3.0",
"phpunit/phpunit": "^9.3",
"psalm/plugin-phpunit": "^0.12.2",
"vimeo/psalm": "^3.16"
},
"suggest": {
"ext-iconv": "*",
"ext-mbstring": "*"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Escaper\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs",
"homepage": "https://laminas.dev",
"keywords": [
"escaper",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-escaper/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-escaper/issues",
"rss": "https://github.com/laminas/laminas-escaper/releases.atom",
"source": "https://github.com/laminas/laminas-escaper"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-02T17:10:53+00:00"
},
{
"name": "laminas/laminas-eventmanager",
"version": "3.4.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-eventmanager.git",
"reference": "a93fd278c97b2d41ebbce5ba048a24e3e6f580ba"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/a93fd278c97b2d41ebbce5ba048a24e3e6f580ba",
"reference": "a93fd278c97b2d41ebbce5ba048a24e3e6f580ba",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"zendframework/zend-eventmanager": "*"
},
"require-dev": {
"container-interop/container-interop": "^1.1",
"laminas/laminas-coding-standard": "~2.2.1",
"laminas/laminas-stdlib": "^3.6",
"phpbench/phpbench": "^1.1",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5.5"
},
"suggest": {
"container-interop/container-interop": "^1.1, to use the lazy listeners feature",
"laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\EventManager\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Trigger and listen to events within a PHP application",
"homepage": "https://laminas.dev",
"keywords": [
"event",
"eventmanager",
"events",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-eventmanager/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-eventmanager/issues",
"rss": "https://github.com/laminas/laminas-eventmanager/releases.atom",
"source": "https://github.com/laminas/laminas-eventmanager"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-07T22:35:32+00:00"
},
{
"name": "laminas/laminas-http",
"version": "2.15.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-http.git",
"reference": "e1f3420ab35e21ea135913d213b8d570e5e7b513"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-http/zipball/e1f3420ab35e21ea135913d213b8d570e5e7b513",
"reference": "e1f3420ab35e21ea135913d213b8d570e5e7b513",
"shasum": ""
},
"require": {
"laminas/laminas-loader": "^2.8",
"laminas/laminas-stdlib": "^3.6",
"laminas/laminas-uri": "^2.9.1",
"laminas/laminas-validator": "^2.15",
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"zendframework/zend-http": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.2.1",
"phpunit/phpunit": "^9.5.5"
},
"suggest": {
"paragonie/certainty": "For automated management of cacert.pem"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Http\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests",
"homepage": "https://laminas.dev",
"keywords": [
"http",
"http client",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-http/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-http/issues",
"rss": "https://github.com/laminas/laminas-http/releases.atom",
"source": "https://github.com/laminas/laminas-http"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-10T10:45:31+00:00"
},
{
"name": "laminas/laminas-json",
"version": "3.3.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-json.git",
"reference": "9a0ce9f330b7d11e70c4acb44d67e8c4f03f437f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-json/zipball/9a0ce9f330b7d11e70c4acb44d67e8c4f03f437f",
"reference": "9a0ce9f330b7d11e70c4acb44d67e8c4f03f437f",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"zendframework/zend-json": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.2.1",
"laminas/laminas-stdlib": "^2.7.7 || ^3.1",
"phpunit/phpunit": "^9.3"
},
"suggest": {
"laminas/laminas-json-server": "For implementing JSON-RPC servers",
"laminas/laminas-xml2json": "For converting XML documents to JSON"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Json\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP",
"homepage": "https://laminas.dev",
"keywords": [
"json",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-json/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-json/issues",
"rss": "https://github.com/laminas/laminas-json/releases.atom",
"source": "https://github.com/laminas/laminas-json"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-02T18:02:31+00:00"
},
{
"name": "laminas/laminas-loader",
"version": "2.8.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-loader.git",
"reference": "d0589ec9dd48365fd95ad10d1c906efd7711c16b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-loader/zipball/d0589ec9dd48365fd95ad10d1c906efd7711c16b",
"reference": "d0589ec9dd48365fd95ad10d1c906efd7711c16b",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"zendframework/zend-loader": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.2.1",
"phpunit/phpunit": "^9.3"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Loader\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Autoloading and plugin loading strategies",
"homepage": "https://laminas.dev",
"keywords": [
"laminas",
"loader"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-loader/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-loader/issues",
"rss": "https://github.com/laminas/laminas-loader/releases.atom",
"source": "https://github.com/laminas/laminas-loader"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-02T18:30:53+00:00"
},
{
"name": "laminas/laminas-modulemanager",
"version": "2.11.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-modulemanager.git",
"reference": "6acf5991d10b0b38a2edb08729ed48981b2a5dad"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-modulemanager/zipball/6acf5991d10b0b38a2edb08729ed48981b2a5dad",
"reference": "6acf5991d10b0b38a2edb08729ed48981b2a5dad",
"shasum": ""
},
"require": {
"brick/varexporter": "^0.3.2",
"laminas/laminas-config": "^3.7",
"laminas/laminas-eventmanager": "^3.4",
"laminas/laminas-stdlib": "^3.6",
"php": "^7.3 || ~8.0.0 || ~8.1.0",
"webimpress/safe-writer": "^1.0.2 || ^2.1"
},
"conflict": {
"zendframework/zend-modulemanager": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "^2.3",
"laminas/laminas-loader": "^2.8",
"laminas/laminas-mvc": "^3.1.1",
"laminas/laminas-servicemanager": "^3.7",
"phpunit/phpunit": "^9.5.5"
},
"suggest": {
"laminas/laminas-console": "Laminas\\Console component",
"laminas/laminas-loader": "Laminas\\Loader component if you are not using Composer autoloading for your modules",
"laminas/laminas-mvc": "Laminas\\Mvc component",
"laminas/laminas-servicemanager": "Laminas\\ServiceManager component"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\ModuleManager\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Modular application system for laminas-mvc applications",
"homepage": "https://laminas.dev",
"keywords": [
"laminas",
"modulemanager"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-modulemanager/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-modulemanager/issues",
"rss": "https://github.com/laminas/laminas-modulemanager/releases.atom",
"source": "https://github.com/laminas/laminas-modulemanager"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-10-13T17:05:17+00:00"
},
{
"name": "laminas/laminas-router",
"version": "3.5.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-router.git",
"reference": "44759e71620030c93d99e40b394fe9fff8f0beda"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-router/zipball/44759e71620030c93d99e40b394fe9fff8f0beda",
"reference": "44759e71620030c93d99e40b394fe9fff8f0beda",
"shasum": ""
},
"require": {
"container-interop/container-interop": "^1.2",
"laminas/laminas-http": "^2.15",
"laminas/laminas-servicemanager": "^3.7",
"laminas/laminas-stdlib": "^3.6",
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"zendframework/zend-router": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.2.1",
"laminas/laminas-i18n": "^2.7.4",
"phpunit/phpunit": "^9.5.5",
"psalm/plugin-phpunit": "^0.15.1",
"vimeo/psalm": "^4.7"
},
"suggest": {
"laminas/laminas-i18n": "^2.7.4, if defining translatable HTTP path segments"
},
"type": "library",
"extra": {
"laminas": {
"component": "Laminas\\Router",
"config-provider": "Laminas\\Router\\ConfigProvider"
}
},
"autoload": {
"psr-4": {
"Laminas\\Router\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Flexible routing system for HTTP and console applications",
"homepage": "https://laminas.dev",
"keywords": [
"laminas",
"routing"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-router/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-router/issues",
"rss": "https://github.com/laminas/laminas-router/releases.atom",
"source": "https://github.com/laminas/laminas-router"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-10-13T16:02:43+00:00"
},
{
"name": "laminas/laminas-servicemanager",
"version": "3.7.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-servicemanager.git",
"reference": "2b0aee477fdbd3191af7c302b93dbc5fda0626f4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/2b0aee477fdbd3191af7c302b93dbc5fda0626f4",
"reference": "2b0aee477fdbd3191af7c302b93dbc5fda0626f4",
"shasum": ""
},
"require": {
"container-interop/container-interop": "^1.2",
"laminas/laminas-stdlib": "^3.2.1",
"laminas/laminas-zendframework-bridge": "^1.0",
"php": "^7.3 || ~8.0.0",
"psr/container": "^1.0"
},
"conflict": {
"laminas/laminas-code": "<3.3.1",
"zendframework/zend-code": "<3.3.1"
},
"provide": {
"container-interop/container-interop-implementation": "^1.2",
"psr/container-implementation": "^1.0"
},
"replace": {
"zendframework/zend-servicemanager": "^3.4.0"
},
"require-dev": {
"composer/package-versions-deprecated": "^1.0",
"laminas/laminas-coding-standard": "~2.2.0",
"laminas/laminas-container-config-test": "^0.3",
"laminas/laminas-dependency-plugin": "^2.1.2",
"mikey179/vfsstream": "^1.6.8",
"ocramius/proxy-manager": "^2.2.3",
"phpbench/phpbench": "^1.0.4",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.4",
"psalm/plugin-phpunit": "^0.16.1",
"vimeo/psalm": "^4.8"
},
"suggest": {
"ocramius/proxy-manager": "ProxyManager ^2.1.1 to handle lazy initialization of services"
},
"bin": [
"bin/generate-deps-for-config-factory",
"bin/generate-factory-for-class"
],
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\ServiceManager\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Factory-Driven Dependency Injection Container",
"homepage": "https://laminas.dev",
"keywords": [
"PSR-11",
"dependency-injection",
"di",
"dic",
"laminas",
"service-manager",
"servicemanager"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-servicemanager/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-servicemanager/issues",
"rss": "https://github.com/laminas/laminas-servicemanager/releases.atom",
"source": "https://github.com/laminas/laminas-servicemanager"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-07-24T19:33:07+00:00"
},
{
"name": "laminas/laminas-stdlib",
"version": "3.6.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-stdlib.git",
"reference": "c53d8537f108fac3fae652677a19735db730ba46"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/c53d8537f108fac3fae652677a19735db730ba46",
"reference": "c53d8537f108fac3fae652677a19735db730ba46",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"zendframework/zend-stdlib": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.3.0",
"phpbench/phpbench": "^0.17.1",
"phpunit/phpunit": "~9.3.7",
"psalm/plugin-phpunit": "^0.16.0",
"vimeo/psalm": "^4.7"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Stdlib\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "SPL extensions, array utilities, error handlers, and more",
"homepage": "https://laminas.dev",
"keywords": [
"laminas",
"stdlib"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-stdlib/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-stdlib/issues",
"rss": "https://github.com/laminas/laminas-stdlib/releases.atom",
"source": "https://github.com/laminas/laminas-stdlib"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-02T16:11:32+00:00"
},
{
"name": "laminas/laminas-uri",
"version": "2.9.1",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-uri.git",
"reference": "7e837dc15c8fd3949df7d1213246fd7c8640032b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-uri/zipball/7e837dc15c8fd3949df7d1213246fd7c8640032b",
"reference": "7e837dc15c8fd3949df7d1213246fd7c8640032b",
"shasum": ""
},
"require": {
"laminas/laminas-escaper": "^2.9",
"laminas/laminas-validator": "^2.15",
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"zendframework/zend-uri": "*"
},
"require-dev": {
"laminas/laminas-coding-standard": "~2.2.1",
"phpunit/phpunit": "^9.5.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Uri\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "A component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)",
"homepage": "https://laminas.dev",
"keywords": [
"laminas",
"uri"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-uri/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-uri/issues",
"rss": "https://github.com/laminas/laminas-uri/releases.atom",
"source": "https://github.com/laminas/laminas-uri"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-09T18:37:15+00:00"
},
{
"name": "laminas/laminas-validator",
"version": "2.15.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-validator.git",
"reference": "270380e87904f5a1a1fba3059989d4ca157e16a9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-validator/zipball/270380e87904f5a1a1fba3059989d4ca157e16a9",
"reference": "270380e87904f5a1a1fba3059989d4ca157e16a9",
"shasum": ""
},
"require": {
"container-interop/container-interop": "^1.1",
"laminas/laminas-stdlib": "^3.6",
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"zendframework/zend-validator": "*"
},
"require-dev": {
"laminas/laminas-cache": "^2.6.1",
"laminas/laminas-coding-standard": "~2.2.1",
"laminas/laminas-db": "^2.7",
"laminas/laminas-filter": "^2.6",
"laminas/laminas-http": "^2.14.2",
"laminas/laminas-i18n": "^2.6",
"laminas/laminas-math": "^2.6",
"laminas/laminas-servicemanager": "^2.7.11 || ^3.0.3",
"laminas/laminas-session": "^2.8",
"laminas/laminas-uri": "^2.7",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5.5",
"psalm/plugin-phpunit": "^0.15.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0",
"vimeo/psalm": "^4.3"
},
"suggest": {
"laminas/laminas-db": "Laminas\\Db component, required by the (No)RecordExists validator",
"laminas/laminas-filter": "Laminas\\Filter component, required by the Digits validator",
"laminas/laminas-i18n": "Laminas\\I18n component to allow translation of validation error messages",
"laminas/laminas-i18n-resources": "Translations of validator messages",
"laminas/laminas-math": "Laminas\\Math component, required by the Csrf validator",
"laminas/laminas-servicemanager": "Laminas\\ServiceManager component to allow using the ValidatorPluginManager and validator chains",
"laminas/laminas-session": "Laminas\\Session component, ^2.8; required by the Csrf validator",
"laminas/laminas-uri": "Laminas\\Uri component, required by the Uri and Sitemap\\Loc validators",
"psr/http-message": "psr/http-message, required when validating PSR-7 UploadedFileInterface instances via the Upload and UploadFile validators"
},
"type": "library",
"extra": {
"laminas": {
"component": "Laminas\\Validator",
"config-provider": "Laminas\\Validator\\ConfigProvider"
}
},
"autoload": {
"psr-4": {
"Laminas\\Validator\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Validation classes for a wide range of domains, and the ability to chain validators to create complex validation criteria",
"homepage": "https://laminas.dev",
"keywords": [
"laminas",
"validator"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-validator/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-validator/issues",
"rss": "https://github.com/laminas/laminas-validator/releases.atom",
"source": "https://github.com/laminas/laminas-validator"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-08T23:16:56+00:00"
},
{
"name": "laminas/laminas-view",
"version": "2.14.1",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-view.git",
"reference": "164756dbec742379194381d40306cfd28f96028a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-view/zipball/164756dbec742379194381d40306cfd28f96028a",
"reference": "164756dbec742379194381d40306cfd28f96028a",
"shasum": ""
},
"require": {
"laminas/laminas-eventmanager": "^3.4",
"laminas/laminas-json": "^2.6.1 || ^3.3",
"laminas/laminas-stdlib": "^3.6",
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"conflict": {
"laminas/laminas-router": "<3.0.1",
"laminas/laminas-servicemanager": "<3.3",
"zendframework/zend-view": "*"
},
"require-dev": {
"ext-dom": "*",
"laminas/laminas-authentication": "^2.5",
"laminas/laminas-cache": "^2.6.1",
"laminas/laminas-coding-standard": "~1.0.0",
"laminas/laminas-console": "^2.6",
"laminas/laminas-escaper": "^2.5",
"laminas/laminas-feed": "^2.15",
"laminas/laminas-filter": "^2.6.1",
"laminas/laminas-http": "^2.15",
"laminas/laminas-i18n": "^2.6",
"laminas/laminas-modulemanager": "^2.7.1",
"laminas/laminas-mvc": "^2.7.14 || ^3.0",
"laminas/laminas-mvc-i18n": "^1.1",
"laminas/laminas-mvc-plugin-flashmessenger": "^1.2",
"laminas/laminas-navigation": "^2.8.1",
"laminas/laminas-paginator": "^2.5",
"laminas/laminas-permissions-acl": "^2.6",
"laminas/laminas-router": "^3.0.1",
"laminas/laminas-servicemanager": "^3.3",
"laminas/laminas-session": "^2.12",
"laminas/laminas-uri": "^2.5",
"phpspec/prophecy": "^1.12",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5.5",
"psalm/plugin-phpunit": "^0.16.1",
"vimeo/psalm": "^4.10"
},
"suggest": {
"laminas/laminas-authentication": "Laminas\\Authentication component",
"laminas/laminas-escaper": "Laminas\\Escaper component",
"laminas/laminas-feed": "Laminas\\Feed component",
"laminas/laminas-filter": "Laminas\\Filter component",
"laminas/laminas-http": "Laminas\\Http component",
"laminas/laminas-i18n": "Laminas\\I18n component",
"laminas/laminas-mvc": "Laminas\\Mvc component",
"laminas/laminas-mvc-plugin-flashmessenger": "laminas-mvc-plugin-flashmessenger component, if you want to use the FlashMessenger view helper with laminas-mvc versions 3 and up",
"laminas/laminas-navigation": "Laminas\\Navigation component",
"laminas/laminas-paginator": "Laminas\\Paginator component",
"laminas/laminas-permissions-acl": "Laminas\\Permissions\\Acl component",
"laminas/laminas-servicemanager": "Laminas\\ServiceManager component",
"laminas/laminas-uri": "Laminas\\Uri component"
},
"bin": [
"bin/templatemap_generator.php"
],
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\View\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Flexible view layer supporting and providing multiple view layers, helpers, and more",
"homepage": "https://laminas.dev",
"keywords": [
"laminas",
"view"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-view/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-view/issues",
"rss": "https://github.com/laminas/laminas-view/releases.atom",
"source": "https://github.com/laminas/laminas-view"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-10-13T14:21:37+00:00"
},
{
"name": "laminas/laminas-zendframework-bridge",
"version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-zendframework-bridge.git",
"reference": "bf180a382393e7db5c1e8d0f2ec0c4af9c724baf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/bf180a382393e7db5c1e8d0f2ec0c4af9c724baf",
"reference": "bf180a382393e7db5c1e8d0f2ec0c4af9c724baf",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3",
"psalm/plugin-phpunit": "^0.15.1",
"squizlabs/php_codesniffer": "^3.5",
"vimeo/psalm": "^4.6"
},
"type": "library",
"extra": {
"laminas": {
"module": "Laminas\\ZendFrameworkBridge"
}
},
"autoload": {
"files": [
"src/autoload.php"
],
"psr-4": {
"Laminas\\ZendFrameworkBridge\\": "src//"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Alias legacy ZF class names to Laminas Project equivalents.",
"keywords": [
"ZendFramework",
"autoloading",
"laminas",
"zf"
],
"support": {
"forum": "https://discourse.laminas.dev/",
"issues": "https://github.com/laminas/laminas-zendframework-bridge/issues",
"rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom",
"source": "https://github.com/laminas/laminas-zendframework-bridge"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-03T17:53:30+00:00"
},
{
"name": "nikic/php-parser",
"version": "v4.13.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "50953a2691a922aa1769461637869a0a2faa3f53"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53",
"reference": "50953a2691a922aa1769461637869a0a2faa3f53",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": ">=7.0"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
"bin": [
"bin/php-parse"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.9-dev"
}
},
"autoload": {
"psr-4": {
"PhpParser\\": "lib/PhpParser"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Nikita Popov"
}
],
"description": "A PHP parser written in PHP",
"keywords": [
"parser",
"php"
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0"
},
"time": "2021-09-20T12:20:58+00:00"
},
{
"name": "psr/container",
"version": "1.1.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
"reference": "8622567409010282b7aeebe4bb841fe98b58dcaf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf",
"reference": "8622567409010282b7aeebe4bb841fe98b58dcaf",
"shasum": ""
},
"require": {
"php": ">=7.2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Psr\\Container\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common Container Interface (PHP FIG PSR-11)",
"homepage": "https://github.com/php-fig/container",
"keywords": [
"PSR-11",
"container",
"container-interface",
"container-interop",
"psr"
],
"support": {
"issues": "https://github.com/php-fig/container/issues",
"source": "https://github.com/php-fig/container/tree/1.1.1"
},
"time": "2021-03-05T17:36:06+00:00"
},
{
"name": "webimpress/safe-writer",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/webimpress/safe-writer.git",
"reference": "9d37cc8bee20f7cb2f58f6e23e05097eab5072e6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webimpress/safe-writer/zipball/9d37cc8bee20f7cb2f58f6e23e05097eab5072e6",
"reference": "9d37cc8bee20f7cb2f58f6e23e05097eab5072e6",
"shasum": ""
},
"require": {
"php": "^7.3 || ^8.0"
},
"require-dev": {
"phpunit/phpunit": "^9.5.4",
"vimeo/psalm": "^4.7",
"webimpress/coding-standard": "^1.2.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.2.x-dev",
"dev-develop": "2.3.x-dev",
"dev-release-1.0": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Webimpress\\SafeWriter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-2-Clause"
],
"description": "Tool to write files safely, to avoid race conditions",
"keywords": [
"concurrent write",
"file writer",
"race condition",
"safe writer",
"webimpress"
],
"support": {
"issues": "https://github.com/webimpress/safe-writer/issues",
"source": "https://github.com/webimpress/safe-writer/tree/2.2.0"
},
"funding": [
{
"url": "https://github.com/michalbundyra",
"type": "github"
}
],
"time": "2021-04-19T16:34:45+00:00"
}
],
"packages-dev": [
{
"name": "doctrine/instantiator",
"version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^8.0",
"ext-pdo": "*",
"ext-phar": "*",
"phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
"phpstan/phpstan": "^0.12",
"phpstan/phpstan-phpunit": "^0.12",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Marco Pivetta",
"email": "ocramius@gmail.com",
"homepage": "https://ocramius.github.io/"
}
],
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
"homepage": "https://www.doctrine-project.org/projects/instantiator.html",
"keywords": [
"constructor",
"instantiate"
],
"support": {
"issues": "https://github.com/doctrine/instantiator/issues",
"source": "https://github.com/doctrine/instantiator/tree/1.4.0"
},
"funding": [
{
"url": "https://www.doctrine-project.org/sponsorship.html",
"type": "custom"
},
{
"url": "https://www.patreon.com/phpdoctrine",
"type": "patreon"
},
{
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
"type": "tidelift"
}
],
"time": "2020-11-10T18:47:58+00:00"
},
{
"name": "http-interop/http-middleware",
"version": "0.4.1",
"source": {
"type": "git",
"url": "https://github.com/http-interop/http-middleware.git",
"reference": "9a801fe60e70d5d608b61d56b2dcde29516c81b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/http-interop/http-middleware/zipball/9a801fe60e70d5d608b61d56b2dcde29516c81b9",
"reference": "9a801fe60e70d5d608b61d56b2dcde29516c81b9",
"shasum": ""
},
"require": {
"php": ">=5.3.0",
"psr/http-message": "^1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Interop\\Http\\ServerMiddleware\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for HTTP server-side middleware",
"keywords": [
"factory",
"http",
"middleware",
"psr",
"psr-17",
"psr-7",
"request",
"response"
],
"support": {
"issues": "https://github.com/http-interop/http-middleware/issues",
"source": "https://github.com/http-interop/http-middleware/tree/master"
},
"abandoned": "http-interop/http-server-middleware",
"time": "2017-01-14T15:23:42+00:00"
},
{
"name": "laminas/laminas-coding-standard",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-coding-standard.git",
"reference": "08880ce2fbfe62d471cd3cb766a91da630b32539"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-coding-standard/zipball/08880ce2fbfe62d471cd3cb766a91da630b32539",
"reference": "08880ce2fbfe62d471cd3cb766a91da630b32539",
"shasum": ""
},
"require": {
"laminas/laminas-zendframework-bridge": "^1.0",
"squizlabs/php_codesniffer": "^2.7"
},
"replace": {
"zendframework/zend-coding-standard": "self.version"
},
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Laminas coding standard",
"homepage": "https://laminas.dev",
"keywords": [
"Coding Standard",
"laminas"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-coding-standard/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-coding-standard/issues",
"rss": "https://github.com/laminas/laminas-coding-standard/releases.atom",
"source": "https://github.com/laminas/laminas-coding-standard"
},
"time": "2019-12-31T16:28:26+00:00"
},
{
"name": "laminas/laminas-diactoros",
"version": "2.8.0",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-diactoros.git",
"reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/0c26ef1d95b6d7e6e3943a243ba3dc0797227199",
"reference": "0c26ef1d95b6d7e6e3943a243ba3dc0797227199",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0 || ~8.1.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0"
},
"conflict": {
"phpspec/prophecy": "<1.9.0",
"zendframework/zend-diactoros": "*"
},
"provide": {
"psr/http-factory-implementation": "1.0",
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"ext-curl": "*",
"ext-dom": "*",
"ext-gd": "*",
"ext-libxml": "*",
"http-interop/http-factory-tests": "^0.8.0",
"laminas/laminas-coding-standard": "~1.0.0",
"php-http/psr7-integration-tests": "^1.1",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.1",
"psalm/plugin-phpunit": "^0.14.0",
"vimeo/psalm": "^4.3"
},
"type": "library",
"extra": {
"laminas": {
"config-provider": "Laminas\\Diactoros\\ConfigProvider",
"module": "Laminas\\Diactoros"
}
},
"autoload": {
"files": [
"src/functions/create_uploaded_file.php",
"src/functions/marshal_headers_from_sapi.php",
"src/functions/marshal_method_from_sapi.php",
"src/functions/marshal_protocol_version_from_sapi.php",
"src/functions/marshal_uri_from_sapi.php",
"src/functions/normalize_server.php",
"src/functions/normalize_uploaded_files.php",
"src/functions/parse_cookie_header.php",
"src/functions/create_uploaded_file.legacy.php",
"src/functions/marshal_headers_from_sapi.legacy.php",
"src/functions/marshal_method_from_sapi.legacy.php",
"src/functions/marshal_protocol_version_from_sapi.legacy.php",
"src/functions/marshal_uri_from_sapi.legacy.php",
"src/functions/normalize_server.legacy.php",
"src/functions/normalize_uploaded_files.legacy.php",
"src/functions/parse_cookie_header.legacy.php"
],
"psr-4": {
"Laminas\\Diactoros\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "PSR HTTP Message implementations",
"homepage": "https://laminas.dev",
"keywords": [
"http",
"laminas",
"psr",
"psr-17",
"psr-7"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-diactoros/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-diactoros/issues",
"rss": "https://github.com/laminas/laminas-diactoros/releases.atom",
"source": "https://github.com/laminas/laminas-diactoros"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-09-22T03:54:36+00:00"
},
{
"name": "laminas/laminas-psr7bridge",
"version": "1.3.1",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-psr7bridge.git",
"reference": "b1158f0574164039f698a261c01c26119cc6dbd6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-psr7bridge/zipball/b1158f0574164039f698a261c01c26119cc6dbd6",
"reference": "b1158f0574164039f698a261c01c26119cc6dbd6",
"shasum": ""
},
"require": {
"laminas/laminas-diactoros": "^1.7 || ^2.0",
"laminas/laminas-http": "^2.11",
"laminas/laminas-zendframework-bridge": "^1.0",
"php": "^7.3 || ~8.0.0",
"psr/http-message": "^1.0"
},
"conflict": {
"laminas/laminas-stdlib": "< 3.2.1"
},
"replace": {
"zendframework/zend-psr7bridge": "^1.2.0"
},
"require-dev": {
"laminas/laminas-coding-standard": "~1.0.0",
"phpunit/phpunit": "^9.4.1"
},
"type": "library",
"autoload": {
"psr-4": {
"Laminas\\Psr7Bridge\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "PSR-7 <-> laminas-http message conversions",
"homepage": "https://laminas.dev",
"keywords": [
"http",
"laminas",
"psr",
"psr-7"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-psr7bridge/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-psr7bridge/issues",
"rss": "https://github.com/laminas/laminas-psr7bridge/releases.atom",
"source": "https://github.com/laminas/laminas-psr7bridge"
},
"funding": [
{
"url": "https://funding.communitybridge.org/projects/laminas-project",
"type": "community_bridge"
}
],
"time": "2021-04-13T21:03:24+00:00"
},
{
"name": "laminas/laminas-stratigility",
"version": "2.1.1",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-stratigility.git",
"reference": "cf1f56d56fc061128149d70c38cc6ee0beef9d79"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laminas/laminas-stratigility/zipball/cf1f56d56fc061128149d70c38cc6ee0beef9d79",
"reference": "cf1f56d56fc061128149d70c38cc6ee0beef9d79",
"shasum": ""
},
"require": {
"laminas/laminas-escaper": "^2.3",
"laminas/laminas-zendframework-bridge": "^1.0",
"php": "^5.6 || ^7.0",
"psr/http-message": "^1.0",
"webimpress/http-middleware-compatibility": "^0.1.1"
},
"replace": {
"zendframework/zend-stratigility": "self.version"
},
"require-dev": {
"laminas/laminas-coding-standard": "~1.0.0",
"laminas/laminas-diactoros": "^1.0",
"malukenho/docheader": "^0.1.5",
"phpunit/phpunit": "^6.0.8 || ^5.7.15"
},
"suggest": {
"psr/http-message-implementation": "Please install a psr/http-message-implementation to consume Stratigility; e.g., laminas/laminas-diactoros"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.1.0-dev",
"dev-develop": "2.2.0-dev"
}
},
"autoload": {
"psr-4": {
"Laminas\\Stratigility\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"description": "Middleware for PHP",
"homepage": "https://laminas.dev",
"keywords": [
"http",
"laminas",
"middleware",
"psr-7"
],
"support": {
"chat": "https://laminas.dev/chat",
"docs": "https://docs.laminas.dev/laminas-stratigility/",
"forum": "https://discourse.laminas.dev",
"issues": "https://github.com/laminas/laminas-stratigility/issues",
"rss": "https://github.com/laminas/laminas-stratigility/releases.atom",
"source": "https://github.com/laminas/laminas-stratigility"
},
"time": "2019-12-31T17:51:34+00:00"
},
{
"name": "myclabs/deep-copy",
"version": "1.10.2",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"replace": {
"myclabs/deep-copy": "self.version"
},
"require-dev": {
"doctrine/collections": "^1.0",
"doctrine/common": "^2.6",
"phpunit/phpunit": "^7.1"
},
"type": "library",
"autoload": {
"psr-4": {
"DeepCopy\\": "src/DeepCopy/"
},
"files": [
"src/DeepCopy/deep_copy.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Create deep copies (clones) of your objects",
"keywords": [
"clone",
"copy",
"duplicate",
"object",
"object graph"
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
"type": "tidelift"
}
],
"time": "2020-11-13T09:40:50+00:00"
},
{
"name": "phar-io/manifest",
"version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/phar-io/manifest.git",
"reference": "97803eca37d319dfa7826cc2437fc020857acb53"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
"reference": "97803eca37d319dfa7826cc2437fc020857acb53",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-phar": "*",
"ext-xmlwriter": "*",
"phar-io/version": "^3.0.1",
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
},
{
"name": "Sebastian Heuer",
"email": "sebastian@phpeople.de",
"role": "Developer"
},
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "Developer"
}
],
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
"issues": "https://github.com/phar-io/manifest/issues",
"source": "https://github.com/phar-io/manifest/tree/2.0.3"
},
"time": "2021-07-20T11:28:43+00:00"
},
{
"name": "phar-io/version",
"version": "3.1.0",
"source": {
"type": "git",
"url": "https://github.com/phar-io/version.git",
"reference": "bae7c545bef187884426f042434e561ab1ddb182"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
"reference": "bae7c545bef187884426f042434e561ab1ddb182",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
},
{
"name": "Sebastian Heuer",
"email": "sebastian@phpeople.de",
"role": "Developer"
},
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "Developer"
}
],
"description": "Library for handling version information and constraints",
"support": {
"issues": "https://github.com/phar-io/version/issues",
"source": "https://github.com/phar-io/version/tree/3.1.0"
},
"time": "2021-02-23T14:00:09+00:00"
},
{
"name": "phpdocumentor/reflection-common",
"version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-2.x": "2.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jaap van Otterdijk",
"email": "opensource@ijaap.nl"
}
],
"description": "Common reflection classes used by phpdocumentor to reflect the code structure",
"homepage": "http://www.phpdoc.org",
"keywords": [
"FQSEN",
"phpDocumentor",
"phpdoc",
"reflection",
"static analysis"
],
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
"source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
},
"time": "2020-06-27T09:03:43+00:00"
},
{
"name": "phpdocumentor/reflection-docblock",
"version": "5.2.2",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
"reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
"shasum": ""
},
"require": {
"ext-filter": "*",
"php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.2",
"phpdocumentor/type-resolver": "^1.3",
"webmozart/assert": "^1.9.1"
},
"require-dev": {
"mockery/mockery": "~1.3.2"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
},
{
"name": "Jaap van Otterdijk",
"email": "account@ijaap.nl"
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
},
"time": "2020-09-03T19:13:55+00:00"
},
{
"name": "phpdocumentor/type-resolver",
"version": "1.5.1",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
"reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae",
"reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0",
"phpdocumentor/reflection-common": "^2.0"
},
"require-dev": {
"ext-tokenizer": "*",
"psalm/phar": "^4.8"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-1.x": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
}
],
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
"source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1"
},
"time": "2021-10-02T14:08:47+00:00"
},
{
"name": "phpspec/prophecy",
"version": "1.14.0",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
"reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
"reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.2",
"php": "^7.2 || ~8.0, <8.2",
"phpdocumentor/reflection-docblock": "^5.2",
"sebastian/comparator": "^3.0 || ^4.0",
"sebastian/recursion-context": "^3.0 || ^4.0"
},
"require-dev": {
"phpspec/phpspec": "^6.0 || ^7.0",
"phpunit/phpunit": "^8.0 || ^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Prophecy\\": "src/Prophecy"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Konstantin Kudryashov",
"email": "ever.zet@gmail.com",
"homepage": "http://everzet.com"
},
{
"name": "Marcello Duarte",
"email": "marcello.duarte@gmail.com"
}
],
"description": "Highly opinionated mocking framework for PHP 5.3+",
"homepage": "https://github.com/phpspec/prophecy",
"keywords": [
"Double",
"Dummy",
"fake",
"mock",
"spy",
"stub"
],
"support": {
"issues": "https://github.com/phpspec/prophecy/issues",
"source": "https://github.com/phpspec/prophecy/tree/1.14.0"
},
"time": "2021-09-10T09:02:12+00:00"
},
{
"name": "phpspec/prophecy-phpunit",
"version": "v2.0.1",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy-phpunit.git",
"reference": "2d7a9df55f257d2cba9b1d0c0963a54960657177"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/2d7a9df55f257d2cba9b1d0c0963a54960657177",
"reference": "2d7a9df55f257d2cba9b1d0c0963a54960657177",
"shasum": ""
},
"require": {
"php": "^7.3 || ^8",
"phpspec/prophecy": "^1.3",
"phpunit/phpunit": "^9.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"psr-4": {
"Prophecy\\PhpUnit\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christophe Coevoet",
"email": "stof@notk.org"
}
],
"description": "Integrating the Prophecy mocking library in PHPUnit test cases",
"homepage": "http://phpspec.net",
"keywords": [
"phpunit",
"prophecy"
],
"support": {
"issues": "https://github.com/phpspec/prophecy-phpunit/issues",
"source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.0.1"
},
"time": "2020-07-09T08:33:42+00:00"
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.7",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218",
"reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
"nikic/php-parser": "^4.12.0",
"php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2",
"sebastian/code-unit-reverse-lookup": "^2.0.2",
"sebastian/complexity": "^2.0",
"sebastian/environment": "^5.1.2",
"sebastian/lines-of-code": "^1.0.3",
"sebastian/version": "^3.0.1",
"theseer/tokenizer": "^1.2.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-pcov": "*",
"ext-xdebug": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "9.2-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
"homepage": "https://github.com/sebastianbergmann/php-code-coverage",
"keywords": [
"coverage",
"testing",
"xunit"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-09-17T05:39:03+00:00"
},
{
"name": "phpunit/php-file-iterator",
"version": "3.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
"reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
"reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
"homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
"keywords": [
"filesystem",
"iterator"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:57:25+00:00"
},
{
"name": "phpunit/php-invoker",
"version": "3.1.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-invoker.git",
"reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
"reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"ext-pcntl": "*",
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-pcntl": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Invoke callables with a timeout",
"homepage": "https://github.com/sebastianbergmann/php-invoker/",
"keywords": [
"process"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-invoker/issues",
"source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:58:55+00:00"
},
{
"name": "phpunit/php-text-template",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Simple template engine.",
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
"keywords": [
"template"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
"source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T05:33:50+00:00"
},
{
"name": "phpunit/php-timer",
"version": "5.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Utility class for timing",
"homepage": "https://github.com/sebastianbergmann/php-timer/",
"keywords": [
"timer"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
"source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:16:10+00:00"
},
{
"name": "phpunit/phpunit",
"version": "9.5.10",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a",
"reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.3.1",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
"myclabs/deep-copy": "^1.10.1",
"phar-io/manifest": "^2.0.3",
"phar-io/version": "^3.0.2",
"php": ">=7.3",
"phpspec/prophecy": "^1.12.1",
"phpunit/php-code-coverage": "^9.2.7",
"phpunit/php-file-iterator": "^3.0.5",
"phpunit/php-invoker": "^3.1.1",
"phpunit/php-text-template": "^2.0.3",
"phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6",
"sebastian/comparator": "^4.0.5",
"sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.3",
"sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^2.3.4",
"sebastian/version": "^3.0.2"
},
"require-dev": {
"ext-pdo": "*",
"phpspec/prophecy-phpunit": "^2.0.1"
},
"suggest": {
"ext-soap": "*",
"ext-xdebug": "*"
},
"bin": [
"phpunit"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "9.5-dev"
}
},
"autoload": {
"classmap": [
"src/"
],
"files": [
"src/Framework/Assert/Functions.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "The PHP Unit Testing framework.",
"homepage": "https://phpunit.de/",
"keywords": [
"phpunit",
"testing",
"xunit"
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10"
},
"funding": [
{
"url": "https://phpunit.de/donate.html",
"type": "custom"
},
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-09-25T07:38:51+00:00"
},
{
"name": "psr/http-factory",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-factory.git",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
"shasum": ""
},
"require": {
"php": ">=7.0.0",
"psr/http-message": "^1.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 interfaces for PSR-7 HTTP message factories",
"keywords": [
"factory",
"http",
"message",
"psr",
"psr-17",
"psr-7",
"request",
"response"
],
"support": {
"source": "https://github.com/php-fig/http-factory/tree/master"
},
"time": "2019-04-30T12:38:16+00:00"
},
{
"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"
],
"support": {
"source": "https://github.com/php-fig/http-message/tree/master"
},
"time": "2016-08-06T14:39:51+00:00"
},
{
"name": "sebastian/cli-parser",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for parsing CLI options",
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
"source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:08:49+00:00"
},
{
"name": "sebastian/code-unit",
"version": "1.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Collection of value objects that represent the PHP code units",
"homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit/issues",
"source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:08:54+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
"version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Looks up which function or method a line of code belongs to",
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
"source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:30:19+00:00"
},
{
"name": "sebastian/comparator",
"version": "4.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/diff": "^4.0",
"sebastian/exporter": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
{
"name": "Bernhard Schussek",
"email": "bschussek@2bepublished.at"
}
],
"description": "Provides the functionality to compare PHP values for equality",
"homepage": "https://github.com/sebastianbergmann/comparator",
"keywords": [
"comparator",
"compare",
"equality"
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T15:49:45+00:00"
},
{
"name": "sebastian/complexity",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.7",
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for calculating the complexity of PHP code units",
"homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
"source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T15:52:27+00:00"
},
{
"name": "sebastian/diff",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3",
"symfony/process": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Kore Nordmann",
"email": "mail@kore-nordmann.de"
}
],
"description": "Diff implementation",
"homepage": "https://github.com/sebastianbergmann/diff",
"keywords": [
"diff",
"udiff",
"unidiff",
"unified diff"
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:10:38+00:00"
},
{
"name": "sebastian/environment",
"version": "5.1.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
"reference": "388b6ced16caa751030f6a69e588299fa09200ac"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
"reference": "388b6ced16caa751030f6a69e588299fa09200ac",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-posix": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.1-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Provides functionality to handle HHVM/PHP environments",
"homepage": "http://www.github.com/sebastianbergmann/environment",
"keywords": [
"Xdebug",
"environment",
"hhvm"
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:52:38+00:00"
},
{
"name": "sebastian/exporter",
"version": "4.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
"reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-mbstring": "*",
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
},
{
"name": "Bernhard Schussek",
"email": "bschussek@gmail.com"
}
],
"description": "Provides the functionality to export PHP variables for visualization",
"homepage": "http://www.github.com/sebastianbergmann/exporter",
"keywords": [
"export",
"exporter"
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:24:23+00:00"
},
{
"name": "sebastian/global-state",
"version": "5.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
"reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49",
"reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/object-reflector": "^2.0",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-dom": "*",
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-uopz": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Snapshotting of global state",
"homepage": "http://www.github.com/sebastianbergmann/global-state",
"keywords": [
"global state"
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
"source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-06-11T13:31:12+00:00"
},
{
"name": "sebastian/lines-of-code",
"version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.6",
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for counting the lines of code in PHP source code",
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-11-28T06:42:11+00:00"
},
{
"name": "sebastian/object-enumerator",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/object-reflector": "^2.0",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
"source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:12:34+00:00"
},
{
"name": "sebastian/object-reflector",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Allows reflection of object attributes, including inherited and non-public ones",
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
"source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:14:26+00:00"
},
{
"name": "sebastian/recursion-context",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
}
],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
"source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:17:30+00:00"
},
{
"name": "sebastian/resource-operations",
"version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/resource-operations.git",
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Provides a list of PHP built-in functions that operate on resources",
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
"support": {
"issues": "https://github.com/sebastianbergmann/resource-operations/issues",
"source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:45:17+00:00"
},
{
"name": "sebastian/type",
"version": "2.3.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914",
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.3-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Collection of value objects that represent the types of the PHP type system",
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/2.3.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-06-15T12:49:02+00:00"
},
{
"name": "sebastian/version",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
"reference": "c6c1022351a901512170118436c764e473f6de8c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
"reference": "c6c1022351a901512170118436c764e473f6de8c",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
"source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:39:44+00:00"
},
{
"name": "squizlabs/php_codesniffer",
"version": "2.9.2",
"source": {
"type": "git",
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
"reference": "2acf168de78487db620ab4bc524135a13cfe6745"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/2acf168de78487db620ab4bc524135a13cfe6745",
"reference": "2acf168de78487db620ab4bc524135a13cfe6745",
"shasum": ""
},
"require": {
"ext-simplexml": "*",
"ext-tokenizer": "*",
"ext-xmlwriter": "*",
"php": ">=5.1.2"
},
"require-dev": {
"phpunit/phpunit": "~4.0"
},
"bin": [
"scripts/phpcs",
"scripts/phpcbf"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.x-dev"
}
},
"autoload": {
"classmap": [
"CodeSniffer.php",
"CodeSniffer/CLI.php",
"CodeSniffer/Exception.php",
"CodeSniffer/File.php",
"CodeSniffer/Fixer.php",
"CodeSniffer/Report.php",
"CodeSniffer/Reporting.php",
"CodeSniffer/Sniff.php",
"CodeSniffer/Tokens.php",
"CodeSniffer/Reports/",
"CodeSniffer/Tokenizers/",
"CodeSniffer/DocGenerators/",
"CodeSniffer/Standards/AbstractPatternSniff.php",
"CodeSniffer/Standards/AbstractScopeSniff.php",
"CodeSniffer/Standards/AbstractVariableSniff.php",
"CodeSniffer/Standards/IncorrectPatternException.php",
"CodeSniffer/Standards/Generic/Sniffs/",
"CodeSniffer/Standards/MySource/Sniffs/",
"CodeSniffer/Standards/PEAR/Sniffs/",
"CodeSniffer/Standards/PSR1/Sniffs/",
"CodeSniffer/Standards/PSR2/Sniffs/",
"CodeSniffer/Standards/Squiz/Sniffs/",
"CodeSniffer/Standards/Zend/Sniffs/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Greg Sherwood",
"role": "lead"
}
],
"description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
"homepage": "http://www.squizlabs.com/php-codesniffer",
"keywords": [
"phpcs",
"standards"
],
"support": {
"issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
"source": "https://github.com/squizlabs/PHP_CodeSniffer",
"wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
},
"time": "2018-11-07T22:31:41+00:00"
},
{
"name": "symfony/polyfill-ctype",
"version": "v1.23.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce",
"reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"suggest": {
"ext-ctype": "For best performance"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
}
},
"autoload": {
"psr-4": {
"Symfony\\Polyfill\\Ctype\\": ""
},
"files": [
"bootstrap.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Gert de Pagter",
"email": "BackEndTea@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for ctype functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"ctype",
"polyfill",
"portable"
],
"support": {
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2021-02-19T12:13:01+00:00"
},
{
"name": "theseer/tokenizer",
"version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/theseer/tokenizer.git",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-tokenizer": "*",
"ext-xmlwriter": "*",
"php": "^7.2 || ^8.0"
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
}
],
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
"issues": "https://github.com/theseer/tokenizer/issues",
"source": "https://github.com/theseer/tokenizer/tree/1.2.1"
},
"funding": [
{
"url": "https://github.com/theseer",
"type": "github"
}
],
"time": "2021-07-28T10:34:58+00:00"
},
{
"name": "webimpress/http-middleware-compatibility",
"version": "0.1.1",
"source": {
"type": "git",
"url": "https://github.com/webimpress/http-middleware-compatibility.git",
"reference": "793d21864a0417bbe01437c33f902cac49c1788c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webimpress/http-middleware-compatibility/zipball/793d21864a0417bbe01437c33f902cac49c1788c",
"reference": "793d21864a0417bbe01437c33f902cac49c1788c",
"shasum": ""
},
"require": {
"http-interop/http-middleware": "^0.1.1 || ^0.2 || ^0.3 || ^0.4.1 || ^0.5",
"php": "^5.6 || ^7.0"
},
"require-dev": {
"phpunit/phpunit": "^5.7.22 || ^6.3.1"
},
"type": "library",
"autoload": {
"files": [
"autoload/http-middleware.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-2-Clause"
],
"description": "Compatibility library for Draft PSR-15 HTTP Middleware",
"homepage": "https://github.com/webimpress/http-middleware-compatibility",
"keywords": [
"middleware",
"psr-15",
"webimpress"
],
"support": {
"issues": "https://github.com/webimpress/http-middleware-compatibility/issues",
"source": "https://github.com/webimpress/http-middleware-compatibility"
},
"abandoned": "psr/http-server-middleware",
"time": "2017-10-05T15:55:30+00:00"
},
{
"name": "webmozart/assert",
"version": "1.10.0",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
"reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
"reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
"phpstan/phpstan": "<0.12.20",
"vimeo/psalm": "<4.6.1 || 4.6.2"
},
"require-dev": {
"phpunit/phpunit": "^8.5.13"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.10-dev"
}
},
"autoload": {
"psr-4": {
"Webmozart\\Assert\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Bernhard Schussek",
"email": "bschussek@gmail.com"
}
],
"description": "Assertions to validate method input/output with nice error messages.",
"keywords": [
"assert",
"check",
"validate"
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/1.10.0"
},
"time": "2021-03-09T10:59:23+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
"php": "^7.3 || ~8.0.0 || ~8.1.0"
},
"platform-dev": [],
"plugin-api-version": "2.1.0"
}
PK CUT}CC phpcs.xmlnu ٘
src
test
PK CUT>%=^ ^ README.mdnu ٘ # laminas-mvc
[![Build Status](https://github.com/laminas/laminas-mvc/workflows/Continuous%20Integration/badge.svg)](https://github.com/laminas/laminas-mvc/actions?query=workflow%3A"Continuous+Integration")
`Laminas\Mvc` is an MVC implementation focusing on performance and flexibility.
The MVC layer is built on top of the following components:
- `Laminas\ServiceManager` - Laminas provides a set of default service
definitions set up at `Laminas\Mvc\Service`. The ServiceManager creates and
configures your application instance and workflow.
- `Laminas\EventManager` - The MVC is event driven. This component is used
everywhere from initial bootstrapping of the application, through returning
response and request calls, to setting and retrieving routes and matched
routes, as well as render views.
- `Laminas\Http` - specifically the request and response objects, used within:
`Laminas\Stdlib\DispatchableInterface`. All “controllers” are simply dispatchable
objects.
- File issues at https://github.com/laminas/laminas-mvc/issues
- Documentation is at https://docs.laminas.dev/laminas-mvc/
PK CUTD_
.gitignorenu ٘ /clover.xml
/coveralls-upload.json
/docs/html/
/laminas-mkdoc-theme.tgz
/laminas-mkdoc-theme/
/phpunit.xml
/vendor/
/.phpunit.result.cache
PK CUTRH H , src/Controller/AbstractRestfulController.phpnu ٘ [
'application/hal+json',
'application/json'
]
];
/**
* Name of request or query parameter containing identifier
*
* @var string
*/
protected $identifierName = 'id';
/**
* Flag to pass to json_decode and/or Laminas\Json\Json::decode.
*
* The flags in Laminas\Json\Json::decode are integers, but when evaluated
* in a boolean context map to the flag passed as the second parameter
* to json_decode(). As such, you can specify either the Laminas\Json\Json
* constant or the boolean value. By default, starting in v3, we use
* the boolean value, and cast to integer if using Laminas\Json\Json::decode.
*
* Default value is boolean true, meaning JSON should be cast to
* associative arrays (vs objects).
*
* Override the value in an extending class to set the default behavior
* for your class.
*
* @var int|bool
*/
protected $jsonDecodeType = true;
/**
* Map of custom HTTP methods and their handlers
*
* @var array
*/
protected $customHttpMethodsMap = [];
/**
* Set the route match/query parameter name containing the identifier
*
* @param string $name
* @return self
*/
public function setIdentifierName($name)
{
$this->identifierName = (string) $name;
return $this;
}
/**
* Retrieve the route match/query parameter name containing the identifier
*
* @return string
*/
public function getIdentifierName()
{
return $this->identifierName;
}
/**
* Create a new resource
*
* @param mixed $data
* @return mixed
*/
public function create($data)
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Delete an existing resource
*
* @param mixed $id
* @return mixed
*/
public function delete($id)
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Delete the entire resource collection
*
* Not marked as abstract, as that would introduce a BC break
* (introduced in 2.1.0); instead, raises an exception if not implemented.
*
* @return mixed
*/
public function deleteList($data)
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Return single resource
*
* @param mixed $id
* @return mixed
*/
public function get($id)
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Return list of resources
*
* @return mixed
*/
public function getList()
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Retrieve HEAD metadata for the resource
*
* Not marked as abstract, as that would introduce a BC break
* (introduced in 2.1.0); instead, raises an exception if not implemented.
*
* @param null|mixed $id
* @return mixed
*/
public function head($id = null)
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Respond to the OPTIONS method
*
* Typically, set the Allow header with allowed HTTP methods, and
* return the response.
*
* Not marked as abstract, as that would introduce a BC break
* (introduced in 2.1.0); instead, raises an exception if not implemented.
*
* @return mixed
*/
public function options()
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Respond to the PATCH method
*
* Not marked as abstract, as that would introduce a BC break
* (introduced in 2.1.0); instead, raises an exception if not implemented.
*
* @param $id
* @param $data
* @return array
*/
public function patch($id, $data)
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Replace an entire resource collection
*
* Not marked as abstract, as that would introduce a BC break
* (introduced in 2.1.0); instead, raises an exception if not implemented.
*
* @param mixed $data
* @return mixed
*/
public function replaceList($data)
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Modify a resource collection without completely replacing it
*
* Not marked as abstract, as that would introduce a BC break
* (introduced in 2.2.0); instead, raises an exception if not implemented.
*
* @param mixed $data
* @return mixed
*/
public function patchList($data)
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Update an existing resource
*
* @param mixed $id
* @param mixed $data
* @return mixed
*/
public function update($id, $data)
{
$this->response->setStatusCode(405);
return [
'content' => 'Method Not Allowed'
];
}
/**
* Basic functionality for when a page is not available
*
* @return array
*/
public function notFoundAction()
{
$this->response->setStatusCode(404);
return [
'content' => 'Page not found'
];
}
/**
* Dispatch a request
*
* If the route match includes an "action" key, then this acts basically like
* a standard action controller. Otherwise, it introspects the HTTP method
* to determine how to handle the request, and which method to delegate to.
*
* @events dispatch.pre, dispatch.post
* @param Request $request
* @param null|Response $response
* @return mixed|Response
* @throws Exception\InvalidArgumentException
*/
public function dispatch(Request $request, Response $response = null)
{
if (! $request instanceof HttpRequest) {
throw new Exception\InvalidArgumentException('Expected an HTTP request');
}
return parent::dispatch($request, $response);
}
/**
* Handle the request
*
* @todo try-catch in "patch" for patchList should be removed in the future
* @param MvcEvent $e
* @return mixed
* @throws Exception\DomainException if no route matches in event or invalid HTTP method
*/
public function onDispatch(MvcEvent $e)
{
$routeMatch = $e->getRouteMatch();
if (! $routeMatch) {
/**
* @todo Determine requirements for when route match is missing.
* Potentially allow pulling directly from request metadata?
*/
throw new Exception\DomainException('Missing route matches; unsure how to retrieve action');
}
$request = $e->getRequest();
// Was an "action" requested?
$action = $routeMatch->getParam('action', false);
if ($action) {
// Handle arbitrary methods, ending in Action
$method = static::getMethodFromAction($action);
if (! method_exists($this, $method)) {
$method = 'notFoundAction';
}
$return = $this->$method();
$e->setResult($return);
return $return;
}
// RESTful methods
$method = strtolower($request->getMethod());
switch ($method) {
// Custom HTTP methods (or custom overrides for standard methods)
case (isset($this->customHttpMethodsMap[$method])):
$callable = $this->customHttpMethodsMap[$method];
$action = $method;
$return = call_user_func($callable, $e);
break;
// DELETE
case 'delete':
$id = $this->getIdentifier($routeMatch, $request);
if ($id !== false) {
$action = 'delete';
$return = $this->delete($id);
break;
}
$data = $this->processBodyContent($request);
$action = 'deleteList';
$return = $this->deleteList($data);
break;
// GET
case 'get':
$id = $this->getIdentifier($routeMatch, $request);
if ($id !== false) {
$action = 'get';
$return = $this->get($id);
break;
}
$action = 'getList';
$return = $this->getList();
break;
// HEAD
case 'head':
$id = $this->getIdentifier($routeMatch, $request);
if ($id === false) {
$id = null;
}
$action = 'head';
$headResult = $this->head($id);
$response = ($headResult instanceof Response) ? clone $headResult : $e->getResponse();
$response->setContent('');
$return = $response;
break;
// OPTIONS
case 'options':
$action = 'options';
$this->options();
$return = $e->getResponse();
break;
// PATCH
case 'patch':
$id = $this->getIdentifier($routeMatch, $request);
$data = $this->processBodyContent($request);
if ($id !== false) {
$action = 'patch';
$return = $this->patch($id, $data);
break;
}
// TODO: This try-catch should be removed in the future, but it
// will create a BC break for pre-2.2.0 apps that expect a 405
// instead of going to patchList
try {
$action = 'patchList';
$return = $this->patchList($data);
} catch (Exception\RuntimeException $ex) {
$response = $e->getResponse();
$response->setStatusCode(405);
return $response;
}
break;
// POST
case 'post':
$action = 'create';
$return = $this->processPostData($request);
break;
// PUT
case 'put':
$id = $this->getIdentifier($routeMatch, $request);
$data = $this->processBodyContent($request);
if ($id !== false) {
$action = 'update';
$return = $this->update($id, $data);
break;
}
$action = 'replaceList';
$return = $this->replaceList($data);
break;
// All others...
default:
$response = $e->getResponse();
$response->setStatusCode(405);
return $response;
}
$routeMatch->setParam('action', $action);
$e->setResult($return);
return $return;
}
/**
* Process post data and call create
*
* @param Request $request
* @return mixed
* @throws Exception\DomainException If a JSON request was made, but no
* method for parsing JSON is available.
*/
public function processPostData(Request $request)
{
if ($this->requestHasContentType($request, self::CONTENT_TYPE_JSON)) {
return $this->create($this->jsonDecode($request->getContent()));
}
return $this->create($request->getPost()->toArray());
}
/**
* Check if request has certain content type
*
* @param Request $request
* @param string|null $contentType
* @return bool
*/
public function requestHasContentType(Request $request, $contentType = '')
{
/** @var $headerContentType \Laminas\Http\Header\ContentType */
$headerContentType = $request->getHeaders()->get('content-type');
if (! $headerContentType) {
return false;
}
$requestedContentType = $headerContentType->getFieldValue();
if (false !== strpos($requestedContentType, ';')) {
$headerData = explode(';', $requestedContentType);
$requestedContentType = array_shift($headerData);
}
$requestedContentType = trim($requestedContentType);
if (array_key_exists($contentType, $this->contentTypes)) {
foreach ($this->contentTypes[$contentType] as $contentTypeValue) {
if (stripos($contentTypeValue, $requestedContentType) === 0) {
return true;
}
}
}
return false;
}
/**
* Register a handler for a custom HTTP method
*
* This method allows you to handle arbitrary HTTP method types, mapping
* them to callables. Typically, these will be methods of the controller
* instance: e.g., array($this, 'foobar'). The typical place to register
* these is in your constructor.
*
* Additionally, as this map is checked prior to testing the standard HTTP
* methods, this is a way to override what methods will handle the standard
* HTTP methods. However, if you do this, you will have to retrieve the
* identifier and any request content manually.
*
* Callbacks will be passed the current MvcEvent instance.
*
* To retrieve the identifier, you can use "$id =
* $this->getIdentifier($routeMatch, $request)",
* passing the appropriate objects.
*
* To retrieve the body content data, use "$data = $this->processBodyContent($request)";
* that method will return a string, array, or, in the case of JSON, an object.
*
* @param string $method
* @param Callable $handler
* @return AbstractRestfulController
*/
public function addHttpMethodHandler($method, /* Callable */ $handler)
{
if (! is_callable($handler)) {
throw new Exception\InvalidArgumentException(sprintf(
'Invalid HTTP method handler: must be a callable; received "%s"',
(is_object($handler) ? get_class($handler) : gettype($handler))
));
}
$method = strtolower($method);
$this->customHttpMethodsMap[$method] = $handler;
return $this;
}
/**
* Retrieve the identifier, if any
*
* Attempts to see if an identifier was passed in either the URI or the
* query string, returning it if found. Otherwise, returns a boolean false.
*
* @param \Laminas\Router\RouteMatch $routeMatch
* @param Request $request
* @return false|mixed
*/
protected function getIdentifier($routeMatch, $request)
{
$identifier = $this->getIdentifierName();
$id = $routeMatch->getParam($identifier, false);
if ($id !== false) {
return $id;
}
$id = $request->getQuery()->get($identifier, false);
if ($id !== false) {
return $id;
}
return false;
}
/**
* Process the raw body content
*
* If the content-type indicates a JSON payload, the payload is immediately
* decoded and the data returned. Otherwise, the data is passed to
* parse_str(). If that function returns a single-member array with a empty
* value, the method assumes that we have non-urlencoded content and
* returns the raw content; otherwise, the array created is returned.
*
* @param mixed $request
* @return object|string|array
* @throws Exception\DomainException If a JSON request was made, but no
* method for parsing JSON is available.
*/
protected function processBodyContent($request)
{
$content = $request->getContent();
// JSON content? decode and return it.
if ($this->requestHasContentType($request, self::CONTENT_TYPE_JSON)) {
return $this->jsonDecode($request->getContent());
}
parse_str($content, $parsedParams);
// If parse_str fails to decode, or we have a single element with empty value
if (! is_array($parsedParams) || empty($parsedParams)
|| (1 == count($parsedParams) && '' === reset($parsedParams))
) {
return $content;
}
return $parsedParams;
}
/**
* Decode a JSON string.
*
* Uses json_decode by default. If that is not available, checks for
* availability of Laminas\Json\Json, and uses that if present.
*
* Otherwise, raises an exception.
*
* Marked protected to allow usage from extending classes.
*
* @param string
* @return mixed
* @throws Exception\DomainException if no JSON decoding functionality is
* available.
*/
protected function jsonDecode($string)
{
if (function_exists('json_decode')) {
return json_decode($string, (bool) $this->jsonDecodeType);
}
if (class_exists(Json::class)) {
return Json::decode($string, (int) $this->jsonDecodeType);
}
throw new Exception\DomainException(sprintf(
'Unable to parse JSON request, due to missing ext/json and/or %s',
Json::class
));
}
}
PK CUTUtӕK K % src/Controller/AbstractController.phpnu ٘ request = $request;
if (! $response) {
$response = new HttpResponse();
}
$this->response = $response;
$e = $this->getEvent();
$e->setName(MvcEvent::EVENT_DISPATCH);
$e->setRequest($request);
$e->setResponse($response);
$e->setTarget($this);
$result = $this->getEventManager()->triggerEventUntil(function ($test) {
return ($test instanceof Response);
}, $e);
if ($result->stopped()) {
return $result->last();
}
return $e->getResult();
}
/**
* Get request object
*
* @return Request
*/
public function getRequest()
{
if (! $this->request) {
$this->request = new HttpRequest();
}
return $this->request;
}
/**
* Get response object
*
* @return Response
*/
public function getResponse()
{
if (! $this->response) {
$this->response = new HttpResponse();
}
return $this->response;
}
/**
* Set the event manager instance used by this context
*
* @param EventManagerInterface $events
* @return AbstractController
*/
public function setEventManager(EventManagerInterface $events)
{
$className = get_class($this);
$identifiers = [
__CLASS__,
$className,
];
$rightmostNsPos = strrpos($className, '\\');
if ($rightmostNsPos) {
$identifiers[] = strstr($className, '\\', true); // top namespace
$identifiers[] = substr($className, 0, $rightmostNsPos); // full namespace
}
$events->setIdentifiers(array_merge(
$identifiers,
array_values(class_implements($className)),
(array) $this->eventIdentifier
));
$this->events = $events;
$this->attachDefaultListeners();
return $this;
}
/**
* Retrieve the event manager
*
* Lazy-loads an EventManager instance if none registered.
*
* @return EventManagerInterface
*/
public function getEventManager()
{
if (! $this->events) {
$this->setEventManager(new EventManager());
}
return $this->events;
}
/**
* Set an event to use during dispatch
*
* By default, will re-cast to MvcEvent if another event type is provided.
*
* @param Event $e
* @return void
*/
public function setEvent(Event $e)
{
if (! $e instanceof MvcEvent) {
$eventParams = $e->getParams();
$e = new MvcEvent();
$e->setParams($eventParams);
unset($eventParams);
}
$this->event = $e;
}
/**
* Get the attached event
*
* Will create a new MvcEvent if none provided.
*
* @return MvcEvent
*/
public function getEvent()
{
if (! $this->event) {
$this->setEvent(new MvcEvent());
}
return $this->event;
}
/**
* Get plugin manager
*
* @return PluginManager
*/
public function getPluginManager()
{
if (! $this->plugins) {
$this->setPluginManager(new PluginManager(new ServiceManager()));
}
$this->plugins->setController($this);
return $this->plugins;
}
/**
* Set plugin manager
*
* @param PluginManager $plugins
* @return AbstractController
*/
public function setPluginManager(PluginManager $plugins)
{
$this->plugins = $plugins;
$this->plugins->setController($this);
return $this;
}
/**
* Get plugin instance
*
* @param string $name Name of plugin to return
* @param null|array $options Options to pass to plugin constructor (if not already instantiated)
* @return mixed
*/
public function plugin($name, array $options = null)
{
return $this->getPluginManager()->get($name, $options);
}
/**
* Method overloading: return/call plugins
*
* If the plugin is a functor, call it, passing the parameters provided.
* Otherwise, return the plugin instance.
*
* @param string $method
* @param array $params
* @return mixed
*/
public function __call($method, $params)
{
$plugin = $this->plugin($method);
if (is_callable($plugin)) {
return call_user_func_array($plugin, $params);
}
return $plugin;
}
/**
* Register the default events for this controller
*
* @return void
*/
protected function attachDefaultListeners()
{
$events = $this->getEventManager();
$events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch']);
}
/**
* Transform an "action" token into a method name
*
* @param string $action
* @return string
*/
public static function getMethodFromAction($action)
{
$method = str_replace(['.', '-', '_'], ' ', $action);
$method = ucwords($method);
$method = str_replace(' ', '', $method);
$method = lcfirst($method);
$method .= 'Action';
return $method;
}
}
PK CUT<$ $ src/Controller/PluginManager.phpnu ٘ Plugin\AcceptableViewModelSelector::class,
'acceptableViewModelSelector' => Plugin\AcceptableViewModelSelector::class,
'acceptableviewmodelselector' => Plugin\AcceptableViewModelSelector::class,
'Forward' => Plugin\Forward::class,
'forward' => Plugin\Forward::class,
'Layout' => Plugin\Layout::class,
'layout' => Plugin\Layout::class,
'Params' => Plugin\Params::class,
'params' => Plugin\Params::class,
'Redirect' => Plugin\Redirect::class,
'redirect' => Plugin\Redirect::class,
'Url' => Plugin\Url::class,
'url' => Plugin\Url::class,
'CreateHttpNotFoundModel' => Plugin\CreateHttpNotFoundModel::class,
'createHttpNotFoundModel' => Plugin\CreateHttpNotFoundModel::class,
'createhttpnotfoundmodel' => Plugin\CreateHttpNotFoundModel::class,
// Legacy Zend Framework aliases
\Zend\Mvc\Controller\Plugin\Forward::class => Plugin\Forward::class,
\Zend\Mvc\Controller\Plugin\AcceptableViewModelSelector::class => Plugin\AcceptableViewModelSelector::class,
\Zend\Mvc\Controller\Plugin\Layout::class => Plugin\Layout::class,
\Zend\Mvc\Controller\Plugin\Params::class => Plugin\Params::class,
\Zend\Mvc\Controller\Plugin\Redirect::class => Plugin\Redirect::class,
\Zend\Mvc\Controller\Plugin\Url::class => Plugin\Url::class,
\Zend\Mvc\Controller\Plugin\CreateHttpNotFoundModel::class => Plugin\CreateHttpNotFoundModel::class,
// v2 normalized FQCNs
'zendmvccontrollerpluginforward' => Plugin\Forward::class,
'zendmvccontrollerpluginacceptableviewmodelselector' => Plugin\AcceptableViewModelSelector::class,
'zendmvccontrollerpluginlayout' => Plugin\Layout::class,
'zendmvccontrollerpluginparams' => Plugin\Params::class,
'zendmvccontrollerpluginredirect' => Plugin\Redirect::class,
'zendmvccontrollerpluginurl' => Plugin\Url::class,
'zendmvccontrollerplugincreatehttpnotfoundmodel' => Plugin\CreateHttpNotFoundModel::class,
];
/**
* @var string[]|callable[] Default factories
*/
protected $factories = [
Plugin\Forward::class => Plugin\Service\ForwardFactory::class,
Plugin\AcceptableViewModelSelector::class => InvokableFactory::class,
Plugin\Layout::class => InvokableFactory::class,
Plugin\Params::class => InvokableFactory::class,
Plugin\Redirect::class => InvokableFactory::class,
Plugin\Url::class => InvokableFactory::class,
Plugin\CreateHttpNotFoundModel::class => InvokableFactory::class,
// v2 normalized names
'laminasmvccontrollerpluginforward' => Plugin\Service\ForwardFactory::class,
'laminasmvccontrollerpluginacceptableviewmodelselector' => InvokableFactory::class,
'laminasmvccontrollerpluginlayout' => InvokableFactory::class,
'laminasmvccontrollerpluginparams' => InvokableFactory::class,
'laminasmvccontrollerpluginredirect' => InvokableFactory::class,
'laminasmvccontrollerpluginurl' => InvokableFactory::class,
'laminasmvccontrollerplugincreatehttpnotfoundmodel' => InvokableFactory::class,
];
/**
* @var DispatchableInterface
*/
protected $controller;
/**
* Retrieve a registered instance
*
* After the plugin is retrieved from the service locator, inject the
* controller in the plugin every time it is requested. This is required
* because a controller can use a plugin and another controller can be
* dispatched afterwards. If this second controller uses the same plugin
* as the first controller, the reference to the controller inside the
* plugin is lost.
*
* @param string $name
* @param null|array $options Options to use when creating the instance.
* @return DispatchableInterface
*/
public function get($name, array $options = null)
{
$plugin = parent::get($name, $options);
$this->injectController($plugin);
return $plugin;
}
/**
* Set controller
*
* @param DispatchableInterface $controller
* @return PluginManager
*/
public function setController(DispatchableInterface $controller)
{
$this->controller = $controller;
return $this;
}
/**
* Retrieve controller instance
*
* @return null|DispatchableInterface
*/
public function getController()
{
return $this->controller;
}
/**
* Inject a helper instance with the registered controller
*
* @param object $plugin
* @return void
*/
public function injectController($plugin)
{
if (! is_object($plugin)) {
return;
}
if (! method_exists($plugin, 'setController')) {
return;
}
$controller = $this->getController();
if (! $controller instanceof DispatchableInterface) {
return;
}
$plugin->setController($controller);
}
/**
* Validate a plugin
*
* {@inheritDoc}
*/
public function validate($plugin)
{
if (! $plugin instanceof $this->instanceOf) {
throw new InvalidServiceException(sprintf(
'Plugin of type "%s" is invalid; must implement %s',
(is_object($plugin) ? get_class($plugin) : gettype($plugin)),
$this->instanceOf
));
}
}
}
PK CUT˕ src/Controller/Plugin/Url.phpnu ٘ getController();
if (! $controller instanceof InjectApplicationEventInterface) {
throw new Exception\DomainException(
'Url plugin requires a controller that implements InjectApplicationEventInterface'
);
}
if (! is_array($params)) {
if (! $params instanceof Traversable) {
throw new Exception\InvalidArgumentException(
'Params is expected to be an array or a Traversable object'
);
}
$params = iterator_to_array($params);
}
$event = $controller->getEvent();
$router = null;
$matches = null;
if ($event instanceof MvcEvent) {
$router = $event->getRouter();
$matches = $event->getRouteMatch();
} elseif ($event instanceof EventInterface) {
$router = $event->getParam('router', false);
$matches = $event->getParam('route-match', false);
}
if (! $router instanceof RouteStackInterface) {
throw new Exception\DomainException(
'Url plugin requires that controller event compose a router; none found'
);
}
if (3 == func_num_args() && is_bool($options)) {
$reuseMatchedParams = $options;
$options = [];
}
if ($route === null) {
if (! $matches) {
throw new Exception\RuntimeException('No RouteMatch instance present');
}
$route = $matches->getMatchedRouteName();
if ($route === null) {
throw new Exception\RuntimeException('RouteMatch does not contain a matched route name');
}
}
if ($reuseMatchedParams && $matches) {
$routeMatchParams = $matches->getParams();
if (isset($routeMatchParams[ModuleRouteListener::ORIGINAL_CONTROLLER])) {
$routeMatchParams['controller'] = $routeMatchParams[ModuleRouteListener::ORIGINAL_CONTROLLER];
unset($routeMatchParams[ModuleRouteListener::ORIGINAL_CONTROLLER]);
}
if (isset($routeMatchParams[ModuleRouteListener::MODULE_NAMESPACE])) {
unset($routeMatchParams[ModuleRouteListener::MODULE_NAMESPACE]);
}
$params = array_merge($routeMatchParams, $params);
}
$options['name'] = $route;
return $router->assemble($params, $options);
}
}
PK CUT src/Controller/Plugin/Layout.phpnu ٘ getViewModel();
$viewModel->setTemplate((string) $template);
return $this;
}
/**
* Invoke as a functor
*
* If no arguments are given, grabs the "root" or "layout" view model.
* Otherwise, attempts to set the template for that view model.
*
* @param null|string $template
* @return Model|Layout
*/
public function __invoke($template = null)
{
if (null === $template) {
return $this->getViewModel();
}
return $this->setTemplate($template);
}
/**
* Get the event
*
* @return MvcEvent
* @throws Exception\DomainException if unable to find event
*/
protected function getEvent()
{
if ($this->event) {
return $this->event;
}
$controller = $this->getController();
if (! $controller instanceof InjectApplicationEventInterface) {
throw new Exception\DomainException(
'Layout plugin requires a controller that implements InjectApplicationEventInterface'
);
}
$event = $controller->getEvent();
if (! $event instanceof MvcEvent) {
$params = $event->getParams();
$event = new MvcEvent();
$event->setParams($params);
}
$this->event = $event;
return $this->event;
}
/**
* Retrieve the root view model from the event
*
* @return Model
* @throws Exception\DomainException
*/
protected function getViewModel()
{
$event = $this->getEvent();
$viewModel = $event->getViewModel();
if (! $viewModel instanceof Model) {
throw new Exception\DomainException('Layout plugin requires that event view model is populated');
}
return $viewModel;
}
}
PK CUTw% % ! src/Controller/Plugin/Forward.phpnu ٘ controllers = $controllers;
}
/**
* Set maximum number of nested forwards allowed
*
* @param int $maxNestedForwards
* @return self
*/
public function setMaxNestedForwards($maxNestedForwards)
{
$this->maxNestedForwards = (int) $maxNestedForwards;
return $this;
}
/**
* Get information on listeners that need to be detached before dispatching.
*
* Each entry in the array contains three keys:
*
* id (identifier for event-emitting component),
* event (the hooked event)
* and class (the class of listener that should be detached).
*
* @return array
*/
public function getListenersToDetach()
{
// If a blacklist has not been explicitly set, return the default:
if (null === $this->listenersToDetach) {
// We need to detach the InjectViewModelListener to prevent templates
// from getting attached to the ViewModel twice when a calling action
// returns the output generated by a forwarded action.
$this->listenersToDetach = [[
'id' => 'Laminas\Stdlib\DispatchableInterface',
'event' => MvcEvent::EVENT_DISPATCH,
'class' => 'Laminas\Mvc\View\Http\InjectViewModelListener',
]];
}
return $this->listenersToDetach;
}
/**
* Set information on listeners that need to be detached before dispatching.
*
* @param array $listeners Listener information; see getListenersToDetach() for details on format.
*
* @return self
*/
public function setListenersToDetach($listeners)
{
$this->listenersToDetach = $listeners;
return $this;
}
/**
* Dispatch another controller
*
* @param string $name Controller name; either a class name or an alias used in the controller manager
* @param null|array $params Parameters with which to seed a custom RouteMatch object for the new controller
* @return mixed
* @throws Exception\DomainException if composed controller does not define InjectApplicationEventInterface
* or Locator aware; or if the discovered controller is not dispatchable
*/
public function dispatch($name, array $params = null)
{
$event = clone($this->getEvent());
$controller = $this->controllers->get($name);
if ($controller instanceof InjectApplicationEventInterface) {
$controller->setEvent($event);
}
// Allow passing parameters to seed the RouteMatch with & copy matched route name
if ($params !== null) {
$routeMatch = new RouteMatch($params);
$routeMatch->setMatchedRouteName($event->getRouteMatch()->getMatchedRouteName());
$event->setRouteMatch($routeMatch);
}
if ($this->numNestedForwards > $this->maxNestedForwards) {
throw new Exception\DomainException(
"Circular forwarding detected: greater than $this->maxNestedForwards nested forwards"
);
}
$this->numNestedForwards++;
// Detach listeners that may cause problems during dispatch:
$sharedEvents = $event->getApplication()->getEventManager()->getSharedManager();
$listeners = $this->detachProblemListeners($sharedEvents);
$return = $controller->dispatch($event->getRequest(), $event->getResponse());
// If we detached any listeners, reattach them now:
$this->reattachProblemListeners($sharedEvents, $listeners);
$this->numNestedForwards--;
return $return;
}
/**
* Detach problem listeners specified by getListenersToDetach() and return an array of information that will
* allow them to be reattached.
*
* @param SharedEvents $sharedEvents Shared event manager
* @return array
*/
protected function detachProblemListeners(SharedEvents $sharedEvents)
{
// Convert the problem list from two-dimensional array to more convenient id => event => class format:
$formattedProblems = [];
foreach ($this->getListenersToDetach() as $current) {
if (! isset($formattedProblems[$current['id']])) {
$formattedProblems[$current['id']] = [];
}
if (! isset($formattedProblems[$current['id']][$current['event']])) {
$formattedProblems[$current['id']][$current['event']] = [];
}
$formattedProblems[$current['id']][$current['event']][] = $current['class'];
}
// Loop through the class blacklist, detaching problem events and remembering their CallbackHandlers
// for future reference:
$results = [];
foreach ($formattedProblems as $id => $eventArray) {
$results[$id] = [];
foreach ($eventArray as $eventName => $classArray) {
$results[$id][$eventName] = [];
$events = $this->getSharedListenersById($id, $eventName, $sharedEvents);
foreach ($events as $priority => $currentPriorityEvents) {
foreach ($currentPriorityEvents as $currentEvent) {
$currentCallback = $currentEvent;
// If we have an array, grab the object
if (is_array($currentCallback)) {
$currentCallback = array_shift($currentCallback);
}
// This routine is only valid for object callbacks
if (! is_object($currentCallback)) {
continue;
}
foreach ($classArray as $class) {
if ($currentCallback instanceof $class) {
$this->detachSharedListener($id, $currentEvent, $sharedEvents);
$results[$id][$eventName][$priority] = $currentEvent;
}
}
}
}
}
}
return $results;
}
/**
* Reattach all problem listeners detached by detachProblemListeners(), if any.
*
* @param SharedEvents $sharedEvents Shared event manager
* @param array $listeners Output of detachProblemListeners()
* @return void
*/
protected function reattachProblemListeners(SharedEvents $sharedEvents, array $listeners)
{
foreach ($listeners as $id => $eventArray) {
foreach ($eventArray as $eventName => $callbacks) {
foreach ($callbacks as $priority => $current) {
$callback = $current;
$sharedEvents->attach($id, $eventName, $callback, $priority);
}
}
}
}
/**
* Get the event
*
* @return MvcEvent
* @throws Exception\DomainException if unable to find event
*/
protected function getEvent()
{
if ($this->event) {
return $this->event;
}
$controller = $this->getController();
if (! $controller instanceof InjectApplicationEventInterface) {
throw new Exception\DomainException(sprintf(
'Forward plugin requires a controller that implements InjectApplicationEventInterface; received %s',
(is_object($controller) ? get_class($controller) : var_export($controller, 1))
));
}
$event = $controller->getEvent();
if (! $event instanceof MvcEvent) {
$params = [];
if ($event) {
$params = $event->getParams();
}
$event = new MvcEvent();
$event->setParams($params);
}
$this->event = $event;
return $this->event;
}
/**
* Retrieve shared listeners for an event by identifier.
*
* Varies retrieval based on laminas-eventmanager version.
*
* @param string|int $id
* @param string $event
* @param SharedEvents $sharedEvents
* @return array|\Traversable
*/
private function getSharedListenersById($id, $event, SharedEvents $sharedEvents)
{
return $sharedEvents->getListeners([$id], $event);
}
/**
* Detach a shared listener by identifier.
*
* Varies detachment based on laminas-eventmanager version.
*
* @param string|int $id
* @param callable|CallbackHandler $listener
* @param SharedEvents $sharedEvents
* @return void
*/
private function detachSharedListener($id, $listener, SharedEvents $sharedEvents)
{
$sharedEvents->detach($listener, $id);
}
}
PK CUT 1 src/Controller/Plugin/CreateHttpNotFoundModel.phpnu ٘ setStatusCode(404);
return new ViewModel(['content' => 'Page not found']);
}
}
PK CUT&gQ ( src/Controller/Plugin/AbstractPlugin.phpnu ٘ controller = $controller;
}
/**
* Get the current controller instance
*
* @return null|Dispatchable
*/
public function getController()
{
return $this->controller;
}
}
PK CUTNL L src/Controller/Plugin/Params.phpnu ٘ fromRoute($param, $default);
}
/**
* Return all files or a single file.
*
* @param string $name File name to retrieve, or null to get all.
* @param mixed $default Default value to use when the file is missing.
* @return array|\ArrayAccess|null
*/
public function fromFiles($name = null, $default = null)
{
if ($name === null) {
return $this->getController()->getRequest()->getFiles($name, $default)->toArray();
}
return $this->getController()->getRequest()->getFiles($name, $default);
}
/**
* Return all header parameters or a single header parameter.
*
* @param string $header Header name to retrieve, or null to get all.
* @param mixed $default Default value to use when the requested header is missing.
* @return null|\Laminas\Http\Header\HeaderInterface
*/
public function fromHeader($header = null, $default = null)
{
if ($header === null) {
return $this->getController()->getRequest()->getHeaders($header, $default)->toArray();
}
return $this->getController()->getRequest()->getHeaders($header, $default);
}
/**
* Return all post parameters or a single post parameter.
*
* @param string $param Parameter name to retrieve, or null to get all.
* @param mixed $default Default value to use when the parameter is missing.
* @return mixed
*/
public function fromPost($param = null, $default = null)
{
if ($param === null) {
return $this->getController()->getRequest()->getPost($param, $default)->toArray();
}
return $this->getController()->getRequest()->getPost($param, $default);
}
/**
* Return all query parameters or a single query parameter.
*
* @param string $param Parameter name to retrieve, or null to get all.
* @param mixed $default Default value to use when the parameter is missing.
* @return mixed
*/
public function fromQuery($param = null, $default = null)
{
if ($param === null) {
return $this->getController()->getRequest()->getQuery($param, $default)->toArray();
}
return $this->getController()->getRequest()->getQuery($param, $default);
}
/**
* Return all route parameters or a single route parameter.
*
* @param string $param Parameter name to retrieve, or null to get all.
* @param mixed $default Default value to use when the parameter is missing.
* @return mixed
* @throws RuntimeException
*/
public function fromRoute($param = null, $default = null)
{
$controller = $this->getController();
if (! $controller instanceof InjectApplicationEventInterface) {
throw new RuntimeException(
'Controllers must implement Laminas\Mvc\InjectApplicationEventInterface to use this plugin.'
);
}
if ($param === null) {
return $controller->getEvent()->getRouteMatch()->getParams();
}
return $controller->getEvent()->getRouteMatch()->getParam($param, $default);
}
}
PK CUT ) src/Controller/Plugin/PluginInterface.phpnu ٘ has('ControllerManager')) {
throw new ServiceNotCreatedException(sprintf(
'%s requires that the application service manager contains a "%s" service; none found',
__CLASS__,
'ControllerManager'
));
}
$controllers = $container->get('ControllerManager');
return new Forward($controllers);
}
}
PK CUT
" src/Controller/Plugin/Redirect.phpnu ٘ getController();
if (! $controller || ! method_exists($controller, 'plugin')) {
throw new Exception\DomainException(
'Redirect plugin requires a controller that defines the plugin() method'
);
}
$urlPlugin = $controller->plugin('url');
if (is_scalar($options)) {
$url = $urlPlugin->fromRoute($route, $params, $options);
} else {
$url = $urlPlugin->fromRoute($route, $params, $options, $reuseMatchedParams);
}
return $this->toUrl($url);
}
/**
* Generate redirect response based on given URL
*
* @param string $url
* @return Response
*/
public function toUrl($url)
{
$response = $this->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
return $response;
}
/**
* Refresh to current route
*
* @return Response
*/
public function refresh()
{
return $this->toRoute(null, [], [], true);
}
/**
* Get the response
*
* @return Response
* @throws Exception\DomainException if unable to find response
*/
protected function getResponse()
{
if ($this->response) {
return $this->response;
}
$event = $this->getEvent();
$response = $event->getResponse();
if (! $response instanceof Response) {
throw new Exception\DomainException('Redirect plugin requires event compose a response');
}
$this->response = $response;
return $this->response;
}
/**
* Get the event
*
* @return MvcEvent
* @throws Exception\DomainException if unable to find event
*/
protected function getEvent()
{
if ($this->event) {
return $this->event;
}
$controller = $this->getController();
if (! $controller instanceof InjectApplicationEventInterface) {
throw new Exception\DomainException(
'Redirect plugin requires a controller that implements InjectApplicationEventInterface'
);
}
$event = $controller->getEvent();
if (! $event instanceof MvcEvent) {
$params = $event->getParams();
$event = new MvcEvent();
$event->setParams($params);
}
$this->event = $event;
return $this->event;
}
}
PK CUTT՝ 5 src/Controller/Plugin/AcceptableViewModelSelector.phpnu ٘ getViewModel($matchAgainst, $returnDefault, $resultReference);
}
/**
* Detects an appropriate viewmodel for request.
*
* @param array $matchAgainst (optional) The Array to match against
* @param bool $returnDefault (optional) If no match is available. Return default instead
* @param AbstractFieldValuePart|null $resultReference (optional) The object that was matched
* @throws InvalidArgumentException If the supplied and matched View Model could not be found
* @return ModelInterface|null
*/
public function getViewModel(
array $matchAgainst = null,
$returnDefault = true,
& $resultReference = null
) {
$name = $this->getViewModelName($matchAgainst, $returnDefault, $resultReference);
if (! $name) {
return;
}
if (! class_exists($name)) {
throw new InvalidArgumentException('The supplied View Model could not be found');
}
return new $name();
}
/**
* Detects an appropriate viewmodel name for request.
*
* @param array $matchAgainst (optional) The Array to match against
* @param bool $returnDefault (optional) If no match is available. Return default instead
* @param AbstractFieldValuePart|null $resultReference (optional) The object that was matched.
* @return ModelInterface|null Returns null if $returnDefault = false and no match could be made
*/
public function getViewModelName(
array $matchAgainst = null,
$returnDefault = true,
& $resultReference = null
) {
$res = $this->match($matchAgainst);
if ($res) {
$resultReference = $res;
return $this->extractViewModelName($res);
}
if ($returnDefault) {
return $this->defaultViewModelName;
}
}
/**
* Detects an appropriate viewmodel name for request.
*
* @param array $matchAgainst (optional) The Array to match against
* @return AbstractFieldValuePart|null The object that was matched
*/
public function match(array $matchAgainst = null)
{
$request = $this->getRequest();
$headers = $request->getHeaders();
if ((! $matchAgainst && ! $this->defaultMatchAgainst) || ! $headers->has('accept')) {
return;
}
if (! $matchAgainst) {
$matchAgainst = $this->defaultMatchAgainst;
}
$matchAgainstString = '';
foreach ($matchAgainst as $modelName => $modelStrings) {
foreach ((array) $modelStrings as $modelString) {
$matchAgainstString .= $this->injectViewModelName($modelString, $modelName);
}
}
/** @var $accept \Laminas\Http\Header\Accept */
$accept = $headers->get('Accept');
if (($res = $accept->match($matchAgainstString)) === false) {
return;
}
return $res;
}
/**
* Set the default View Model (name) to return if no match could be made
* @param string $defaultViewModelName The default View Model name
* @return AcceptableViewModelSelector provides fluent interface
*/
public function setDefaultViewModelName($defaultViewModelName)
{
$this->defaultViewModelName = (string) $defaultViewModelName;
return $this;
}
/**
* Set the default View Model (name) to return if no match could be made
* @return string
*/
public function getDefaultViewModelName()
{
return $this->defaultViewModelName;
}
/**
* Set the default Accept Types and View Model combinations to match against if none are specified.
*
* @param array $matchAgainst (optional) The Array to match against
* @return AcceptableViewModelSelector provides fluent interface
*/
public function setDefaultMatchAgainst(array $matchAgainst = null)
{
$this->defaultMatchAgainst = $matchAgainst;
return $this;
}
/**
* Get the default Accept Types and View Model combinations to match against if none are specified.
*
* @return array|null
*/
public function getDefaultMatchAgainst()
{
return $this->defaultMatchAgainst;
}
/**
* Inject the viewmodel name into the accept header string
*
* @param string $modelAcceptString
* @param string $modelName
* @return string
*/
protected function injectViewModelName($modelAcceptString, $modelName)
{
$modelName = str_replace('\\', '|', $modelName);
$modelAcceptString = (is_array($modelAcceptString))
? $modelAcceptString[key($modelAcceptString)]
: $modelAcceptString;
return $modelAcceptString . '; ' . self::INJECT_VIEWMODEL_NAME . '="' . $modelName . '", ';
}
/**
* Extract the viewmodel name from a match
* @param AbstractFieldValuePart $res
* @return string
*/
protected function extractViewModelName(AbstractFieldValuePart $res)
{
$modelName = $res->getMatchedAgainst()->params[self::INJECT_VIEWMODEL_NAME];
return str_replace('|', '\\', $modelName);
}
/**
* Get the request
*
* @return Request
* @throws DomainException if unable to find request
*/
protected function getRequest()
{
if ($this->request) {
return $this->request;
}
$event = $this->getEvent();
$request = $event->getRequest();
if (! $request instanceof Request) {
throw new DomainException(
'The event used does not contain a valid Request, but must.'
);
}
$this->request = $request;
return $request;
}
/**
* Get the event
*
* @return MvcEvent
* @throws DomainException if unable to find event
*/
protected function getEvent()
{
if ($this->event) {
return $this->event;
}
$controller = $this->getController();
if (! $controller instanceof InjectApplicationEventInterface) {
throw new DomainException(
'A controller that implements InjectApplicationEventInterface '
. 'is required to use ' . __CLASS__
);
}
$event = $controller->getEvent();
if (! $event instanceof MvcEvent) {
$params = $event->getParams();
$event = new MvcEvent();
$event->setParams($params);
}
$this->event = $event;
return $this->event;
}
}
PK CUTm=k[
[
' src/Controller/MiddlewareController.phpnu ٘ eventIdentifier = __CLASS__;
$this->pipe = $pipe;
$this->responsePrototype = $responsePrototype;
$this->setEventManager($eventManager);
$this->setEvent($event);
}
/**
* {@inheritDoc}
*
* @throws RuntimeException
*/
public function onDispatch(MvcEvent $e)
{
$routeMatch = $e->getRouteMatch();
$psr7Request = $this->populateRequestParametersFromRoute(
$this->loadRequest()->withAttribute(RouteMatch::class, $routeMatch),
$routeMatch
);
$result = $this->pipe->process($psr7Request, new CallableDelegateDecorator(
function () {
throw ReachedFinalHandlerException::create();
},
$this->responsePrototype
));
$e->setResult($result);
return $result;
}
/**
* @return \Laminas\Diactoros\ServerRequest
*
* @throws RuntimeException
*/
private function loadRequest()
{
$request = $this->request;
if (! $request instanceof Request) {
throw new RuntimeException(sprintf(
'Expected request to be a %s, %s given',
Request::class,
get_class($request)
));
}
return Psr7ServerRequest::fromLaminas($request);
}
/**
* @param ServerRequestInterface $request
* @param RouteMatch|null $routeMatch
*
* @return ServerRequestInterface
*/
private function populateRequestParametersFromRoute(ServerRequestInterface $request, RouteMatch $routeMatch = null)
{
if (! $routeMatch) {
return $request;
}
foreach ($routeMatch->getParams() as $key => $value) {
$request = $request->withAttribute($key, $value);
}
return $request;
}
}
PK CUT& \ \ $ src/Controller/ControllerManager.phpnu ٘ addInitializer([$this, 'injectEventManager']);
$this->addInitializer([$this, 'injectPluginManager']);
parent::__construct($configOrContainerInstance, $config);
}
/**
* Validate a plugin
*
* {@inheritDoc}
*/
public function validate($plugin)
{
if (! $plugin instanceof $this->instanceOf) {
throw new InvalidServiceException(sprintf(
'Plugin of type "%s" is invalid; must implement %s',
(is_object($plugin) ? get_class($plugin) : gettype($plugin)),
$this->instanceOf
));
}
}
/**
* Initializer: inject EventManager instance
*
* If we have an event manager composed already, make sure it gets injected
* with the shared event manager.
*
* The AbstractController lazy-instantiates an EM instance, which is why
* the shared EM injection needs to happen; the conditional will always
* pass.
*
* @param ContainerInterface $container
* @param DispatchableInterface $controller
*/
public function injectEventManager(ContainerInterface $container, $controller)
{
if (! $controller instanceof EventManagerAwareInterface) {
return;
}
$events = $controller->getEventManager();
if (! $events || ! $events->getSharedManager() instanceof SharedEventManagerInterface) {
$controller->setEventManager($container->get('EventManager'));
}
}
/**
* Initializer: inject plugin manager
*
* @param ContainerInterface $container
* @param DispatchableInterface $controller
*/
public function injectPluginManager(ContainerInterface $container, $controller)
{
if (! method_exists($controller, 'setPluginManager')) {
return;
}
$controller->setPluginManager($container->get('ControllerPluginManager'));
}
}
PK CUT`/9 9 + src/Controller/AbstractActionController.phpnu ٘ 'Placeholder page'
]);
}
/**
* Action called if matched action does not exist
*
* @return ViewModel
*/
public function notFoundAction()
{
$event = $this->getEvent();
$routeMatch = $event->getRouteMatch();
$routeMatch->setParam('action', 'not-found');
$helper = $this->plugin('createHttpNotFoundModel');
return $helper($event->getResponse());
}
/**
* Execute the request
*
* @param MvcEvent $e
* @return mixed
* @throws Exception\DomainException
*/
public function onDispatch(MvcEvent $e)
{
$routeMatch = $e->getRouteMatch();
if (! $routeMatch) {
/**
* @todo Determine requirements for when route match is missing.
* Potentially allow pulling directly from request metadata?
*/
throw new Exception\DomainException('Missing route matches; unsure how to retrieve action');
}
$action = $routeMatch->getParam('action', 'not-found');
$method = static::getMethodFromAction($action);
if (! method_exists($this, $method)) {
$method = 'notFoundAction';
}
$actionResponse = $this->$method();
$e->setResult($actionResponse);
return $actionResponse;
}
}
PK CUT`!-x x 0 src/Controller/LazyControllerAbstractFactory.phpnu ٘
* 'controllers' => [
* 'abstract_factories' => [
* LazyControllerAbstractFactory::class,
* ],
* ],
*
*
* Or as a factory, mapping a controller class name to it:
*
*
* 'controllers' => [
* 'factories' => [
* MyControllerWithDependencies::class => LazyControllerAbstractFactory::class,
* ],
* ],
*
*
* The latter approach is more explicit, and also more performant.
*
* The factory has the following constraints/features:
*
* - A parameter named `$config` typehinted as an array will receive the
* application "config" service (i.e., the merged configuration).
* - Parameters type-hinted against array, but not named `$config` will
* be injected with an empty array.
* - Scalar parameters will be resolved as null values.
* - If a service cannot be found for a given typehint, the factory will
* raise an exception detailing this.
* - Some services provided by Laminas components do not have
* entries based on their class name (for historical reasons); the
* factory contains a map of these class/interface names to the
* corresponding service name to allow them to resolve.
*
* `$options` passed to the factory are ignored in all cases, as we cannot
* make assumptions about which argument(s) they might replace.
*/
class LazyControllerAbstractFactory implements AbstractFactoryInterface
{
/**
* Maps known classes/interfaces to the service that provides them; only
* required for those services with no entry based on the class/interface
* name.
*
* Extend the class if you wish to add to the list.
*
* @var string[]
*/
protected $aliases = [
ConsoleAdapterInterface::class => 'ConsoleAdapter',
FilterPluginManager::class => 'FilterManager',
HydratorPluginManager::class => 'HydratorManager',
InputFilterPluginManager::class => 'InputFilterManager',
LogFilterManager::class => 'LogFilterManager',
LogFormatterManager::class => 'LogFormatterManager',
LogProcessorManager::class => 'LogProcessorManager',
LogWriterManager::class => 'LogWriterManager',
SerializerAdapterManager::class => 'SerializerAdapterManager',
ValidatorPluginManager::class => 'ValidatorManager',
];
/**
* {@inheritDoc}
*
* @return DispatchableInterface
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$reflectionClass = new ReflectionClass($requestedName);
if (null === ($constructor = $reflectionClass->getConstructor())) {
return new $requestedName();
}
$reflectionParameters = $constructor->getParameters();
if (empty($reflectionParameters)) {
return new $requestedName();
}
$parameters = array_map(
$this->resolveParameter($container, $requestedName),
$reflectionParameters
);
return new $requestedName(...$parameters);
}
/**
* {@inheritDoc}
*/
public function canCreate(ContainerInterface $container, $requestedName)
{
if (! class_exists($requestedName)) {
return false;
}
return in_array(DispatchableInterface::class, class_implements($requestedName), true);
}
/**
* Resolve a parameter to a value.
*
* Returns a callback for resolving a parameter to a value.
*
* @param ContainerInterface $container
* @param string $requestedName
* @return callable
*/
private function resolveParameter(ContainerInterface $container, $requestedName)
{
/**
* @param ReflectionParameter $parameter
* @return mixed
* @throws ServiceNotFoundException If type-hinted parameter cannot be
* resolved to a service in the container.
*/
return function (ReflectionParameter $parameter) use ($container, $requestedName) {
if ($parameter->getType()
&& $parameter->getType()->getName() === 'array') {
if ($parameter->getName() === 'config'
&& $container->has('config')
) {
return $container->get('config');
}
return [];
}
if (! $parameter->getType() || $parameter->getType()->isBuiltin()) {
return;
}
$type = $parameter->getType()->getName();
$type = isset($this->aliases[$type]) ? $this->aliases[$type] : $type;
if (! $container->has($type)) {
throw new ServiceNotFoundException(sprintf(
'Unable to create controller "%s"; unable to resolve parameter "%s" using type hint "%s"',
$requestedName,
$parameter->getName(),
$type
));
}
return $container->get($type);
};
}
}
PK CUTʌ]
src/HttpMethodListener.phpnu ٘ setEnabled($enabled);
if (! empty($allowedMethods)) {
$this->setAllowedMethods($allowedMethods);
}
}
/**
* {@inheritdoc}
*/
public function attach(EventManagerInterface $events, $priority = 1)
{
if (! $this->isEnabled()) {
return;
}
$this->listeners[] = $events->attach(
MvcEvent::EVENT_ROUTE,
[$this, 'onRoute'],
10000
);
}
/**
* @param MvcEvent $e
* @return void|HttpResponse
*/
public function onRoute(MvcEvent $e)
{
$request = $e->getRequest();
$response = $e->getResponse();
if (! $request instanceof HttpRequest || ! $response instanceof HttpResponse) {
return;
}
$method = $request->getMethod();
if (in_array($method, $this->getAllowedMethods())) {
return;
}
$response->setStatusCode(405);
return $response;
}
/**
* @return array
*/
public function getAllowedMethods()
{
return $this->allowedMethods;
}
/**
* @param array $allowedMethods
*/
public function setAllowedMethods(array $allowedMethods)
{
foreach ($allowedMethods as &$value) {
$value = strtoupper($value);
}
$this->allowedMethods = $allowedMethods;
}
/**
* @return bool
*/
public function isEnabled()
{
return $this->enabled;
}
/**
* @param bool $enabled
*/
public function setEnabled($enabled)
{
$this->enabled = (bool) $enabled;
}
}
PK CUT}| | " src/Exception/RuntimeException.phpnu ٘ middlewareName = $middlewareName;
return $instance;
}
public static function fromNull()
{
$instance = new self('Middleware name cannot be null');
return $instance;
}
/**
* @return string
*/
public function toMiddlewareName()
{
return null !== $this->middlewareName ? $this->middlewareName : '';
}
}
PK CUTQ~P , src/Exception/InvalidControllerException.phpnu ٘ listeners[] = $events->attach(MvcEvent::EVENT_ROUTE, [$this, 'onRoute']);
}
/**
* Listen to the "route" event and attempt to route the request
*
* If no matches are returned, triggers "dispatch.error" in order to
* create a 404 response.
*
* Seeds the event with the route match on completion.
*
* @param MvcEvent $event
* @return null|RouteMatch
*/
public function onRoute(MvcEvent $event)
{
$request = $event->getRequest();
$router = $event->getRouter();
$routeMatch = $router->match($request);
if ($routeMatch instanceof RouteMatch) {
$event->setRouteMatch($routeMatch);
return $routeMatch;
}
$event->setName(MvcEvent::EVENT_DISPATCH_ERROR);
$event->setError(Application::ERROR_ROUTER_NO_MATCH);
$target = $event->getTarget();
$results = $target->getEventManager()->triggerEvent($event);
if (! empty($results)) {
return $results->last();
}
return $event->getParams();
}
}
PK CUThu u src/ModuleRouteListener.phpnu ٘ listeners[] = $events->attach(MvcEvent::EVENT_ROUTE, [$this, 'onRoute'], $priority);
}
/**
* Listen to the "route" event and determine if the module namespace should
* be prepended to the controller name.
*
* If the route match contains a parameter key matching the MODULE_NAMESPACE
* constant, that value will be prepended, with a namespace separator, to
* the matched controller parameter.
*
* @param MvcEvent $e
* @return null
*/
public function onRoute(MvcEvent $e)
{
$matches = $e->getRouteMatch();
if (! $matches instanceof RouteMatch) {
// Can't do anything without a route match
return;
}
$module = $matches->getParam(self::MODULE_NAMESPACE, false);
if (! $module) {
// No module namespace found; nothing to do
return;
}
$controller = $matches->getParam('controller', false);
if (! $controller) {
// no controller matched, nothing to do
return;
}
// Ensure the module namespace has not already been applied
if (0 === strpos($controller, $module)) {
return;
}
// Keep the originally matched controller name around
$matches->setParam(self::ORIGINAL_CONTROLLER, $controller);
// Prepend the controllername with the module, and replace it in the
// matches
$controller = $module . '\\' . str_replace(' ', '', ucwords(str_replace('-', ' ', $controller)));
$matches->setParam('controller', $controller);
}
}
PK CUTdS S src/DispatchListener.phpnu ٘ controllerManager = $controllerManager;
}
/**
* Attach listeners to an event manager
*
* @param EventManagerInterface $events
* @param int $priority
* @return void
*/
public function attach(EventManagerInterface $events, $priority = 1)
{
$this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch']);
if (function_exists('zend_monitor_custom_event_ex')) {
$this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this, 'reportMonitorEvent']);
}
}
/**
* Listen to the "dispatch" event
*
* @param MvcEvent $e
* @return mixed
*/
public function onDispatch(MvcEvent $e)
{
if (null !== $e->getResult()) {
return;
}
$routeMatch = $e->getRouteMatch();
$controllerName = $routeMatch instanceof RouteMatch
? $routeMatch->getParam('controller', 'not-found')
: 'not-found';
$application = $e->getApplication();
$controllerManager = $this->controllerManager;
// Query abstract controllers, too!
if (! $controllerManager->has($controllerName)) {
$return = $this->marshalControllerNotFoundEvent(
$application::ERROR_CONTROLLER_NOT_FOUND,
$controllerName,
$e,
$application
);
return $this->complete($return, $e);
}
try {
$controller = $controllerManager->get($controllerName);
} catch (Exception\InvalidControllerException $exception) {
$return = $this->marshalControllerNotFoundEvent(
$application::ERROR_CONTROLLER_INVALID,
$controllerName,
$e,
$application,
$exception
);
return $this->complete($return, $e);
} catch (InvalidServiceException $exception) {
$return = $this->marshalControllerNotFoundEvent(
$application::ERROR_CONTROLLER_INVALID,
$controllerName,
$e,
$application,
$exception
);
return $this->complete($return, $e);
} catch (\Throwable $exception) {
$return = $this->marshalBadControllerEvent($controllerName, $e, $application, $exception);
return $this->complete($return, $e);
} catch (\Exception $exception) { // @TODO clean up once PHP 7 requirement is enforced
$return = $this->marshalBadControllerEvent($controllerName, $e, $application, $exception);
return $this->complete($return, $e);
}
if ($controller instanceof InjectApplicationEventInterface) {
$controller->setEvent($e);
}
$request = $e->getRequest();
$response = $application->getResponse();
$caughtException = null;
try {
$return = $controller->dispatch($request, $response);
} catch (\Throwable $ex) {
$caughtException = $ex;
} catch (\Exception $ex) { // @TODO clean up once PHP 7 requirement is enforced
$caughtException = $ex;
}
if ($caughtException !== null) {
$e->setName(MvcEvent::EVENT_DISPATCH_ERROR);
$e->setError($application::ERROR_EXCEPTION);
$e->setController($controllerName);
$e->setControllerClass(get_class($controller));
$e->setParam('exception', $caughtException);
$return = $application->getEventManager()->triggerEvent($e)->last();
if (! $return) {
$return = $e->getResult();
}
}
return $this->complete($return, $e);
}
/**
* @param MvcEvent $e
*/
public function reportMonitorEvent(MvcEvent $e)
{
$error = $e->getError();
$exception = $e->getParam('exception');
// @TODO clean up once PHP 7 requirement is enforced
if ($exception instanceof \Exception || $exception instanceof \Throwable) {
zend_monitor_custom_event_ex(
$error,
$exception->getMessage(),
'Laminas Exception',
['code' => $exception->getCode(), 'trace' => $exception->getTraceAsString()]
);
}
}
/**
* Complete the dispatch
*
* @param mixed $return
* @param MvcEvent $event
* @return mixed
*/
protected function complete($return, MvcEvent $event)
{
if (! is_object($return)) {
if (ArrayUtils::hasStringKeys($return)) {
$return = new ArrayObject($return, ArrayObject::ARRAY_AS_PROPS);
}
}
$event->setResult($return);
return $return;
}
/**
* Marshal a controller not found exception event
*
* @param string $type
* @param string $controllerName
* @param MvcEvent $event
* @param Application $application
* @param \Throwable|\Exception $exception
* @return mixed
*/
protected function marshalControllerNotFoundEvent(
$type,
$controllerName,
MvcEvent $event,
Application $application,
$exception = null
) {
$event->setName(MvcEvent::EVENT_DISPATCH_ERROR);
$event->setError($type);
$event->setController($controllerName);
$event->setControllerClass('invalid controller class or alias: ' . $controllerName);
if ($exception !== null) {
$event->setParam('exception', $exception);
}
$events = $application->getEventManager();
$results = $events->triggerEvent($event);
$return = $results->last();
if (! $return) {
$return = $event->getResult();
}
return $return;
}
/**
* Marshal a bad controller exception event
*
* @param string $controllerName
* @param MvcEvent $event
* @param Application $application
* @param \Throwable|\Exception $exception
* @return mixed
*/
protected function marshalBadControllerEvent(
$controllerName,
MvcEvent $event,
Application $application,
$exception
) {
$event->setName(MvcEvent::EVENT_DISPATCH_ERROR);
$event->setError($application::ERROR_EXCEPTION);
$event->setController($controllerName);
$event->setParam('exception', $exception);
$events = $application->getEventManager();
$results = $events->triggerEvent($event);
$return = $results->last();
if (! $return) {
return $event->getResult();
}
return $return;
}
}
PK CUTXK:r{ { ' src/InjectApplicationEventInterface.phpnu ٘ setParam('application', $application);
$this->application = $application;
return $this;
}
/**
* Get application instance
*
* @return ApplicationInterface
*/
public function getApplication()
{
return $this->application;
}
/**
* Get router
*
* @return RouteStackInterface
*/
public function getRouter()
{
return $this->router;
}
/**
* Set router
*
* @param RouteStackInterface $router
* @return MvcEvent
*/
public function setRouter(RouteStackInterface $router)
{
$this->setParam('router', $router);
$this->router = $router;
return $this;
}
/**
* Get route match
*
* @return null|RouteMatch
*/
public function getRouteMatch()
{
return $this->routeMatch;
}
/**
* Set route match
*
* @param RouteMatch $matches
* @return MvcEvent
*/
public function setRouteMatch(RouteMatch $matches)
{
$this->setParam('route-match', $matches);
$this->routeMatch = $matches;
return $this;
}
/**
* Get request
*
* @return Request
*/
public function getRequest()
{
return $this->request;
}
/**
* Set request
*
* @param Request $request
* @return MvcEvent
*/
public function setRequest(Request $request)
{
$this->setParam('request', $request);
$this->request = $request;
return $this;
}
/**
* Get response
*
* @return Response
*/
public function getResponse()
{
return $this->response;
}
/**
* Set response
*
* @param Response $response
* @return MvcEvent
*/
public function setResponse(Response $response)
{
$this->setParam('response', $response);
$this->response = $response;
return $this;
}
/**
* Set the view model
*
* @param Model $viewModel
* @return MvcEvent
*/
public function setViewModel(Model $viewModel)
{
$this->viewModel = $viewModel;
return $this;
}
/**
* Get the view model
*
* @return Model
*/
public function getViewModel()
{
if (null === $this->viewModel) {
$this->setViewModel(new ViewModel());
}
return $this->viewModel;
}
/**
* Get result
*
* @return mixed
*/
public function getResult()
{
return $this->result;
}
/**
* Set result
*
* @param mixed $result
* @return MvcEvent
*/
public function setResult($result)
{
$this->setParam('__RESULT__', $result);
$this->result = $result;
return $this;
}
/**
* Does the event represent an error response?
*
* @return bool
*/
public function isError()
{
return (bool) $this->getParam('error', false);
}
/**
* Set the error message (indicating error in handling request)
*
* @param string $message
* @return MvcEvent
*/
public function setError($message)
{
$this->setParam('error', $message);
return $this;
}
/**
* Retrieve the error message, if any
*
* @return string
*/
public function getError()
{
return $this->getParam('error', '');
}
/**
* Get the currently registered controller name
*
* @return string
*/
public function getController()
{
return $this->getParam('controller');
}
/**
* Set controller name
*
* @param string $name
* @return MvcEvent
*/
public function setController($name)
{
$this->setParam('controller', $name);
return $this;
}
/**
* Get controller class
*
* @return string
*/
public function getControllerClass()
{
return $this->getParam('controller-class');
}
/**
* Set controller class
*
* @param string $class
* @return MvcEvent
*/
public function setControllerClass($class)
{
$this->setParam('controller-class', $class);
return $this;
}
}
PK CUT
SD 1 src/ResponseSender/SimpleStreamResponseSender.phpnu ٘ contentSent()) {
return $this;
}
$response = $event->getResponse();
$stream = $response->getStream();
fpassthru($stream);
$event->setContentSent();
}
/**
* Send stream response
*
* @param SendResponseEvent $event
* @return SimpleStreamResponseSender
*/
public function __invoke(SendResponseEvent $event)
{
$response = $event->getResponse();
if (! $response instanceof Stream) {
return $this;
}
$this->sendHeaders($event);
$this->sendStream($event);
$event->stopPropagation(true);
return $this;
}
}
PK CUTC ( src/ResponseSender/SendResponseEvent.phpnu ٘ setParam('response', $response);
$this->response = $response;
return $this;
}
/**
* @return \Laminas\Stdlib\ResponseInterface
*/
public function getResponse()
{
return $this->response;
}
/**
* Set content sent for current response
*
* @return SendResponseEvent
*/
public function setContentSent()
{
$response = $this->getResponse();
$contentSent = $this->getParam('contentSent', []);
$responseObjectHash = spl_object_hash($response);
$contentSent[$responseObjectHash] = true;
$this->setParam('contentSent', $contentSent);
$this->contentSent[$responseObjectHash] = true;
return $this;
}
/**
* @return bool
*/
public function contentSent()
{
$response = $this->getResponse();
if (isset($this->contentSent[spl_object_hash($response)])) {
return true;
}
return false;
}
/**
* Set headers sent for current response object
*
* @return SendResponseEvent
*/
public function setHeadersSent()
{
$response = $this->getResponse();
$headersSent = $this->getParam('headersSent', []);
$responseObjectHash = spl_object_hash($response);
$headersSent[$responseObjectHash] = true;
$this->setParam('headersSent', $headersSent);
$this->headersSent[$responseObjectHash] = true;
return $this;
}
/**
* @return bool
*/
public function headersSent()
{
$response = $this->getResponse();
if (isset($this->headersSent[spl_object_hash($response)])) {
return true;
}
return false;
}
}
PK CUT[ . src/ResponseSender/ResponseSenderInterface.phpnu ٘ headersSent()) {
return $this;
}
$response = $event->getResponse();
foreach ($response->getHeaders() as $header) {
if ($header instanceof MultipleHeaderInterface) {
header($header->toString(), false);
continue;
}
header($header->toString());
}
$status = $response->renderStatusLine();
header($status);
$event->setHeadersSent();
return $this;
}
}
PK CUTV-q q 3 src/ResponseSender/PhpEnvironmentResponseSender.phpnu ٘ getResponse();
if (! $response instanceof Response) {
return $this;
}
$this->sendHeaders($event)
->sendContent($event);
$event->stopPropagation(true);
return $this;
}
}
PK CUTI ) src/ResponseSender/HttpResponseSender.phpnu ٘ contentSent()) {
return $this;
}
$response = $event->getResponse();
echo $response->getContent();
$event->setContentSent();
return $this;
}
/**
* Send HTTP response
*
* @param SendResponseEvent $event
* @return HttpResponseSender
*/
public function __invoke(SendResponseEvent $event)
{
$response = $event->getResponse();
if (! $response instanceof Response) {
return $this;
}
$this->sendHeaders($event)
->sendContent($event);
$event->stopPropagation(true);
return $this;
}
}
PK CUThb b - src/Service/InjectTemplateListenerFactory.phpnu ٘ get('config');
if (isset($config['view_manager']['controller_map'])
&& (is_array($config['view_manager']['controller_map']))
) {
$listener->setControllerMap($config['view_manager']['controller_map']);
}
return $listener;
}
}
PK CUT? ) src/Service/HttpMethodListenerFactory.phpnu ٘ get('config');
if (! isset($config['http_methods_listener'])) {
return new HttpMethodListener();
}
$listenerConfig = $config['http_methods_listener'];
$enabled = array_key_exists('enabled', $listenerConfig)
? $listenerConfig['enabled']
: true;
$allowedMethods = (isset($listenerConfig['allowed_methods']) && is_array($listenerConfig['allowed_methods']))
? $listenerConfig['allowed_methods']
: null;
return new HttpMethodListener($enabled, $allowedMethods);
}
}
PK CUTy $ src/Service/ServiceManagerConfig.phpnu ٘ [],
'aliases' => [
'EventManagerInterface' => EventManager::class,
EventManagerInterface::class => 'EventManager',
ModuleManager::class => 'ModuleManager',
ServiceListener::class => 'ServiceListener',
SharedEventManager::class => 'SharedEventManager',
'SharedEventManagerInterface' => 'SharedEventManager',
SharedEventManagerInterface::class => 'SharedEventManager',
],
'delegators' => [],
'factories' => [
'EventManager' => EventManagerFactory::class,
'ModuleManager' => ModuleManagerFactory::class,
'ServiceListener' => ServiceListenerFactory::class,
],
'lazy_services' => [],
'initializers' => [],
'invokables' => [],
'services' => [],
'shared' => [
'EventManager' => false,
],
];
/**
* Constructor
*
* Merges internal arrays with those passed via configuration, and also
* defines:
*
* - factory for the service 'SharedEventManager'.
* - initializer for EventManagerAwareInterface implementations
*
* @param array $config
*/
public function __construct(array $config = [])
{
$this->config['factories']['ServiceManager'] = function ($container) {
return $container;
};
$this->config['factories']['SharedEventManager'] = function () {
return new SharedEventManager();
};
$this->config['initializers'] = ArrayUtils::merge($this->config['initializers'], [
'EventManagerAwareInitializer' => function ($first, $second) {
if ($first instanceof ContainerInterface) {
$container = $first;
$instance = $second;
} else {
$container = $second;
$instance = $first;
}
if (! $instance instanceof EventManagerAwareInterface) {
return;
}
$eventManager = $instance->getEventManager();
// If the instance has an EM WITH an SEM composed, do nothing.
if ($eventManager instanceof EventManagerInterface
&& $eventManager->getSharedManager() instanceof SharedEventManagerInterface
) {
return;
}
$instance->setEventManager($container->get('EventManager'));
},
]);
parent::__construct($config);
}
/**
* Configure service container.
*
* Uses the configuration present in the instance to configure the provided
* service container.
*
* Before doing so, it adds a "service" entry for the ServiceManager class,
* pointing to the provided service container.
*
* @param ServiceManager $services
* @return ServiceManager
*/
public function configureServiceManager(ServiceManager $services)
{
$this->config['services'][ServiceManager::class] = $services;
// This is invoked as part of the bootstrapping process, and requires
// the ability to override services.
$services->setAllowOverride(true);
parent::configureServiceManager($services);
$services->setAllowOverride(false);
return $services;
}
/**
* Return all service configuration
*
* @return array
*/
public function toArray()
{
return $this->config;
}
}
PK CUT]?P P ' src/Service/ViewFeedStrategyFactory.phpnu ٘ get('ViewFeedRenderer'));
}
}
PK CUT2ȁ 2 src/Service/ViewPrefixPathStackResolverFactory.phpnu ٘ get('config');
$prefixes = [];
if (isset($config['view_manager']['prefix_template_path_stack'])) {
$prefixes = $config['view_manager']['prefix_template_path_stack'];
}
return new PrefixPathStackResolver($prefixes);
}
}
PK CUTY0m m &