diff --git a/.gitignore b/.gitignore
index b8673c1..c65b22b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
/.idea
/vendor/
+/.phpcs-cache
diff --git a/composer.json b/composer.json
index 552da77..5c59e4d 100644
--- a/composer.json
+++ b/composer.json
@@ -25,11 +25,15 @@
}
],
"require-dev": {
- "phan/phan": "^4.0"
+ "phan/phan": "^4.0",
+ "squizlabs/php_codesniffer": "^3.5.8",
+ "laminas/laminas-coding-standard": "^2.1.4"
},
"scripts": {
"phan": "phan",
- "phan-init": "phan --init"
+ "phan-init": "phan --init",
+ "cs-check": "phpcs",
+ "cs-fix": "phpcbf"
},
"extra": {
"laminas": {
diff --git a/composer.lock b/composer.lock
index d6a2088..f379228 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "25e1f2c374a9f4e31b1efbaf7c8e5115",
+ "content-hash": "2ddfae5af0f6b6f4051f0c284930eaa5",
"packages": [
{
"name": "composer/package-versions-deprecated",
@@ -117,16 +117,16 @@
},
{
"name": "doctrine/annotations",
- "version": "1.11.1",
+ "version": "1.12.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/annotations.git",
- "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad"
+ "reference": "ebec9b1708c95d7602245c8172773f6b4e0c3be1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad",
- "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/ebec9b1708c95d7602245c8172773f6b4e0c3be1",
+ "reference": "ebec9b1708c95d7602245c8172773f6b4e0c3be1",
"shasum": ""
},
"require": {
@@ -141,11 +141,6 @@
"phpunit/phpunit": "^7.5 || ^9.1.5"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.11.x-dev"
- }
- },
"autoload": {
"psr-4": {
"Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
@@ -186,9 +181,9 @@
],
"support": {
"issues": "https://github.com/doctrine/annotations/issues",
- "source": "https://github.com/doctrine/annotations/tree/1.11.1"
+ "source": "https://github.com/doctrine/annotations/tree/1.12.0"
},
- "time": "2020-10-26T10:28:16+00:00"
+ "time": "2021-02-14T13:22:18+00:00"
},
{
"name": "doctrine/cache",
@@ -1289,16 +1284,16 @@
},
{
"name": "friendsofphp/proxy-manager-lts",
- "version": "v1.0.2",
+ "version": "v1.0.3",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git",
- "reference": "4a66e4e0d3279d3bb3722963b4294331fabe15bc"
+ "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/4a66e4e0d3279d3bb3722963b4294331fabe15bc",
- "reference": "4a66e4e0d3279d3bb3722963b4294331fabe15bc",
+ "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/121af47c9aee9c03031bdeca3fac0540f59aa5c3",
+ "reference": "121af47c9aee9c03031bdeca3fac0540f59aa5c3",
"shasum": ""
},
"require": {
@@ -1355,7 +1350,7 @@
],
"support": {
"issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues",
- "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.2"
+ "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.3"
},
"funding": [
{
@@ -1367,7 +1362,7 @@
"type": "tidelift"
}
],
- "time": "2021-01-04T11:21:26+00:00"
+ "time": "2021-01-14T21:52:44+00:00"
},
{
"name": "laminas/laminas-code",
@@ -1836,16 +1831,16 @@
},
{
"name": "laminas/laminas-servicemanager",
- "version": "3.6.0",
+ "version": "3.6.4",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-servicemanager.git",
- "reference": "0c1ec25ff486d690c8aa8aeb93f560dab593aa78"
+ "reference": "b1445e1a7077c21b0fad0974a1b7a11b9dbe0828"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/0c1ec25ff486d690c8aa8aeb93f560dab593aa78",
- "reference": "0c1ec25ff486d690c8aa8aeb93f560dab593aa78",
+ "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/b1445e1a7077c21b0fad0974a1b7a11b9dbe0828",
+ "reference": "b1445e1a7077c21b0fad0974a1b7a11b9dbe0828",
"shasum": ""
},
"require": {
@@ -1919,7 +1914,7 @@
"type": "community_bridge"
}
],
- "time": "2021-01-10T15:50:33+00:00"
+ "time": "2021-02-03T08:44:41+00:00"
},
{
"name": "laminas/laminas-stdlib",
@@ -1981,16 +1976,16 @@
},
{
"name": "laminas/laminas-validator",
- "version": "2.14.0",
+ "version": "2.14.4",
"source": {
"type": "git",
"url": "https://github.com/laminas/laminas-validator.git",
- "reference": "8da5e20ed7b2b8101c1de68ca8dc0180210ed23e"
+ "reference": "e370c4695db1c81e6dfad38d8c4dbdb37b23d776"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laminas/laminas-validator/zipball/8da5e20ed7b2b8101c1de68ca8dc0180210ed23e",
- "reference": "8da5e20ed7b2b8101c1de68ca8dc0180210ed23e",
+ "url": "https://api.github.com/repos/laminas/laminas-validator/zipball/e370c4695db1c81e6dfad38d8c4dbdb37b23d776",
+ "reference": "e370c4695db1c81e6dfad38d8c4dbdb37b23d776",
"shasum": ""
},
"require": {
@@ -2069,7 +2064,7 @@
"type": "community_bridge"
}
],
- "time": "2021-01-07T16:07:31+00:00"
+ "time": "2021-01-24T20:45:49+00:00"
},
{
"name": "laminas/laminas-zendframework-bridge",
@@ -2246,16 +2241,16 @@
},
{
"name": "symfony/console",
- "version": "v5.2.1",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "47c02526c532fb381374dab26df05e7313978976"
+ "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/47c02526c532fb381374dab26df05e7313978976",
- "reference": "47c02526c532fb381374dab26df05e7313978976",
+ "url": "https://api.github.com/repos/symfony/console/zipball/89d4b176d12a2946a1ae4e34906a025b7b6b135a",
+ "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a",
"shasum": ""
},
"require": {
@@ -2314,7 +2309,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Console Component",
+ "description": "Eases the creation of beautiful and testable command line interfaces",
"homepage": "https://symfony.com",
"keywords": [
"cli",
@@ -2323,7 +2318,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v5.2.1"
+ "source": "https://github.com/symfony/console/tree/v5.2.3"
},
"funding": [
{
@@ -2339,20 +2334,20 @@
"type": "tidelift"
}
],
- "time": "2020-12-18T08:03:05+00:00"
+ "time": "2021-01-28T22:06:19+00:00"
},
{
"name": "symfony/filesystem",
- "version": "v5.2.1",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d"
+ "reference": "262d033b57c73e8b59cd6e68a45c528318b15038"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/fa8f8cab6b65e2d99a118e082935344c5ba8c60d",
- "reference": "fa8f8cab6b65e2d99a118e082935344c5ba8c60d",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/262d033b57c73e8b59cd6e68a45c528318b15038",
+ "reference": "262d033b57c73e8b59cd6e68a45c528318b15038",
"shasum": ""
},
"require": {
@@ -2382,10 +2377,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Filesystem Component",
+ "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v5.2.1"
+ "source": "https://github.com/symfony/filesystem/tree/v5.2.3"
},
"funding": [
{
@@ -2401,11 +2396,11 @@
"type": "tidelift"
}
],
- "time": "2020-11-30T17:05:38+00:00"
+ "time": "2021-01-27T10:01:46+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.22.0",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
@@ -2464,7 +2459,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1"
},
"funding": [
{
@@ -2484,16 +2479,16 @@
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.22.0",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "267a9adeb8ecb8071040a740930e077cdfb987af"
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/267a9adeb8ecb8071040a740930e077cdfb987af",
- "reference": "267a9adeb8ecb8071040a740930e077cdfb987af",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170",
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170",
"shasum": ""
},
"require": {
@@ -2545,7 +2540,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.22.1"
},
"funding": [
{
@@ -2561,20 +2556,20 @@
"type": "tidelift"
}
],
- "time": "2021-01-07T16:49:33+00:00"
+ "time": "2021-01-22T09:19:47+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.22.0",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "6e971c891537eb617a00bb07a43d182a6915faba"
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/6e971c891537eb617a00bb07a43d182a6915faba",
- "reference": "6e971c891537eb617a00bb07a43d182a6915faba",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248",
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248",
"shasum": ""
},
"require": {
@@ -2629,7 +2624,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.1"
},
"funding": [
{
@@ -2645,20 +2640,20 @@
"type": "tidelift"
}
],
- "time": "2021-01-07T17:09:11+00:00"
+ "time": "2021-01-22T09:19:47+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.22.0",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13"
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f377a3dd1fde44d37b9831d68dc8dea3ffd28e13",
- "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
"shasum": ""
},
"require": {
@@ -2709,7 +2704,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1"
},
"funding": [
{
@@ -2725,11 +2720,11 @@
"type": "tidelift"
}
],
- "time": "2021-01-07T16:49:33+00:00"
+ "time": "2021-01-22T09:19:47+00:00"
},
{
"name": "symfony/polyfill-php73",
- "version": "v1.22.0",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
@@ -2788,7 +2783,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.0"
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.1"
},
"funding": [
{
@@ -2808,7 +2803,7 @@
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.22.0",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
@@ -2871,7 +2866,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1"
},
"funding": [
{
@@ -2970,16 +2965,16 @@
},
{
"name": "symfony/stopwatch",
- "version": "v5.2.1",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
- "reference": "2b105c0354f39a63038a1d8bf776ee92852813af"
+ "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2b105c0354f39a63038a1d8bf776ee92852813af",
- "reference": "2b105c0354f39a63038a1d8bf776ee92852813af",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b12274acfab9d9850c52583d136a24398cdf1a0c",
+ "reference": "b12274acfab9d9850c52583d136a24398cdf1a0c",
"shasum": ""
},
"require": {
@@ -3009,10 +3004,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Stopwatch Component",
+ "description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v5.2.1"
+ "source": "https://github.com/symfony/stopwatch/tree/v5.2.3"
},
"funding": [
{
@@ -3028,20 +3023,20 @@
"type": "tidelift"
}
],
- "time": "2020-11-01T16:14:45+00:00"
+ "time": "2021-01-27T10:15:41+00:00"
},
{
"name": "symfony/string",
- "version": "v5.2.1",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed"
+ "reference": "c95468897f408dd0aca2ff582074423dd0455122"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
- "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
+ "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122",
+ "reference": "c95468897f408dd0aca2ff582074423dd0455122",
"shasum": ""
},
"require": {
@@ -3084,7 +3079,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony String component",
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
"homepage": "https://symfony.com",
"keywords": [
"grapheme",
@@ -3095,7 +3090,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v5.2.1"
+ "source": "https://github.com/symfony/string/tree/v5.2.3"
},
"funding": [
{
@@ -3111,7 +3106,7 @@
"type": "tidelift"
}
],
- "time": "2020-12-05T07:33:16+00:00"
+ "time": "2021-01-25T15:14:59+00:00"
}
],
"packages-dev": [
@@ -3260,26 +3255,96 @@
"time": "2020-11-13T08:04:11+00:00"
},
{
- "name": "felixfbecker/advanced-json-rpc",
- "version": "v3.1.2",
+ "name": "dealerdirect/phpcodesniffer-composer-installer",
+ "version": "v0.7.1",
"source": {
"type": "git",
- "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
- "reference": "804ee564f1c7f0bc160d755fc5bdd17a04545070"
+ "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
+ "reference": "fe390591e0241955f22eb9ba327d137e501c771c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/804ee564f1c7f0bc160d755fc5bdd17a04545070",
- "reference": "804ee564f1c7f0bc160d755fc5bdd17a04545070",
+ "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/fe390591e0241955f22eb9ba327d137e501c771c",
+ "reference": "fe390591e0241955f22eb9ba327d137e501c771c",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": ">=5.3",
+ "squizlabs/php_codesniffer": "^2.0 || ^3.0 || ^4.0"
+ },
+ "require-dev": {
+ "composer/composer": "*",
+ "phpcompatibility/php-compatibility": "^9.0",
+ "sensiolabs/security-checker": "^4.1.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Franck Nijhof",
+ "email": "franck.nijhof@dealerdirect.com",
+ "homepage": "http://www.frenck.nl",
+ "role": "Developer / IT Manager"
+ }
+ ],
+ "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
+ "homepage": "http://www.dealerdirect.com",
+ "keywords": [
+ "PHPCodeSniffer",
+ "PHP_CodeSniffer",
+ "code quality",
+ "codesniffer",
+ "composer",
+ "installer",
+ "phpcs",
+ "plugin",
+ "qa",
+ "quality",
+ "standard",
+ "standards",
+ "style guide",
+ "stylecheck",
+ "tests"
+ ],
+ "support": {
+ "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues",
+ "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer"
+ },
+ "time": "2020-12-07T18:04:37+00:00"
+ },
+ {
+ "name": "felixfbecker/advanced-json-rpc",
+ "version": "v3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/felixfbecker/php-advanced-json-rpc.git",
+ "reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/06f0b06043c7438959dbdeed8bb3f699a19be22e",
+ "reference": "06f0b06043c7438959dbdeed8bb3f699a19be22e",
"shasum": ""
},
"require": {
"netresearch/jsonmapper": "^1.0 || ^2.0",
- "php": ">=7.0",
+ "php": "^7.1 || ^8.0",
"phpdocumentor/reflection-docblock": "^4.3.4 || ^5.0.0"
},
"require-dev": {
- "phpunit/phpunit": "^6.0.0"
+ "phpunit/phpunit": "^7.0 || ^8.0"
},
"type": "library",
"autoload": {
@@ -3300,9 +3365,63 @@
"description": "A more advanced JSONRPC implementation",
"support": {
"issues": "https://github.com/felixfbecker/php-advanced-json-rpc/issues",
- "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.1.2"
+ "source": "https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.0"
},
- "time": "2021-01-10T13:07:47+00:00"
+ "time": "2021-01-10T17:48:47+00:00"
+ },
+ {
+ "name": "laminas/laminas-coding-standard",
+ "version": "2.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-coding-standard.git",
+ "reference": "d75f1acf615232e108da2d2cf5a7df3e527b8f38"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laminas/laminas-coding-standard/zipball/d75f1acf615232e108da2d2cf5a7df3e527b8f38",
+ "reference": "d75f1acf615232e108da2d2cf5a7df3e527b8f38",
+ "shasum": ""
+ },
+ "require": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7",
+ "laminas/laminas-zendframework-bridge": "^1.0",
+ "php": "^7.3 || ~8.0.0",
+ "slevomat/coding-standard": "^6.4.1",
+ "squizlabs/php_codesniffer": "^3.5.8",
+ "webimpress/coding-standard": "^1.1.6"
+ },
+ "type": "phpcodesniffer-standard",
+ "autoload": {
+ "psr-4": {
+ "LaminasCodingStandard\\": "src/LaminasCodingStandard/"
+ }
+ },
+ "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"
+ },
+ "funding": [
+ {
+ "url": "https://funding.communitybridge.org/projects/laminas-project",
+ "type": "community_bridge"
+ }
+ ],
+ "time": "2020-10-26T07:33:05+00:00"
},
{
"name": "microsoft/tolerant-php-parser",
@@ -3402,16 +3521,16 @@
},
{
"name": "phan/phan",
- "version": "4.0.2",
+ "version": "4.0.3",
"source": {
"type": "git",
"url": "https://github.com/phan/phan.git",
- "reference": "2e5f16a17aa909c91397c6fbba0309b4fef0df53"
+ "reference": "95171b8a89ff2433e7ebc27d8a133743f7d78d3b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phan/phan/zipball/2e5f16a17aa909c91397c6fbba0309b4fef0df53",
- "reference": "2e5f16a17aa909c91397c6fbba0309b4fef0df53",
+ "url": "https://api.github.com/repos/phan/phan/zipball/95171b8a89ff2433e7ebc27d8a133743f7d78d3b",
+ "reference": "95171b8a89ff2433e7ebc27d8a133743f7d78d3b",
"shasum": ""
},
"require": {
@@ -3473,9 +3592,9 @@
],
"support": {
"issues": "https://github.com/phan/phan/issues",
- "source": "https://github.com/phan/phan/tree/4.0.2"
+ "source": "https://github.com/phan/phan/tree/4.0.3"
},
- "time": "2021-01-09T21:32:36+00:00"
+ "time": "2021-01-30T00:08:54+00:00"
},
{
"name": "phpdocumentor/reflection-common",
@@ -3635,6 +3754,59 @@
},
"time": "2020-09-17T18:55:26+00:00"
},
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "0.4.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/98a088b17966bdf6ee25c8a4b634df313d8aa531",
+ "reference": "98a088b17966bdf6ee25c8a4b634df313d8aa531",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "consistence/coding-standard": "^3.5",
+ "ergebnis/composer-normalize": "^2.0.2",
+ "jakub-onderka/php-parallel-lint": "^0.9.2",
+ "phing/phing": "^2.16.0",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12.26",
+ "phpstan/phpstan-strict-rules": "^0.12",
+ "phpunit/phpunit": "^6.3",
+ "slevomat/coding-standard": "^4.7.2",
+ "symfony/process": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/master"
+ },
+ "time": "2020-08-03T20:32:43+00:00"
+ },
{
"name": "psr/log",
"version": "1.1.3",
@@ -3751,17 +3923,189 @@
},
"time": "2020-10-03T11:02:22+00:00"
},
+ {
+ "name": "slevomat/coding-standard",
+ "version": "6.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/slevomat/coding-standard.git",
+ "reference": "696dcca217d0c9da2c40d02731526c1e25b65346"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/696dcca217d0c9da2c40d02731526c1e25b65346",
+ "reference": "696dcca217d0c9da2c40d02731526c1e25b65346",
+ "shasum": ""
+ },
+ "require": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7",
+ "php": "^7.1 || ^8.0",
+ "phpstan/phpdoc-parser": "0.4.5 - 0.4.9",
+ "squizlabs/php_codesniffer": "^3.5.6"
+ },
+ "require-dev": {
+ "phing/phing": "2.16.3",
+ "php-parallel-lint/php-parallel-lint": "1.2.0",
+ "phpstan/phpstan": "0.12.48",
+ "phpstan/phpstan-deprecation-rules": "0.12.5",
+ "phpstan/phpstan-phpunit": "0.12.16",
+ "phpstan/phpstan-strict-rules": "0.12.5",
+ "phpunit/phpunit": "7.5.20|8.5.5|9.4.0"
+ },
+ "type": "phpcodesniffer-standard",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SlevomatCodingStandard\\": "SlevomatCodingStandard"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.",
+ "support": {
+ "issues": "https://github.com/slevomat/coding-standard/issues",
+ "source": "https://github.com/slevomat/coding-standard/tree/6.4.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kukulich",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-05T12:39:37+00:00"
+ },
+ {
+ "name": "squizlabs/php_codesniffer",
+ "version": "3.5.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+ "reference": "9d583721a7157ee997f235f327de038e7ea6dac4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4",
+ "reference": "9d583721a7157ee997f235f327de038e7ea6dac4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "bin": [
+ "bin/phpcs",
+ "bin/phpcbf"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "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": "https://github.com/squizlabs/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": "2020-10-23T02:01:07+00:00"
+ },
+ {
+ "name": "webimpress/coding-standard",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webimpress/coding-standard.git",
+ "reference": "fbeb31ee876b3c493779d3aa717ebb57ef258e6a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webimpress/coding-standard/zipball/fbeb31ee876b3c493779d3aa717ebb57ef258e6a",
+ "reference": "fbeb31ee876b3c493779d3aa717ebb57ef258e6a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3 || ^8.0",
+ "squizlabs/php_codesniffer": "^3.5.8"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.4.3"
+ },
+ "type": "phpcodesniffer-standard",
+ "extra": {
+ "dev-master": "1.2.x-dev",
+ "dev-develop": "1.3.x-dev"
+ },
+ "autoload": {
+ "psr-4": {
+ "WebimpressCodingStandard\\": "src/WebimpressCodingStandard/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "description": "Webimpress Coding Standard",
+ "keywords": [
+ "Coding Standard",
+ "PSR-2",
+ "phpcs",
+ "psr-12",
+ "webimpress"
+ ],
+ "support": {
+ "issues": "https://github.com/webimpress/coding-standard/issues",
+ "source": "https://github.com/webimpress/coding-standard/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/michalbundyra",
+ "type": "github"
+ }
+ ],
+ "time": "2021-01-11T18:13:55+00:00"
+ },
{
"name": "webmozart/assert",
"version": "1.9.1",
"source": {
"type": "git",
- "url": "https://github.com/webmozart/assert.git",
+ "url": "https://github.com/webmozarts/assert.git",
"reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
"reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
"shasum": ""
},
@@ -3799,8 +4143,8 @@
"validate"
],
"support": {
- "issues": "https://github.com/webmozart/assert/issues",
- "source": "https://github.com/webmozart/assert/tree/master"
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.9.1"
},
"time": "2020-07-08T17:02:28+00:00"
}
diff --git a/phpcs.xml b/phpcs.xml
new file mode 100644
index 0000000..bdd2289
--- /dev/null
+++ b/phpcs.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ src
+
+
+
+
diff --git a/src/ConfigProvider.php b/src/ConfigProvider.php
index 6479d45..cb8e540 100644
--- a/src/ConfigProvider.php
+++ b/src/ConfigProvider.php
@@ -20,12 +20,11 @@ class ConfigProvider
*
* To add a bit of a structure, each section is defined in a separate
* method which returns an array with its configuration.
- *
*/
- public function __invoke() : array
+ public function __invoke(): array
{
return [
- 'dependencies' => $this->getDependencies(),
+ 'dependencies' => $this->getDependencies(),
'form_elements' => $this->getFormElements(),
];
}
@@ -33,12 +32,12 @@ class ConfigProvider
/**
* Returns the container dependencies
*/
- public function getDependencies() : array
+ public function getDependencies(): array
{
return [
- 'aliases' => [
- 'EventManager' => EventManager::class,
- 'doctrine.hydrator' => Hydrator\DoctrineObject::class,
+ 'aliases' => [
+ 'EventManager' => EventManager::class,
+ 'doctrine.hydrator' => Hydrator\DoctrineObject::class,
'doctrine.entity_manager.orm_default' => EntityManager::class,
],
'invokables' => [
@@ -46,7 +45,7 @@ class ConfigProvider
],
'factories' => [
Hydrator\DoctrineObject::class => Hydrator\DoctrineObjectFactory::class,
- EntityManager::class => EntityManagerFactory::class,
+ EntityManager::class => EntityManagerFactory::class,
],
];
}
@@ -54,13 +53,13 @@ class ConfigProvider
/**
* Returns the form dependencies
*/
- public function getFormElements() : array
+ public function getFormElements(): array
{
return [
- 'aliases' => [
+ 'aliases' => [
'doctrine.object_select' => Form\Element\ObjectSelect::class,
],
- 'factories' => [
+ 'factories' => [
Form\Element\ObjectSelect::class => Form\Element\ElementFactory::class,
],
];
diff --git a/src/Form/Element/ElementFactory.php b/src/Form/Element/ElementFactory.php
index 0c82f8a..c613e74 100644
--- a/src/Form/Element/ElementFactory.php
+++ b/src/Form/Element/ElementFactory.php
@@ -1,13 +1,15 @@
get('doctrine.entity_manager.orm_default');
/** @var ObjectSelect|ObjectRadio|ObjectMultiCheckbox $element */
diff --git a/src/Form/Element/Exception/CompositeIdentifierException.php b/src/Form/Element/Exception/CompositeIdentifierException.php
new file mode 100644
index 0000000..2726df9
--- /dev/null
+++ b/src/Form/Element/Exception/CompositeIdentifierException.php
@@ -0,0 +1,11 @@
+proxy) {
@@ -52,10 +51,10 @@ class ObjectMultiCheckbox extends MultiCheckbox
{
if ($value instanceof Traversable) {
$value = ArrayUtils::iteratorToArray($value);
- } elseif ($value == null) {
+ } elseif ($value === null) {
return parent::setValue([]);
} elseif (! is_array($value)) {
- $value = (array)$value;
+ $value = (array) $value;
}
return parent::setValue(array_map([$this->getProxy(), 'getValue'], $value));
diff --git a/src/Form/Element/ObjectRadio.php b/src/Form/Element/ObjectRadio.php
index e563d17..a78deac 100644
--- a/src/Form/Element/ObjectRadio.php
+++ b/src/Form/Element/ObjectRadio.php
@@ -1,5 +1,7 @@
proxy) {
diff --git a/src/Form/Element/ObjectSelect.php b/src/Form/Element/ObjectSelect.php
index c73e98e..4e18226 100644
--- a/src/Form/Element/ObjectSelect.php
+++ b/src/Form/Element/ObjectSelect.php
@@ -1,21 +1,20 @@
proxy) {
@@ -55,7 +54,7 @@ class ObjectSelect extends SelectElement
if (true === $multiple || 'multiple' === $multiple) {
if ($value instanceof Traversable) {
$value = ArrayUtils::iteratorToArray($value);
- } elseif ($value == null) {
+ } elseif ($value === null) {
return parent::setValue([]);
} elseif (! is_array($value)) {
$value = (array) $value;
diff --git a/src/Form/Element/Proxy.php b/src/Form/Element/Proxy.php
index 48aecde..df701df 100644
--- a/src/Form/Element/Proxy.php
+++ b/src/Form/Element/Proxy.php
@@ -1,87 +1,75 @@
setObjectManager($options['object_manager']);
@@ -128,7 +116,10 @@ class Proxy
}
}
- public function getValueOptions()
+ /**
+ * @throws ReflectionException
+ */
+ public function getValueOptions(): array
{
if (empty($this->valueOptions)) {
$this->loadValueOptions();
@@ -139,6 +130,7 @@ class Proxy
/**
* @return array|Traversable
+ * @throws ReflectionException
*/
public function getObjects()
{
@@ -149,21 +141,14 @@ class Proxy
/**
* Set the label for the empty option
- *
- * @param string $emptyItemLabel
- *
- * @return Proxy
*/
- public function setEmptyItemLabel($emptyItemLabel): Proxy
+ public function setEmptyItemLabel(string $emptyItemLabel): Proxy
{
$this->emptyItemLabel = $emptyItemLabel;
return $this;
}
- /**
- * @return string
- */
public function getEmptyItemLabel(): string
{
return $this->emptyItemLabel;
@@ -174,23 +159,19 @@ class Proxy
*/
public function getOptionAttributes(): array
{
- return $this->option_attributes;
+ return $this->optionAttributes;
}
/**
- * @param array $option_attributes
+ * @param array $optionAttributes
*/
- public function setOptionAttributes(array $option_attributes)
+ public function setOptionAttributes(array $optionAttributes)
{
- $this->option_attributes = $option_attributes;
+ $this->optionAttributes = $optionAttributes;
}
/**
* Set a flag, whether to include the empty option at the beginning or not
- *
- * @param boolean $displayEmptyItem
- *
- * @return Proxy
*/
public function setDisplayEmptyItem(bool $displayEmptyItem): Proxy
{
@@ -199,9 +180,6 @@ class Proxy
return $this;
}
- /**
- * @return boolean
- */
public function getDisplayEmptyItem(): bool
{
return $this->displayEmptyItem;
@@ -209,10 +187,6 @@ class Proxy
/**
* Set the object manager
- *
- * @param ObjectManager $objectManager
- *
- * @return Proxy
*/
public function setObjectManager(ObjectManager $objectManager): Proxy
{
@@ -223,8 +197,6 @@ class Proxy
/**
* Get the object manager
- *
- * @return ObjectManager
*/
public function getObjectManager(): ObjectManager
{
@@ -233,10 +205,6 @@ class Proxy
/**
* Set the FQCN of the target object
- *
- * @param string $targetClass
- *
- * @return Proxy
*/
public function setTargetClass(string $targetClass): Proxy
{
@@ -247,8 +215,6 @@ class Proxy
/**
* Get the target class
- *
- * @return string
*/
public function getTargetClass(): string
{
@@ -257,10 +223,6 @@ class Proxy
/**
* Set the property to use as the label in the options
- *
- * @param string $property
- *
- * @return Proxy
*/
public function setProperty(string $property): Proxy
{
@@ -269,9 +231,6 @@ class Proxy
return $this;
}
- /**
- * @return string
- */
public function getProperty(): string
{
return $this->property;
@@ -281,7 +240,6 @@ class Proxy
* Set the label generator callable that is responsible for generating labels for the items in the collection
*
* @param callable $callable A callable used to create a label based off of an Entity
- *
* @return void
* @throws InvalidArgumentException
*/
@@ -296,41 +254,26 @@ class Proxy
$this->labelGenerator = $callable;
}
- /**
- * @return callable|null
- */
public function getLabelGenerator(): ?callable
{
return $this->labelGenerator;
}
- /**
- * @return string|null
- */
public function getOptgroupIdentifier(): ?string
{
return $this->optgroupIdentifier;
}
- /**
- * @param string $optgroupIdentifier
- */
public function setOptgroupIdentifier(string $optgroupIdentifier)
{
$this->optgroupIdentifier = (string) $optgroupIdentifier;
}
- /**
- * @return string|null
- */
public function getOptgroupDefault(): ?string
{
return $this->optgroupDefault;
}
- /**
- * @param string $optgroupDefault
- */
public function setOptgroupDefault(string $optgroupDefault)
{
$this->optgroupDefault = (string) $optgroupDefault;
@@ -338,10 +281,6 @@ class Proxy
/**
* Set if the property is a method to use as the label in the options
- *
- * @param boolean $method
- *
- * @return Proxy
*/
public function setIsMethod(bool $method): Proxy
{
@@ -361,8 +300,6 @@ class Proxy
/** Set the findMethod property to specify the method to use on repository
*
* @param array $findMethod
- *
- * @return Proxy
*/
public function setFindMethod(array $findMethod): Proxy
{
@@ -382,9 +319,7 @@ class Proxy
}
/**
- * @param $targetEntity
- *
- * @return string|null
+ * @param Entity $targetEntity
*/
protected function generateLabel($targetEntity): ?string
{
@@ -396,8 +331,7 @@ class Proxy
}
/**
- * @param $value
- *
+ * @param Collection|Entity $value
* @return array|mixed|object
* @throws RuntimeException
*/
@@ -429,7 +363,7 @@ class Proxy
// TODO: handle composite (multiple) identifiers
if (null !== $identifier && count($identifier) > 1) {
- //$value = $key;
+ throw new CompositeIdentifierException("Can't handle composite identifiers");
} else {
$value = current($metadata->getIdentifierValues($value));
}
@@ -443,10 +377,10 @@ class Proxy
* Load objects
*
* @return void
- * @throws Exception\InvalidRepositoryResultException
+ * @throws InvalidRepositoryResultException
* @throws ReflectionException
* @throws RuntimeException
- * @throws \Exception
+ * @throws Exception
*/
protected function loadObjects()
{
@@ -513,8 +447,8 @@ class Proxy
/**
* Load value options
*
- * @throws RuntimeException
* @return void
+ * @throws RuntimeException|ReflectionException
*/
protected function loadValueOptions()
{
@@ -540,7 +474,7 @@ class Proxy
if (null !== ($generatedLabel = $this->generateLabel($object))) {
$label = $generatedLabel;
} elseif ($property = $this->property) {
- if ($this->isMethod == false && ! $metadata->hasField($property)) {
+ if ($this->isMethod === false && ! $metadata->hasField($property)) {
throw new RuntimeException(
sprintf(
'Property "%s" could not be found in object "%s"',
@@ -551,7 +485,7 @@ class Proxy
}
$inflector = InflectorFactory::create()->build();
- $getter = 'get' . $inflector->classify($property);
+ $getter = 'get' . $inflector->classify($property);
if (! is_callable([$object, $getter])) {
throw new RuntimeException(
@@ -604,15 +538,16 @@ class Proxy
}
// If no optgroup_identifier has been configured, apply default handling and continue
- if (is_null($this->getOptgroupIdentifier())) {
+ $optGroupId = $this->getOptgroupIdentifier();
+ if ($optGroupId === null) {
$options[] = ['label' => $label, 'value' => $value, 'attributes' => $optionAttributes];
continue;
}
// optgroup_identifier found, handle grouping
- $inflector = InflectorFactory::create()->build();
- $optgroupGetter = 'get' . $inflector->classify($this->getOptgroupIdentifier());
+ $inflector = InflectorFactory::create()->build();
+ $optgroupGetter = 'get' . $inflector->classify($optGroupId);
if (! is_callable([$object, $optgroupGetter])) {
throw new RuntimeException(
@@ -623,7 +558,7 @@ class Proxy
$optgroup = $object->{$optgroupGetter}();
// optgroup_identifier contains a valid group-name. Handle default grouping.
- if (false === is_null($optgroup) && trim($optgroup) !== '') {
+ if ($optgroup !== null && trim($optgroup) !== '') {
$options[$optgroup]['label'] = $optgroup;
$options[$optgroup]['options'][] = [
'label' => $label,
@@ -637,7 +572,7 @@ class Proxy
$optgroupDefault = $this->getOptgroupDefault();
// No optgroup_default has been provided. Line up without a group
- if (is_null($optgroupDefault)) {
+ if ($optgroupDefault === null) {
$options[] = ['label' => $label, 'value' => $value, 'attributes' => $optionAttributes];
continue;
diff --git a/src/Hydrator/DoctrineObject.php b/src/Hydrator/DoctrineObject.php
index 8444419..186e560 100755
--- a/src/Hydrator/DoctrineObject.php
+++ b/src/Hydrator/DoctrineObject.php
@@ -1,4 +1,5 @@
.
*/
+declare(strict_types=1);
+
namespace DoctrineMezzioModule\Hydrator;
use DateTime;
use DateTimeImmutable;
-use Doctrine\Persistence\Mapping\ClassMetadata;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Inflector\InflectorFactory;
+use Doctrine\Persistence\Mapping\ClassMetadata;
use Exception;
use InvalidArgumentException;
+use Laminas\Hydrator\AbstractHydrator;
+use Laminas\Hydrator\Filter\FilterProviderInterface;
+use Laminas\Stdlib\ArrayUtils;
use ReflectionException;
use RuntimeException;
use Traversable;
-use Laminas\Stdlib\ArrayUtils;
-use Laminas\Hydrator\AbstractHydrator;
-use Laminas\Hydrator\Filter\FilterProviderInterface;
+
+use function array_filter;
+use function array_flip;
+use function array_intersect_key;
+use function array_key_exists;
+use function array_keys;
+use function array_merge;
+use function ctype_upper;
+use function current;
+use function get_class;
+use function get_class_methods;
+use function gettype;
+use function in_array;
+use function is_array;
+use function is_int;
+use function is_object;
+use function is_string;
+use function ltrim;
+use function method_exists;
+use function property_exists;
+use function sprintf;
+use function substr;
+use function ucfirst;
/**
* This hydrator has been completely refactored for DoctrineModule 0.7.0. It provides an easy and powerful way
@@ -39,29 +65,19 @@ use Laminas\Hydrator\Filter\FilterProviderInterface;
*
* Starting from DoctrineModule 0.8.0, the hydrator can be used multiple times with different objects
*
- * @license MIT
* @link http://www.doctrine-project.org/
+ * @license MIT
+ *
* @since 0.7.0
- * @author Michael Gallego
*/
class DoctrineObject extends AbstractHydrator
{
- /**
- * @var ObjectManager
- */
protected ObjectManager $objectManager;
- /**
- * @var ClassMetadata
- */
protected ClassMetadata $metadata;
- /**
- * @var bool
- */
protected bool $byValue = true;
-
/**
* Constructor
*
@@ -77,7 +93,6 @@ class DoctrineObject extends AbstractHydrator
/**
* Extract values from an object
*
- * @param object $object
* @return array
* @throws ReflectionException
*/
@@ -96,8 +111,6 @@ class DoctrineObject extends AbstractHydrator
* Hydrate $object with the provided $data.
*
* @param array $data
- * @param object $object
- * @return object
* @throws ReflectionException
* @throws Exception
*/
@@ -115,7 +128,6 @@ class DoctrineObject extends AbstractHydrator
/**
* Prepare the hydrator by adding strategies to every collection valued associations
*
- * @param object $object
* @return void
*/
protected function prepare(object $object)
@@ -137,7 +149,7 @@ class DoctrineObject extends AbstractHydrator
foreach ($associations as $association) {
if ($this->metadata->isCollectionValuedAssociation($association)) {
// Add a strategy if the association has none set by user
- if (!$this->hasStrategy($association)) {
+ if (! $this->hasStrategy($association)) {
if ($this->byValue) {
$this->addStrategy($association, new Strategy\AllowRemoveByValue());
} else {
@@ -147,7 +159,7 @@ class DoctrineObject extends AbstractHydrator
$strategy = $this->getStrategy($association);
- if (!$strategy instanceof Strategy\AbstractCollectionStrategy) {
+ if (! $strategy instanceof Strategy\AbstractCollectionStrategy) {
throw new InvalidArgumentException(
sprintf(
'Strategies used for collections valued associations must inherit from '
@@ -167,7 +179,6 @@ class DoctrineObject extends AbstractHydrator
* Extract values from an object using a by-value logic (this means that it uses the entity
* API, in this case, getters)
*
- * @param object $object
* @return array
* @throws RuntimeException
*/
@@ -181,22 +192,24 @@ class DoctrineObject extends AbstractHydrator
$data = [];
foreach ($fieldNames as $fieldName) {
- if ($filter && !$filter->filter($fieldName)) {
+ if ($filter && ! $filter->filter($fieldName)) {
continue;
}
$inflector = InflectorFactory::create()->build();
- $getter = 'get' . $inflector->classify($fieldName);
- $isser = 'is' . $inflector->classify($fieldName);
+ $getter = 'get' . $inflector->classify($fieldName);
+ $isser = 'is' . $inflector->classify($fieldName);
$dataFieldName = $this->computeExtractFieldName($fieldName);
if (in_array($getter, $methods)) {
$data[$dataFieldName] = $this->extractValue($fieldName, $object->$getter(), $object);
} elseif (in_array($isser, $methods)) {
$data[$dataFieldName] = $this->extractValue($fieldName, $object->$isser(), $object);
- } elseif (substr($fieldName, 0, 2) === 'is'
+ } elseif (
+ substr($fieldName, 0, 2) === 'is'
&& ctype_upper(substr($fieldName, 2, 1))
- && in_array($fieldName, $methods)) {
+ && in_array($fieldName, $methods)
+ ) {
$data[$dataFieldName] = $this->extractValue($fieldName, $object->$fieldName(), $object);
}
@@ -210,7 +223,6 @@ class DoctrineObject extends AbstractHydrator
* Extract values from an object using a by-reference logic (this means that values are
* directly fetched without using the public API of the entity, in this case, getters)
*
- * @param object $object
* @return array
* @throws ReflectionException
*/
@@ -224,7 +236,7 @@ class DoctrineObject extends AbstractHydrator
$data = [];
foreach ($fieldNames as $fieldName) {
- if ($filter && !$filter->filter($fieldName)) {
+ if ($filter && ! $filter->filter($fieldName)) {
continue;
}
$reflProperty = $refl->getProperty($fieldName);
@@ -242,8 +254,6 @@ class DoctrineObject extends AbstractHydrator
* case, setters)
*
* @param array $data
- * @param object $object
- * @return object
* @throws RuntimeException|ReflectionException
* @throws Exception
*/
@@ -257,10 +267,10 @@ class DoctrineObject extends AbstractHydrator
}
foreach ($data as $field => $value) {
- $field = $this->computeHydrateFieldName($field);
- $value = $this->handleTypeConversions($value, $metadata->getTypeOfField($field));
+ $field = $this->computeHydrateFieldName($field);
+ $value = $this->handleTypeConversions($value, $metadata->getTypeOfField($field));
$inflector = InflectorFactory::create()->build();
- $setter = 'set' . $inflector->classify($field);
+ $setter = 'set' . $inflector->classify($field);
if ($metadata->hasAssociation($field)) {
$target = $metadata->getAssociationTargetClass($field);
@@ -272,8 +282,9 @@ class DoctrineObject extends AbstractHydrator
$value = $this->toOne($target, $this->hydrateValue($field, $value, $data));
- if (null === $value
- && !current($metadata->getReflectionClass()->getMethod($setter)->getParameters())->allowsNull()
+ if (
+ null === $value
+ && ! current($metadata->getReflectionClass()->getMethod($setter)->getParameters())->allowsNull()
) {
continue;
}
@@ -300,8 +311,6 @@ class DoctrineObject extends AbstractHydrator
* setters)
*
* @param array $data
- * @param object $object
- * @return object
* @throws Exception
*/
protected function hydrateByReference(array $data, object $object): object
@@ -318,7 +327,7 @@ class DoctrineObject extends AbstractHydrator
$field = $this->computeHydrateFieldName($field);
// Ignore unknown fields
- if (!$refl->hasProperty($field)) {
+ if (! $refl->hasProperty($field)) {
continue;
}
@@ -349,8 +358,6 @@ class DoctrineObject extends AbstractHydrator
* tricks like setting manually the existing id directly into the entity
*
* @param array $data The data that may contain identifiers keys
- * @param object $object
- * @return object
*/
protected function tryConvertArrayToObject(array $data, object $object): ?object
{
@@ -363,7 +370,7 @@ class DoctrineObject extends AbstractHydrator
}
foreach ($identifierNames as $identifierName) {
- if (!isset($data[$identifierName])) {
+ if (! isset($data[$identifierName])) {
return $object;
}
@@ -381,22 +388,20 @@ class DoctrineObject extends AbstractHydrator
* and a target instance will be initialized and then hydrated. The hydrated
* target will be returned.
*
- * @param string $target
* @param mixed $value
- * @return object
* @throws ReflectionException
*/
protected function toOne(string $target, $value): ?object
{
$metadata = $this->objectManager->getClassMetadata($target);
- if (is_array($value) && array_keys($value) != $metadata->getIdentifier()) {
+ if (is_array($value) && array_keys($value) !== $metadata->getIdentifier()) {
// $value is most likely an array of fieldset data
$identifiers = array_intersect_key(
$value,
array_flip($metadata->getIdentifier())
);
- $object = $this->find($identifiers, $target) ?: new $target;
+ $object = $this->find($identifiers, $target) ?: new $target();
return $this->hydrate($value, $object);
}
@@ -409,11 +414,8 @@ class DoctrineObject extends AbstractHydrator
* strategies that inherit from AbstractCollectionStrategy class, and that add or remove elements but without
* changing the collection of the object
*
- * @param object $object
* @param mixed $collectionName
- * @param string $target
* @param mixed $values
- *
* @return void
* @throws InvalidArgumentException|ReflectionException
*/
@@ -422,8 +424,8 @@ class DoctrineObject extends AbstractHydrator
$metadata = $this->objectManager->getClassMetadata(ltrim($target, '\\'));
$identifier = $metadata->getIdentifier();
- if (!is_array($values) && !$values instanceof Traversable) {
- $values = (array)$values;
+ if (! is_array($values) && ! $values instanceof Traversable) {
+ $values = (array) $values;
}
$collection = [];
@@ -453,7 +455,7 @@ class DoctrineObject extends AbstractHydrator
}
break;
case 'array':
- if (array_key_exists($field, $value) && $value[$field] != null) {
+ if (array_key_exists($field, $value) && $value[$field] !== null) {
$find[$field] = $value[$field];
unset($value[$field]); // removed identifier from persistable data
}
@@ -465,10 +467,10 @@ class DoctrineObject extends AbstractHydrator
}
}
- if (!empty($find) && $found = $this->find($find, $target)) {
- $collection[] = (is_array($value)) ? $this->hydrate($value, $found) : $found;
+ if (! empty($find) && $found = $this->find($find, $target)) {
+ $collection[] = is_array($value) ? $this->hydrate($value, $found) : $found;
} else {
- $collection[] = (is_array($value)) ? $this->hydrate($value, new $target) : new $target;
+ $collection[] = is_array($value) ? $this->hydrate($value, new $target()) : new $target();
}
}
@@ -494,7 +496,6 @@ class DoctrineObject extends AbstractHydrator
* Handle various type conversions that should be supported natively by Doctrine (like DateTime)
*
* @param mixed $value
- * @param string $typeOfField
* @return DateTime|DateTimeImmutable|null
* @throws Exception
*/
@@ -545,9 +546,6 @@ class DoctrineObject extends AbstractHydrator
* Find an object by a given target class and identifier
*
* @param mixed $identifiers
- * @param string $targetClass
- *
- * @return object|null
*/
protected function find($identifiers, string $targetClass): ?object
{
@@ -566,8 +564,6 @@ class DoctrineObject extends AbstractHydrator
* Verifies if a provided identifier is to be considered null
*
* @param mixed $identifier
- *
- * @return bool
*/
private function isNullIdentifier($identifier): bool
{
@@ -591,10 +587,6 @@ class DoctrineObject extends AbstractHydrator
/**
* Applies the naming strategy if there is one set
- *
- * @param string $field
- *
- * @return string
*/
protected function computeHydrateFieldName(string $field): string
{
@@ -606,10 +598,6 @@ class DoctrineObject extends AbstractHydrator
/**
* Applies the naming strategy if there is one set
- *
- * @param string $field
- *
- * @return string
*/
protected function computeExtractFieldName(string $field): string
{
diff --git a/src/Hydrator/DoctrineObjectFactory.php b/src/Hydrator/DoctrineObjectFactory.php
index f9ef8b4..bd988ef 100644
--- a/src/Hydrator/DoctrineObjectFactory.php
+++ b/src/Hydrator/DoctrineObjectFactory.php
@@ -1,12 +1,13 @@
get('doctrine.entity_manager.orm_default');
diff --git a/src/Hydrator/Filter/PropertyName.php b/src/Hydrator/Filter/PropertyName.php
index 2cd1c8c..e5f6698 100644
--- a/src/Hydrator/Filter/PropertyName.php
+++ b/src/Hydrator/Filter/PropertyName.php
@@ -1,4 +1,5 @@
.
*/
+declare(strict_types=1);
+
namespace DoctrineMezzioModule\Hydrator\Filter;
use Laminas\Hydrator\Filter\FilterInterface;
+use function in_array;
+use function is_array;
+
/**
* Provides a filter to restrict returned fields by whitelisting or
* blacklisting property names.
*
- * @license MIT
* @link http://www.doctrine-project.org/
- * @author Liam O'Boyle
+ * @license MIT
*/
class PropertyName implements FilterInterface
{
@@ -40,10 +45,8 @@ class PropertyName implements FilterInterface
/**
* Either an exclude or an include.
- *
- * @var bool
*/
- protected $exclude = null;
+ protected ?bool $exclude = null;
/**
* @param string|array $properties The properties to exclude or include.
@@ -60,7 +63,7 @@ class PropertyName implements FilterInterface
public function filter(string $property): bool
{
return in_array($property, $this->properties)
- ? !$this->exclude
+ ? ! $this->exclude
: $this->exclude;
}
}
diff --git a/src/Hydrator/Strategy/AbstractCollectionStrategy.php b/src/Hydrator/Strategy/AbstractCollectionStrategy.php
index c65b033..4f6f0b6 100644
--- a/src/Hydrator/Strategy/AbstractCollectionStrategy.php
+++ b/src/Hydrator/Strategy/AbstractCollectionStrategy.php
@@ -1,4 +1,5 @@
.
*/
+declare(strict_types=1);
+
namespace DoctrineMezzioModule\Hydrator\Strategy;
-use InvalidArgumentException;
use Doctrine\Common\Collections\Collection;
use Doctrine\Persistence\Mapping\ClassMetadata;
+use InvalidArgumentException;
use Laminas\Hydrator\Strategy\StrategyInterface;
+use ReflectionException;
+
+use function get_class;
+use function is_object;
+use function method_exists;
+use function spl_object_hash;
+use function sprintf;
+use function strcmp;
+use function ucfirst;
/**
- * @license MIT
* @link http://www.doctrine-project.org/
+ * @license MIT
+ *
* @since 0.7.0
- * @author Michael Gallego
*/
abstract class AbstractCollectionStrategy implements StrategyInterface
{
- /**
- * @var string
- */
- protected $collectionName;
+ protected string $collectionName;
- /**
- * @var ClassMetadata
- */
- protected $metadata;
-
- /**
- * @var object
- */
- protected $object;
+ protected ClassMetadata $metadata;
+ protected object $object;
/**
* Set the name of the collection
- *
- * @param string $collectionName
- * @return AbstractCollectionStrategy
*/
public function setCollectionName(string $collectionName): AbstractCollectionStrategy
{
@@ -62,8 +61,6 @@ abstract class AbstractCollectionStrategy implements StrategyInterface
/**
* Get the name of the collection
- *
- * @return string
*/
public function getCollectionName(): string
{
@@ -72,9 +69,6 @@ abstract class AbstractCollectionStrategy implements StrategyInterface
/**
* Set the class metadata
- *
- * @param ClassMetadata $classMetadata
- * @return AbstractCollectionStrategy
*/
public function setClassMetadata(ClassMetadata $classMetadata): AbstractCollectionStrategy
{
@@ -84,8 +78,6 @@ abstract class AbstractCollectionStrategy implements StrategyInterface
/**
* Get the class metadata
- *
- * @return ClassMetadata
*/
public function getClassMetadata(): ClassMetadata
{
@@ -95,16 +87,13 @@ abstract class AbstractCollectionStrategy implements StrategyInterface
/**
* Set the object
*
- * @param object $object
- *
- * @return AbstractCollectionStrategy
* @throws InvalidArgumentException
*/
public function setObject(object $object): AbstractCollectionStrategy
{
- if (!is_object($object)) {
+ if (! is_object($object)) {
throw new InvalidArgumentException(
- sprintf('The parameter given to setObject method of %s class is not an object', get_called_class())
+ sprintf('The parameter given to setObject method of %s class is not an object', static::class)
);
}
@@ -114,8 +103,6 @@ abstract class AbstractCollectionStrategy implements StrategyInterface
/**
* Get the object
- *
- * @return object
*/
public function getObject(): object
{
@@ -133,16 +120,14 @@ abstract class AbstractCollectionStrategy implements StrategyInterface
/**
* Return the collection by value (using the public API)
*
- * @throws \InvalidArgumentException
- *
- * @return Collection
+ * @throws InvalidArgumentException
*/
protected function getCollectionFromObjectByValue(): Collection
{
$object = $this->getObject();
$getter = 'get' . ucfirst($this->getCollectionName());
- if (!method_exists($object, $getter)) {
+ if (! method_exists($object, $getter)) {
throw new InvalidArgumentException(
sprintf(
'The getter %s to access collection %s in object %s does not exist',
@@ -159,8 +144,7 @@ abstract class AbstractCollectionStrategy implements StrategyInterface
/**
* Return the collection by reference (not using the public API)
*
- * @return Collection
- * @throws \ReflectionException
+ * @throws ReflectionException
*/
protected function getCollectionFromObjectByReference(): Collection
{
@@ -173,15 +157,9 @@ abstract class AbstractCollectionStrategy implements StrategyInterface
return $reflProperty->getValue($object);
}
-
/**
* This method is used internally by array_udiff to check if two objects are equal, according to their
* SPL hash. This is needed because the native array_diff only compare strings
- *
- * @param object $a
- * @param object $b
- *
- * @return int
*/
protected function compareObjects(object $a, object $b): int
{
diff --git a/src/Hydrator/Strategy/AllowRemoveByReference.php b/src/Hydrator/Strategy/AllowRemoveByReference.php
index b457e40..0c21ff4 100644
--- a/src/Hydrator/Strategy/AllowRemoveByReference.php
+++ b/src/Hydrator/Strategy/AllowRemoveByReference.php
@@ -1,4 +1,5 @@
.
*/
+declare(strict_types=1);
+
namespace DoctrineMezzioModule\Hydrator\Strategy;
use Doctrine\Common\Collections\Collection;
+use ReflectionException;
+
+use function array_udiff;
/**
* When this strategy is used for Collections, if the new collection does not contain elements that are present in
@@ -29,16 +35,17 @@ use Doctrine\Common\Collections\Collection;
*
* This strategy is by reference, this means it won't use public API to add/remove elements to the collection
*
- * @license MIT
* @link http://www.doctrine-project.org/
+ * @license MIT
+ *
* @since 0.7.0
- * @author Michael Gallego
*/
class AllowRemoveByReference extends AbstractCollectionStrategy
{
/**
* {@inheritDoc}
- * @throws \ReflectionException
+ *
+ * @throws ReflectionException
*/
public function hydrate($value, $data = null): Collection
{
diff --git a/src/Hydrator/Strategy/AllowRemoveByValue.php b/src/Hydrator/Strategy/AllowRemoveByValue.php
index e783c88..e48c61b 100644
--- a/src/Hydrator/Strategy/AllowRemoveByValue.php
+++ b/src/Hydrator/Strategy/AllowRemoveByValue.php
@@ -1,4 +1,5 @@
.
*/
+declare(strict_types=1);
+
namespace DoctrineMezzioModule\Hydrator\Strategy;
+use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use LogicException;
-use Doctrine\Common\Collections\ArrayCollection;
+
+use function array_udiff;
+use function get_class;
+use function method_exists;
+use function sprintf;
+use function ucfirst;
/**
* When this strategy is used for Collections, if the new collection does not contain elements that are present in
@@ -31,10 +40,10 @@ use Doctrine\Common\Collections\ArrayCollection;
*
* This strategy is by value, this means it will use the public API (in this case, adder and remover)
*
- * @license MIT
* @link http://www.doctrine-project.org/
+ * @license MIT
+ *
* @since 0.7.0
- * @author Michael Gallego
*/
class AllowRemoveByValue extends AbstractCollectionStrategy
{
@@ -47,7 +56,7 @@ class AllowRemoveByValue extends AbstractCollectionStrategy
$adder = 'add' . ucfirst($this->collectionName);
$remover = 'remove' . ucfirst($this->collectionName);
- if (!method_exists($this->object, $adder) || !method_exists($this->object, $remover)) {
+ if (! method_exists($this->object, $adder) || ! method_exists($this->object, $remover)) {
throw new LogicException(
sprintf(
'AllowRemove strategy for DoctrineModule hydrator requires both %s and %s to be defined in %s
@@ -63,9 +72,9 @@ class AllowRemoveByValue extends AbstractCollectionStrategy
if ($collection instanceof Collection) {
$collection = $collection->toArray();
+ /** @var array $collection */
}
- /** @var array $collection */
$toAdd = new ArrayCollection(array_udiff($value, $collection, [$this, 'compareObjects']));
$toRemove = new ArrayCollection(array_udiff($collection, $value, [$this, 'compareObjects']));
diff --git a/src/Hydrator/Strategy/DisallowRemoveByReference.php b/src/Hydrator/Strategy/DisallowRemoveByReference.php
index 0640002..b92c5a0 100644
--- a/src/Hydrator/Strategy/DisallowRemoveByReference.php
+++ b/src/Hydrator/Strategy/DisallowRemoveByReference.php
@@ -1,4 +1,5 @@
.
*/
+declare(strict_types=1);
+
namespace DoctrineMezzioModule\Hydrator\Strategy;
+use Doctrine\Common\Collections\Collection;
+use ReflectionException;
+
+use function array_udiff;
+
/**
* When this strategy is used for Collections, if the new collection does not contain elements that are present in
* the original collection, then this strategy will not remove those elements. At most, it will add new elements. For
@@ -27,18 +35,19 @@ namespace DoctrineMezzioModule\Hydrator\Strategy;
*
* This strategy is by reference, this means it won't use the public API to remove elements
*
- * @license MIT
* @link http://www.doctrine-project.org/
+ * @license MIT
+ *
* @since 0.7.0
- * @author Michael Gallego
*/
class DisallowRemoveByReference extends AbstractCollectionStrategy
{
/**
* {@inheritDoc}
- * @throws \ReflectionException
+ *
+ * @throws ReflectionException
*/
- public function hydrate($value, $data = null)
+ public function hydrate($value, $data = null): Collection
{
$collection = $this->getCollectionFromObjectByReference();
$collectionArray = $collection->toArray();
diff --git a/src/Hydrator/Strategy/DisallowRemoveByValue.php b/src/Hydrator/Strategy/DisallowRemoveByValue.php
index e173e00..500a83b 100644
--- a/src/Hydrator/Strategy/DisallowRemoveByValue.php
+++ b/src/Hydrator/Strategy/DisallowRemoveByValue.php
@@ -1,4 +1,5 @@
.
*/
+declare(strict_types=1);
+
namespace DoctrineMezzioModule\Hydrator\Strategy;
+use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use LogicException;
-use Doctrine\Common\Collections\ArrayCollection;
+
+use function array_udiff;
+use function get_class;
+use function method_exists;
+use function sprintf;
+use function ucfirst;
/**
* When this strategy is used for Collections, if the new collection does not contain elements that are present in
@@ -31,10 +40,10 @@ use Doctrine\Common\Collections\ArrayCollection;
*
* This strategy is by value, this means it will use the public API (in this case, remover)
*
- * @license MIT
* @link http://www.doctrine-project.org/
+ * @license MIT
+ *
* @since 0.7.0
- * @author Michael Gallego
*/
class DisallowRemoveByValue extends AbstractCollectionStrategy
{
@@ -46,7 +55,7 @@ class DisallowRemoveByValue extends AbstractCollectionStrategy
// AllowRemove strategy need "adder"
$adder = 'add' . ucfirst($this->collectionName);
- if (!method_exists($this->object, $adder)) {
+ if (! method_exists($this->object, $adder)) {
throw new LogicException(
sprintf(
'DisallowRemove strategy for DoctrineModule hydrator requires %s to
diff --git a/src/Validator/NoObjectExists.php b/src/Validator/NoObjectExists.php
index 89dee39..4a08ec8 100644
--- a/src/Validator/NoObjectExists.php
+++ b/src/Validator/NoObjectExists.php
@@ -1,27 +1,29 @@
*/
class NoObjectExists extends ObjectExists
{
/**
* Error constants
*/
- const ERROR_OBJECT_FOUND = 'objectFound';
+ public const ERROR_OBJECT_FOUND = 'objectFound';
- /**
- * @var array Message templates
- */
- protected $messageTemplates = [
- self::ERROR_OBJECT_FOUND => "An object matching '%value%' was found",
+ /** @var array Message templates */
+ protected array $messageTemplates = [
+ self::ERROR_OBJECT_FOUND => "An object matching '%value%' was found",
];
/**
diff --git a/src/Validator/ObjectExists.php b/src/Validator/ObjectExists.php
index 15e331f..cae4322 100644
--- a/src/Validator/ObjectExists.php
+++ b/src/Validator/ObjectExists.php
@@ -4,30 +4,38 @@ declare(strict_types=1);
namespace DoctrineMezzioModule\Validator;
-use Laminas\Validator\AbstractValidator;
-use Laminas\Validator\Exception;
use Doctrine\Common\Persistence\ObjectRepository;
use Laminas\Stdlib\ArrayUtils;
+use Laminas\Validator\AbstractValidator;
+use Laminas\Validator\Exception;
+
+use function array_combine;
+use function array_key_exists;
+use function array_values;
+use function count;
+use function get_class;
+use function gettype;
+use function is_object;
+use function is_string;
+use function sprintf;
/**
* Class that validates if objects exist in a given repository with a given list of matched fields
*
- * @license MIT
* @link http://www.doctrine-project.org/
+ * @license MIT
+ *
* @since 0.4.0
- * @author Marco Pivetta
*/
class ObjectExists extends AbstractValidator
{
/**
* Error constants
*/
- const ERROR_NO_OBJECT_FOUND = 'noObjectFound';
+ public const ERROR_NO_OBJECT_FOUND = 'noObjectFound';
- /**
- * @var array Message templates
- */
- protected $messageTemplates = [
+ /** @var array Message templates */
+ protected array $messageTemplates = [
self::ERROR_NO_OBJECT_FOUND => "No object matching '%value%' was found",
];
@@ -62,7 +70,7 @@ class ObjectExists extends AbstractValidator
if (is_object($options['object_repository'])) {
$provided = get_class($options['object_repository']);
} else {
- $provided = getType($options['object_repository']);
+ $provided = gettype($options['object_repository']);
}
}
@@ -144,7 +152,7 @@ class ObjectExists extends AbstractValidator
$matchedFieldsValues = @array_combine($this->fields, $value);
/** @phan-suppress-next-line PhanTypeComparisonToArray */
- if (false === $matchedFieldsValues) { //
+ if (false === $matchedFieldsValues) {
throw new Exception\RuntimeException(
sprintf(
'Provided values count is %s, while expected number of fields to be matched is %s',
diff --git a/src/Validator/Service/AbstractValidatorFactory.php b/src/Validator/Service/AbstractValidatorFactory.php
index 1f2a624..1140d15 100644
--- a/src/Validator/Service/AbstractValidatorFactory.php
+++ b/src/Validator/Service/AbstractValidatorFactory.php
@@ -1,38 +1,40 @@
* @phan-file-suppress PhanTypeInvalidThrowsIsInterface
*/
abstract class AbstractValidatorFactory implements FactoryInterface
{
- const DEFAULT_OBJECTMANAGER_KEY = 'doctrine.entity_manager.orm_default';
+ public const DEFAULT_OBJECTMANAGER_KEY = 'doctrine.entity_manager.orm_default';
- protected $creationOptions = [];
+ protected array $creationOptions = [];
- protected $validatorClass;
+ protected string $validatorClass;
/**
- * @param ContainerInterface $container
* @param array $options
- * @return ObjectRepository
* @throws ServiceCreationException
*/
protected function getRepository(ContainerInterface $container, array $options): ObjectRepository
@@ -40,12 +42,12 @@ abstract class AbstractValidatorFactory implements FactoryInterface
if (empty($options['target_class'])) {
throw new ServiceCreationException(sprintf(
"Option 'target_class' is missing when creating validator %s",
- __CLASS__
+ self::class
));
}
- $objectManager = $this->getObjectManager($container, $options);
- $targetClassName = $options['target_class'];
+ $objectManager = $this->getObjectManager($container, $options);
+ $targetClassName = $options['target_class'];
/** @var ObjectRepository $objectRepository */
$objectRepository = $objectManager->getRepository($targetClassName);
@@ -53,7 +55,6 @@ abstract class AbstractValidatorFactory implements FactoryInterface
}
/**
- * @param ContainerInterface $container
* @param array $options
* @return ObjectManager
*/
@@ -96,8 +97,6 @@ abstract class AbstractValidatorFactory implements FactoryInterface
}
/**
- * @param ServiceLocatorInterface $serviceLocator
- * @return object
* @throws ContainerException
*/
public function createService(ServiceLocatorInterface $serviceLocator): object
diff --git a/src/Validator/Service/Exception/ServiceCreationException.php b/src/Validator/Service/Exception/ServiceCreationException.php
index 15fbc3c..301e1d2 100644
--- a/src/Validator/Service/Exception/ServiceCreationException.php
+++ b/src/Validator/Service/Exception/ServiceCreationException.php
@@ -1,15 +1,16 @@
*/
class ServiceCreationException extends BaseRuntimeException
{
diff --git a/src/Validator/Service/NoObjectExistsFactory.php b/src/Validator/Service/NoObjectExistsFactory.php
index ff93bec..067ca55 100644
--- a/src/Validator/Service/NoObjectExistsFactory.php
+++ b/src/Validator/Service/NoObjectExistsFactory.php
@@ -1,24 +1,28 @@
*/
class NoObjectExistsFactory extends AbstractValidatorFactory
{
- protected $validatorClass = NoObjectExists::class;
+ protected string $validatorClass = NoObjectExists::class;
- public function __invoke(ContainerInterface $container, $requestedName, array $options = null): NoObjectExists
+ /**
+ * @inheritDoc
+ */
+ public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null): NoObjectExists
{
$repository = $this->getRepository($container, $options);
diff --git a/src/Validator/Service/ObjectExistsFactory.php b/src/Validator/Service/ObjectExistsFactory.php
index 6e7bcfd..4378b1e 100644
--- a/src/Validator/Service/ObjectExistsFactory.php
+++ b/src/Validator/Service/ObjectExistsFactory.php
@@ -1,24 +1,28 @@
*/
class ObjectExistsFactory extends AbstractValidatorFactory
{
- protected $validatorClass = ObjectExists::class;
+ protected string $validatorClass = ObjectExists::class;
- public function __invoke(ContainerInterface $container, $requestedName, array $options = null): ObjectExists
+ /**
+ * @inheritDoc
+ */
+ public function __invoke(ContainerInterface $container, $requestedName, ?array $options = null): ObjectExists
{
$repository = $this->getRepository($container, $options);
diff --git a/src/Validator/Service/UniqueObjectFactory.php b/src/Validator/Service/UniqueObjectFactory.php
index 0b5c146..90e8298 100644
--- a/src/Validator/Service/UniqueObjectFactory.php
+++ b/src/Validator/Service/UniqueObjectFactory.php
@@ -1,18 +1,22 @@
merge($options, [
'object_manager' => $this->getObjectManager($container, $options),
diff --git a/src/Validator/UniqueObject.php b/src/Validator/UniqueObject.php
index d8e6464..1258ff8 100644
--- a/src/Validator/UniqueObject.php
+++ b/src/Validator/UniqueObject.php
@@ -1,40 +1,41 @@
+ * @license MIT
*/
class UniqueObject extends ObjectExists
{
/**
* Error constants
*/
- const ERROR_OBJECT_NOT_UNIQUE = 'objectNotUnique';
+ public const ERROR_OBJECT_NOT_UNIQUE = 'objectNotUnique';
- /**
- * @var array Message templates
- */
- protected $messageTemplates = [
+ /** @var array Message templates */
+ protected array $messageTemplates = [
self::ERROR_OBJECT_NOT_UNIQUE => "There is already another object matching '%value%'",
];
- /**
- * @var ObjectManager
- */
- protected $objectManager;
+ protected ObjectManager $objectManager;
- /**
- * @var boolean
- */
- protected $useContext;
+ protected bool $useContext;
/***
* Constructor
@@ -57,7 +58,7 @@ class UniqueObject extends ObjectExists
if (is_object($options['object_manager'])) {
$provided = get_class($options['object_manager']);
} else {
- $provided = getType($options['object_manager']);
+ $provided = gettype($options['object_manager']);
}
}
@@ -71,7 +72,7 @@ class UniqueObject extends ObjectExists
}
$this->objectManager = $options['object_manager'];
- $this->useContext = isset($options['use_context']) ? (boolean) $options['use_context'] : false;
+ $this->useContext = isset($options['use_context']) ? (bool) $options['use_context'] : false;
}
/**
@@ -79,7 +80,6 @@ class UniqueObject extends ObjectExists
*
* @param mixed $value
* @param array $context
- * @return boolean
*/
public function isValid($value, $context = null): bool
{
@@ -97,7 +97,7 @@ class UniqueObject extends ObjectExists
$expectedIdentifiers = $this->getExpectedIdentifiers($context);
$foundIdentifiers = $this->getFoundIdentifiers($match);
- if (count(array_diff_assoc($expectedIdentifiers, $foundIdentifiers)) == 0) {
+ if (count(array_diff_assoc($expectedIdentifiers, $foundIdentifiers)) === 0) {
return true;
}
@@ -108,11 +108,10 @@ class UniqueObject extends ObjectExists
/**
* Gets the identifiers from the matched object.
*
- * @param object $match
* @return array
* @throws Exception\RuntimeException
*/
- protected function getFoundIdentifiers($match)
+ protected function getFoundIdentifiers(object $match): array
{
return $this->objectManager
->getClassMetadata($this->objectRepository->getClassName())
@@ -126,7 +125,7 @@ class UniqueObject extends ObjectExists
* @return array
* @throws Exception\RuntimeException
*/
- protected function getExpectedIdentifiers($context = null)
+ protected function getExpectedIdentifiers($context = null): array
{
if ($context === null) {
throw new Exception\RuntimeException(
@@ -145,7 +144,7 @@ class UniqueObject extends ObjectExists
$result = [];
foreach ($this->getIdentifiers() as $identifierField) {
if (! array_key_exists($identifierField, $context)) {
- throw new Exception\RuntimeException(\sprintf('Expected context to contain %s', $identifierField));
+ throw new Exception\RuntimeException(sprintf('Expected context to contain %s', $identifierField));
}
$result[$identifierField] = $context[$identifierField];
@@ -153,11 +152,10 @@ class UniqueObject extends ObjectExists
return $result;
}
-
/**
* @return array the names of the identifiers
*/
- protected function getIdentifiers()
+ protected function getIdentifiers(): array
{
return $this->objectManager
->getClassMetadata($this->objectRepository->getClassName())