diff --git a/.gitignore b/.gitignore
index aaf5331fd..d912b593b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
/.phpunit.result.cache
/.phpstan-cache
/phpstan.neon
+/phpbench.json
/clover.xml
/coveralls-upload.json
/phpunit.xml
diff --git a/.gitignore copy b/.gitignore copy
deleted file mode 100644
index 0088c44ed..000000000
--- a/.gitignore copy
+++ /dev/null
@@ -1,9 +0,0 @@
-/.phpcs-cache
-/.phpstan-cache
-/phpstan.neon
-/.phpunit.cache
-/.phpunit.result.cache
-/phpunit.xml
-/vendor/
-/xdebug_filter.php
-/clover.xml
\ No newline at end of file
diff --git a/.laminas-ci.json b/.laminas-ci.json
index 71527888c..c433f1331 100644
--- a/.laminas-ci.json
+++ b/.laminas-ci.json
@@ -1,8 +1,7 @@
{
"extensions": [
"pdo-sqlite",
- "sqlite3",
- "sqlsrv"
+ "sqlite3"
],
"additional_checks": [
{
@@ -14,4 +13,4 @@
}
}
]
-}
+}
\ No newline at end of file
diff --git a/.laminas-ci/phpunit.xml b/.laminas-ci/phpunit.xml
index c7c025880..d474c8a41 100644
--- a/.laminas-ci/phpunit.xml
+++ b/.laminas-ci/phpunit.xml
@@ -4,28 +4,33 @@
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true">
-
-
- ./src
-
-
- ./src/Sql/Ddl/Column/Float.php
-
-
+
+
+
+
./test/unit
+ ./test/unit/Adapter/AdapterAbstractServiceFactoryTest.php
+ ./test/unit/Adapter/AdapterServiceFactoryTest.php
+ ./test/unit/Adapter/AdapterServiceDelegatorTest.php
+ ./test/unit/Adapter/Driver/Pdo/PdoTest.php
+ ./test/unit/Adapter/Driver/Pdo/ConnectionTest.php
+ ./test/unit/Adapter/Driver/Pdo/ConnectionIntegrationTest.php
+ ./test/unit/Adapter/Driver/Pdo/StatementTest.php
+ ./test/unit/Adapter/Driver/Pdo/StatementIntegrationTest.php
+ ./test/unit/Adapter/AdapterTest.php
+ ./test/unit/Adapter/AdapterAwareTraitTest.php
+ ./test/unit/TableGateway
+ ./test/unit/RowGateway
+ ./test/unit/ConfigProviderTest.php
./test/integration
-
-
-
-
@@ -34,7 +39,7 @@
-
+
@@ -52,7 +57,7 @@
-
+
diff --git a/README.md b/README.md
index 81f51e06c..b6f63eed7 100644
--- a/README.md
+++ b/README.md
@@ -22,8 +22,8 @@ The `phpunit.xml.dist` file defines two test suites, "unit test" and "integratio
You can run one or the other using the `--testsuite` option to `phpunit`:
```bash
-$ ./vendor/bin/phpunit --testsuite "unit test" # unit tests only
-$ ./vendor/bin/phpunit --testsuite "integration test" # integration tests only
+./vendor/bin/phpunit --testsuite "unit test" # unit tests only
+./vendor/bin/phpunit --testsuite "integration test" # integration tests only
```
Unit tests do not require additional functionality beyond having the appropriate database extensions present and loaded in your PHP binary.
@@ -36,13 +36,13 @@ So, the repository includes a [Docker Compose][docker-compose] configuration whi
To start up the configuration, run the following command:
```bash
-$ docker compose up -d
+docker compose up -d
```
To test that the environment is up and running, run the following command:
```bash
-$ docker compose ps
+docker compose ps
```
You should see output similar to the following:
@@ -65,7 +65,7 @@ So, copy `phpunit.xml.dist` to `phpunit.xml`, and change the following environme
From there, you can run the integration tests by running the following command:
```bash
-$ docker compose exec php composer test-integration
+docker compose exec php composer test-integration
```
> [!TIP]
@@ -73,8 +73,8 @@ $ docker compose exec php composer test-integration
-----
-- File issues at https://github.com/php-db/phpdb/issues
-- Documentation is at https://docs.php-db.dev
+- File issues at
+- Documentation is at
[docker-compose]: https://docs.docker.com/compose/intro/features-uses/
-[deploy-with-docker-compose]: https://deploywithdockercompose.com
\ No newline at end of file
+[deploy-with-docker-compose]: https://deploywithdockercompose.com
diff --git a/composer.json b/composer.json
index f85778f66..9683ffc24 100644
--- a/composer.json
+++ b/composer.json
@@ -37,6 +37,7 @@
"laminas/laminas-coding-standard": "^3.0.1",
"laminas/laminas-eventmanager": "^3.14.0",
"laminas/laminas-hydrator": "^4.6.0",
+ "phpbench/phpbench": "^1.4",
"phpstan/phpstan": "^2.1",
"phpstan/phpstan-phpunit": "^2.0",
"phpunit/phpunit": "^11.5.15",
@@ -55,7 +56,8 @@
"autoload-dev": {
"psr-4": {
"PhpDbTest\\": "test/unit/",
- "PhpDbIntegrationTest\\": "test/integration/"
+ "PhpDbIntegrationTest\\": "test/integration/",
+ "PhpDbBenchmark\\": "test/benchmark/"
}
},
"scripts": {
diff --git a/composer.lock b/composer.lock
index 7dadb0811..998712bb4 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": "8b6c816b6f330e6685aca2f074f44eea",
+ "content-hash": "ce8a55f102310b9f9fcd4e3e9007b668",
"packages": [
{
"name": "brick/varexporter",
@@ -314,29 +314,29 @@
"packages-dev": [
{
"name": "dealerdirect/phpcodesniffer-composer-installer",
- "version": "v1.1.2",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/composer-installer.git",
- "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1"
+ "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1",
- "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1",
+ "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/845eb62303d2ca9b289ef216356568ccc075ffd1",
+ "reference": "845eb62303d2ca9b289ef216356568ccc075ffd1",
"shasum": ""
},
"require": {
"composer-plugin-api": "^2.2",
"php": ">=5.4",
- "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0"
+ "squizlabs/php_codesniffer": "^3.1.0 || ^4.0"
},
"require-dev": {
"composer/composer": "^2.2",
"ext-json": "*",
"ext-zip": "*",
"php-parallel-lint/php-parallel-lint": "^1.4.0",
- "phpcompatibility/php-compatibility": "^9.0",
+ "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev",
"yoast/phpunit-polyfills": "^1.0"
},
"type": "composer-plugin",
@@ -406,7 +406,161 @@
"type": "thanks_dev"
}
],
- "time": "2025-07-17T20:45:56+00:00"
+ "time": "2025-11-11T04:32:07+00:00"
+ },
+ {
+ "name": "doctrine/annotations",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7",
+ "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^2 || ^3",
+ "ext-tokenizer": "*",
+ "php": "^7.2 || ^8.0",
+ "psr/cache": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "doctrine/cache": "^2.0",
+ "doctrine/coding-standard": "^10",
+ "phpstan/phpstan": "^1.10.28",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "symfony/cache": "^5.4 || ^6.4 || ^7",
+ "vimeo/psalm": "^4.30 || ^5.14"
+ },
+ "suggest": {
+ "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Docblock Annotations Parser",
+ "homepage": "https://www.doctrine-project.org/projects/annotations.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "parser"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/annotations/issues",
+ "source": "https://github.com/doctrine/annotations/tree/2.0.2"
+ },
+ "abandoned": true,
+ "time": "2024-09-05T10:17:24+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.21"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/3.0.1"
+ },
+ "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%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-05T11:56:58+00:00"
},
{
"name": "laminas/laminas-coding-standard",
@@ -787,6 +941,155 @@
},
"time": "2022-02-21T01:04:05+00:00"
},
+ {
+ "name": "phpbench/container",
+ "version": "2.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpbench/container.git",
+ "reference": "0c7b2d36c1ea53fe27302fb8873ded7172047196"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpbench/container/zipball/0c7b2d36c1ea53fe27302fb8873ded7172047196",
+ "reference": "0c7b2d36c1ea53fe27302fb8873ded7172047196",
+ "shasum": ""
+ },
+ "require": {
+ "psr/container": "^1.0|^2.0",
+ "symfony/options-resolver": "^4.2 || ^5.0 || ^6.0 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "php-cs-fixer/shim": "^3.89",
+ "phpstan/phpstan": "^0.12.52",
+ "phpunit/phpunit": "^8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpBench\\DependencyInjection\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniel Leech",
+ "email": "daniel@dantleech.com"
+ }
+ ],
+ "description": "Simple, configurable, service container.",
+ "support": {
+ "issues": "https://github.com/phpbench/container/issues",
+ "source": "https://github.com/phpbench/container/tree/2.2.3"
+ },
+ "time": "2025-11-06T09:05:13+00:00"
+ },
+ {
+ "name": "phpbench/phpbench",
+ "version": "1.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpbench/phpbench.git",
+ "reference": "b641dde59d969ea42eed70a39f9b51950bc96878"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpbench/phpbench/zipball/b641dde59d969ea42eed70a39f9b51950bc96878",
+ "reference": "b641dde59d969ea42eed70a39f9b51950bc96878",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/annotations": "^2.0",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "ext-tokenizer": "*",
+ "php": "^8.1",
+ "phpbench/container": "^2.2",
+ "psr/log": "^1.1 || ^2.0 || ^3.0",
+ "seld/jsonlint": "^1.1",
+ "symfony/console": "^6.1 || ^7.0 || ^8.0",
+ "symfony/filesystem": "^6.1 || ^7.0 || ^8.0",
+ "symfony/finder": "^6.1 || ^7.0 || ^8.0",
+ "symfony/options-resolver": "^6.1 || ^7.0 || ^8.0",
+ "symfony/process": "^6.1 || ^7.0 || ^8.0",
+ "webmozart/glob": "^4.6"
+ },
+ "require-dev": {
+ "dantleech/invoke": "^2.0",
+ "ergebnis/composer-normalize": "^2.39",
+ "jangregor/phpstan-prophecy": "^1.0",
+ "php-cs-fixer/shim": "^3.9",
+ "phpspec/prophecy": "^1.22",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^10.4 || ^11.0",
+ "rector/rector": "^1.2",
+ "symfony/error-handler": "^6.1 || ^7.0 || ^8.0",
+ "symfony/var-dumper": "^6.1 || ^7.0 || ^8.0"
+ },
+ "suggest": {
+ "ext-xdebug": "For Xdebug profiling extension."
+ },
+ "bin": [
+ "bin/phpbench"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "lib/Report/Func/functions.php"
+ ],
+ "psr-4": {
+ "PhpBench\\": "lib/",
+ "PhpBench\\Extensions\\XDebug\\": "extensions/xdebug/lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniel Leech",
+ "email": "daniel@dantleech.com"
+ }
+ ],
+ "description": "PHP Benchmarking Framework",
+ "keywords": [
+ "benchmarking",
+ "optimization",
+ "performance",
+ "profiling",
+ "testing"
+ ],
+ "support": {
+ "issues": "https://github.com/phpbench/phpbench/issues",
+ "source": "https://github.com/phpbench/phpbench/tree/1.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/dantleech",
+ "type": "github"
+ }
+ ],
+ "time": "2025-11-06T19:07:31+00:00"
+ },
{
"name": "phpstan/phpdoc-parser",
"version": "2.3.0",
@@ -836,11 +1139,11 @@
},
{
"name": "phpstan/phpstan",
- "version": "2.1.31",
+ "version": "2.1.32",
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ead89849d879fe203ce9292c6ef5e7e76f867b96",
- "reference": "ead89849d879fe203ce9292c6ef5e7e76f867b96",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e126cad1e30a99b137b8ed75a85a676450ebb227",
+ "reference": "e126cad1e30a99b137b8ed75a85a676450ebb227",
"shasum": ""
},
"require": {
@@ -885,25 +1188,25 @@
"type": "github"
}
],
- "time": "2025-10-10T14:14:11+00:00"
+ "time": "2025-11-11T15:18:17+00:00"
},
{
"name": "phpstan/phpstan-phpunit",
- "version": "2.0.7",
+ "version": "2.0.8",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan-phpunit.git",
- "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc"
+ "reference": "2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/9a9b161baee88a5f5c58d816943cff354ff233dc",
- "reference": "9a9b161baee88a5f5c58d816943cff354ff233dc",
+ "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe",
+ "reference": "2fe9fbeceaf76dd1ebaa7bbbb25e2fb5e59db2fe",
"shasum": ""
},
"require": {
"php": "^7.4 || ^8.0",
- "phpstan/phpstan": "^2.1.18"
+ "phpstan/phpstan": "^2.1.32"
},
"conflict": {
"phpunit/phpunit": "<7.0"
@@ -936,9 +1239,9 @@
"description": "PHPUnit extensions and rules for PHPStan",
"support": {
"issues": "https://github.com/phpstan/phpstan-phpunit/issues",
- "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.7"
+ "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.8"
},
- "time": "2025-07-13T11:31:46+00:00"
+ "time": "2025-11-11T07:55:22+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -1277,16 +1580,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "11.5.43",
+ "version": "11.5.44",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "c6b89b6cf4324a8b4cb86e1f5dfdd6c9e0371924"
+ "reference": "c346885c95423eda3f65d85a194aaa24873cda82"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c6b89b6cf4324a8b4cb86e1f5dfdd6c9e0371924",
- "reference": "c6b89b6cf4324a8b4cb86e1f5dfdd6c9e0371924",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c346885c95423eda3f65d85a194aaa24873cda82",
+ "reference": "c346885c95423eda3f65d85a194aaa24873cda82",
"shasum": ""
},
"require": {
@@ -1358,7 +1661,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.43"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.44"
},
"funding": [
{
@@ -1382,25 +1685,124 @@
"type": "tidelift"
}
],
- "time": "2025-10-30T08:39:39+00:00"
+ "time": "2025-11-13T07:17:35+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/3.0.2"
+ },
+ "time": "2024-09-11T13:17:53+00:00"
},
{
"name": "rector/rector",
- "version": "2.2.7",
+ "version": "2.2.8",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
- "reference": "022038537838bc8a4e526af86c2d6e38eaeff7ef"
+ "reference": "303aa811649ccd1d32e51e62d5c85949d01b5f1b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/rector/zipball/022038537838bc8a4e526af86c2d6e38eaeff7ef",
- "reference": "022038537838bc8a4e526af86c2d6e38eaeff7ef",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/303aa811649ccd1d32e51e62d5c85949d01b5f1b",
+ "reference": "303aa811649ccd1d32e51e62d5c85949d01b5f1b",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0",
- "phpstan/phpstan": "^2.1.26"
+ "phpstan/phpstan": "^2.1.32"
},
"conflict": {
"rector/rector-doctrine": "*",
@@ -1434,7 +1836,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
- "source": "https://github.com/rectorphp/rector/tree/2.2.7"
+ "source": "https://github.com/rectorphp/rector/tree/2.2.8"
},
"funding": [
{
@@ -1442,7 +1844,7 @@
"type": "github"
}
],
- "time": "2025-10-29T15:46:12+00:00"
+ "time": "2025-11-12T18:38:00+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -2431,31 +2833,95 @@
"time": "2024-10-09T05:16:32+00:00"
},
{
- "name": "slevomat/coding-standard",
- "version": "8.22.1",
+ "name": "seld/jsonlint",
+ "version": "1.11.0",
"source": {
"type": "git",
- "url": "https://github.com/slevomat/coding-standard.git",
- "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec"
+ "url": "https://github.com/Seldaek/jsonlint.git",
+ "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/1dd80bf3b93692bedb21a6623c496887fad05fec",
- "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec",
+ "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2",
+ "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2",
"shasum": ""
},
"require": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2",
- "php": "^7.4 || ^8.0",
- "phpstan/phpdoc-parser": "^2.3.0",
- "squizlabs/php_codesniffer": "^3.13.4"
+ "php": "^5.3 || ^7.0 || ^8.0"
},
"require-dev": {
- "phing/phing": "3.0.1|3.1.0",
- "php-parallel-lint/php-parallel-lint": "1.4.0",
- "phpstan/phpstan": "2.1.24",
- "phpstan/phpstan-deprecation-rules": "2.0.3",
- "phpstan/phpstan-phpunit": "2.0.7",
+ "phpstan/phpstan": "^1.11",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13"
+ },
+ "bin": [
+ "bin/jsonlint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "JSON Linter",
+ "keywords": [
+ "json",
+ "linter",
+ "parser",
+ "validator"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/jsonlint/issues",
+ "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-11T14:55:45+00:00"
+ },
+ {
+ "name": "slevomat/coding-standard",
+ "version": "8.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/slevomat/coding-standard.git",
+ "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/1dd80bf3b93692bedb21a6623c496887fad05fec",
+ "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec",
+ "shasum": ""
+ },
+ "require": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2",
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpdoc-parser": "^2.3.0",
+ "squizlabs/php_codesniffer": "^3.13.4"
+ },
+ "require-dev": {
+ "phing/phing": "3.0.1|3.1.0",
+ "php-parallel-lint/php-parallel-lint": "1.4.0",
+ "phpstan/phpstan": "2.1.24",
+ "phpstan/phpstan-deprecation-rules": "2.0.3",
+ "phpstan/phpstan-phpunit": "2.0.7",
"phpstan/phpstan-strict-rules": "2.0.6",
"phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.10"
},
@@ -2627,145 +3093,268 @@
"time": "2024-10-20T05:08:20+00:00"
},
{
- "name": "theseer/tokenizer",
- "version": "1.2.3",
+ "name": "symfony/console",
+ "version": "v7.4.0",
"source": {
"type": "git",
- "url": "https://github.com/theseer/tokenizer.git",
- "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
+ "url": "https://github.com/symfony/console.git",
+ "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
- "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "url": "https://api.github.com/repos/symfony/console/zipball/0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8",
+ "reference": "0bc0f45254b99c58d45a8fbf9fb955d46cbd1bb8",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-tokenizer": "*",
- "ext-xmlwriter": "*",
- "php": "^7.2 || ^8.0"
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^7.2|^8.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4",
+ "symfony/dotenv": "<6.4",
+ "symfony/event-dispatcher": "<6.4",
+ "symfony/lock": "<6.4",
+ "symfony/process": "<6.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0|^8.0",
+ "symfony/dependency-injection": "^6.4|^7.0|^8.0",
+ "symfony/event-dispatcher": "^6.4|^7.0|^8.0",
+ "symfony/http-foundation": "^6.4|^7.0|^8.0",
+ "symfony/http-kernel": "^6.4|^7.0|^8.0",
+ "symfony/lock": "^6.4|^7.0|^8.0",
+ "symfony/messenger": "^6.4|^7.0|^8.0",
+ "symfony/process": "^6.4|^7.0|^8.0",
+ "symfony/stopwatch": "^6.4|^7.0|^8.0",
+ "symfony/var-dumper": "^6.4|^7.0|^8.0"
},
"type": "library",
"autoload": {
- "classmap": [
- "src/"
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
"support": {
- "issues": "https://github.com/theseer/tokenizer/issues",
- "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
+ "source": "https://github.com/symfony/console/tree/v7.4.0"
},
"funding": [
{
- "url": "https://github.com/theseer",
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
"type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "time": "2024-03-03T12:36:25+00:00"
+ "time": "2025-11-27T13:27:24+00:00"
},
{
- "name": "webimpress/coding-standard",
- "version": "1.4.0",
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.6.0",
"source": {
"type": "git",
- "url": "https://github.com/webimpress/coding-standard.git",
- "reference": "6f6a1a90bd9e18fc8bee0660dd1d1ce68cf9fc53"
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webimpress/coding-standard/zipball/6f6a1a90bd9e18fc8bee0660dd1d1ce68cf9fc53",
- "reference": "6f6a1a90bd9e18fc8bee0660dd1d1ce68cf9fc53",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
"shasum": ""
},
"require": {
- "php": "^7.3 || ^8.0",
- "squizlabs/php_codesniffer": "^3.10.3"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6.15"
+ "php": ">=8.1"
},
- "type": "phpcodesniffer-standard",
+ "type": "library",
"extra": {
- "dev-master": "1.2.x-dev",
- "dev-develop": "1.3.x-dev"
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
},
"autoload": {
- "psr-4": {
- "WebimpressCodingStandard\\": "src/WebimpressCodingStandard/"
- }
+ "files": [
+ "function.php"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-2-Clause"
+ "MIT"
],
- "description": "Webimpress Coding Standard",
- "keywords": [
- "Coding Standard",
- "PSR-2",
- "phpcs",
- "psr-12",
- "webimpress"
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
"support": {
- "issues": "https://github.com/webimpress/coding-standard/issues",
- "source": "https://github.com/webimpress/coding-standard/tree/1.4.0"
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
},
"funding": [
{
- "url": "https://github.com/michalbundyra",
+ "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": "2024-10-16T06:55:17+00:00"
+ "time": "2024-09-25T14:21:43+00:00"
},
{
- "name": "webmozart/assert",
- "version": "1.12.1",
+ "name": "symfony/filesystem",
+ "version": "v7.4.0",
"source": {
"type": "git",
- "url": "https://github.com/webmozarts/assert.git",
- "reference": "9be6926d8b485f55b9229203f962b51ed377ba68"
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68",
- "reference": "9be6926d8b485f55b9229203f962b51ed377ba68",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/d551b38811096d0be9c4691d406991b47c0c630a",
+ "reference": "d551b38811096d0be9c4691d406991b47c0c630a",
"shasum": ""
},
"require": {
- "ext-ctype": "*",
- "ext-date": "*",
- "ext-filter": "*",
- "php": "^7.2 || ^8.0"
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8"
},
- "suggest": {
- "ext-intl": "",
- "ext-simplexml": "",
- "ext-spl": ""
+ "require-dev": {
+ "symfony/process": "^6.4|^7.0|^8.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.10-dev"
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v7.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
+ ],
+ "time": "2025-11-27T13:27:24+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/340b9ed7320570f319028a2cbec46d40535e94bd",
+ "reference": "340b9ed7320570f319028a2cbec46d40535e94bd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.4|^7.0|^8.0"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Webmozart\\Assert\\": "src/"
- }
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2773,21 +3362,899 @@
],
"authors": [
{
- "name": "Bernhard Schussek",
- "email": "bschussek@gmail.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Assertions to validate method input/output with nice error messages.",
- "keywords": [
- "assert",
- "check",
- "validate"
- ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
"support": {
- "issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/1.12.1"
+ "source": "https://github.com/symfony/finder/tree/v7.4.0"
},
- "time": "2025-10-29T15:56:20+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-11-05T05:42:40+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "b38026df55197f9e39a44f3215788edf83187b80"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b38026df55197f9e39a44f3215788edf83187b80",
+ "reference": "b38026df55197f9e39a44f3215788edf83187b80",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an improved replacement for the array_replace PHP function",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/options-resolver/tree/v7.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-11-12T15:39:26+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "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.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70",
+ "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-27T09:58:17+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-23T08:48:59+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v7.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-10-16T11:21:06+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43",
+ "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.6.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-15T11:30:57+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v7.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003",
+ "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3.0",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.33",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/emoji": "^7.1|^8.0",
+ "symfony/http-client": "^6.4|^7.0|^8.0",
+ "symfony/intl": "^6.4|^7.0|^8.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4|^7.0|^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "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",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v7.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-11-27T13:27:24+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "b7489ce515e168639d17feec34b8847c326b0b3c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c",
+ "reference": "b7489ce515e168639d17feec34b8847c326b0b3c",
+ "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.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2025-11-17T20:03:58+00:00"
+ },
+ {
+ "name": "webimpress/coding-standard",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webimpress/coding-standard.git",
+ "reference": "6f6a1a90bd9e18fc8bee0660dd1d1ce68cf9fc53"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webimpress/coding-standard/zipball/6f6a1a90bd9e18fc8bee0660dd1d1ce68cf9fc53",
+ "reference": "6f6a1a90bd9e18fc8bee0660dd1d1ce68cf9fc53",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3 || ^8.0",
+ "squizlabs/php_codesniffer": "^3.10.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6.15"
+ },
+ "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.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/michalbundyra",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-16T06:55:17+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.12.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "9be6926d8b485f55b9229203f962b51ed377ba68"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68",
+ "reference": "9be6926d8b485f55b9229203f962b51ed377ba68",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-date": "*",
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "suggest": {
+ "ext-intl": "",
+ "ext-simplexml": "",
+ "ext-spl": ""
+ },
+ "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.12.1"
+ },
+ "time": "2025-10-29T15:56:20+00:00"
+ },
+ {
+ "name": "webmozart/glob",
+ "version": "4.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/glob.git",
+ "reference": "8a2842112d6916e61e0e15e316465b611f3abc17"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/glob/zipball/8a2842112d6916e61e0e15e316465b611f3abc17",
+ "reference": "8a2842112d6916e61e0e15e316465b611f3abc17",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.3 || ^8.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5",
+ "symfony/filesystem": "^5.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Glob\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "A PHP implementation of Ant's glob.",
+ "support": {
+ "issues": "https://github.com/webmozarts/glob/issues",
+ "source": "https://github.com/webmozarts/glob/tree/4.7.0"
+ },
+ "time": "2024-03-07T20:33:40+00:00"
}
],
"aliases": [],
diff --git a/docs/book/adapter.md b/docs/book/adapter.md
index 48b6c14a8..d68dbc18e 100644
--- a/docs/book/adapter.md
+++ b/docs/book/adapter.md
@@ -170,10 +170,10 @@ The above example will go through the following steps:
- execute the `Statement` object, producing a `Result` object.
- check the `Result` object to check if the supplied SQL was a result set
producing statement:
- - if the query produced a result set, clone the `ResultSet` prototype,
- inject the `Result` as its datasource, and return the new `ResultSet`
- instance.
- - otherwise, return the `Result`.
+ - if the query produced a result set, clone the `ResultSet` prototype,
+ inject the `Result` as its datasource, and return the new `ResultSet`
+ instance.
+ - otherwise, return the `Result`.
## Query Execution
diff --git a/docs/book/metadata.md b/docs/book/metadata.md
index e49a6ad27..b260debef 100644
--- a/docs/book/metadata.md
+++ b/docs/book/metadata.md
@@ -12,8 +12,14 @@ interface MetadataInterface
{
public function getSchemas();
- public function getTableNames(string $schema = null, bool $includeViews = false) : string[];
- public function getTables(string $schema = null, bool $includeViews = false) : Object\TableObject[];
+ public function getTableNames(
+ string $schema = null,
+ bool $includeViews = false
+ ) : string[];
+ public function getTables(
+ string $schema = null,
+ bool $includeViews = false
+ ) : Object\TableObject[];
public function getTable(string $tableName, string $schema = null) : Object\TableObject;
public function getViewNames(string $schema = null) : string[];
@@ -22,11 +28,26 @@ interface MetadataInterface
public function getColumnNames(string string $table, $schema = null) : string[];
public function getColumns(string $table, string $schema = null) : Object\ColumnObject[];
- public function getColumn(string $columnName, string $table, string $schema = null) Object\ColumnObject;
-
- public function getConstraints(string $table, $string schema = null) : Object\ConstraintObject[];
- public function getConstraint(string $constraintName, string $table, string $schema = null) : Object\ConstraintObject;
- public function getConstraintKeys(string $constraint, string $table, string $schema = null) : Object\ConstraintKeyObject[];
+ public function getColumn(
+ string $columnName,
+ string $table,
+ string $schema = null
+ ) Object\ColumnObject;
+
+ public function getConstraints(
+ string $table,
+ $string schema = null
+ ) : Object\ConstraintObject[];
+ public function getConstraint(
+ string $constraintName,
+ string $table,
+ string $schema = null
+ ) : Object\ConstraintObject;
+ public function getConstraintKeys(
+ string $constraint,
+ string $table,
+ string $schema = null
+ ) : Object\ConstraintKeyObject[];
public function getTriggerNames(string $schema = null) : string[];
public function getTriggers(string $schema = null) : Object\TriggerObject[];
diff --git a/docs/book/result-set.md b/docs/book/result-set.md
index 91771976b..42f30de0e 100644
--- a/docs/book/result-set.md
+++ b/docs/book/result-set.md
@@ -99,7 +99,7 @@ The `HydratingResultSet` depends on
need to install:
```bash
-$ composer require laminas/laminas-hydrator
+composer require laminas/laminas-hydrator
```
In the example below, rows from the database will be iterated, and during
diff --git a/docs/book/sql-ddl.md b/docs/book/sql-ddl.md
index da6710ef4..5539e4b95 100644
--- a/docs/book/sql-ddl.md
+++ b/docs/book/sql-ddl.md
@@ -85,9 +85,6 @@ $table = new Ddl\AlterTable('bar');
// With a schema name "foo":
$table = new Ddl\AlterTable(new TableIdentifier('bar', 'foo'));
-
-// Optionally, as a temporary table:
-$table = new Ddl\AlterTable('bar', true);
```
The primary difference between a `CreateTable` and `AlterTable` is that the
@@ -98,7 +95,7 @@ also have the ability to *alter* existing columns:
```php
use PhpDb\Sql\Ddl\Column;
-$table->changeColumn('name', Column\Varchar('new_name', 50));
+$table->changeColumn('name', new Column\Varchar('new_name', 50));
```
You may also *drop* existing columns or constraints:
@@ -145,7 +142,7 @@ $adapter->query(
```
By passing the `$ddl` object through the `$sql` instance's
-`getSqlStringForSqlObject()` method, we ensure that any platform specific
+`buildSqlString()` method, we ensure that any platform specific
specializations/modifications are utilized to create a platform specific SQL
statement.
@@ -160,25 +157,31 @@ implement `PhpDb\Sql\Ddl\Column\ColumnInterface`.
In alphabetical order:
-Type | Arguments For Construction
------------------|---------------------------
-BigInteger | `$name`, `$nullable = false`, `$default = null`, `array $options = array()`
-Binary | `$name`, `$length`, `nullable = false`, `$default = null`, `array $options = array()`
-Blob | `$name`, `$length`, `nullable = false`, `$default = null`, `array $options = array()`
-Boolean | `$name`
-Char | `$name`, `length`
-Column (generic) | `$name = null`
-Date | `$name`
-DateTime | `$name`
-Decimal | `$name`, `$precision`, `$scale = null`
-Float | `$name`, `$digits`, `$decimal` (Note: this class is deprecated as of 2.4.0; use Floating instead)
-Floating | `$name`, `$digits`, `$decimal`
-Integer | `$name`, `$nullable = false`, `default = null`, `array $options = array()`
-Text | `$name`, `$length`, `nullable = false`, `$default = null`, `array $options = array()`
-Time | `$name`
-Timestamp | `$name`
-Varbinary | `$name`, `$length`
-Varchar | `$name`, `$length`
+- **BigInteger**: `$name`, `$nullable=false`, `$default=null`, `$options=[]`
+- **Binary**: `$name`, `$length=null`, `$nullable=false`, `$default=null`,
+ `$options=[]`
+- **Blob**: `$name`, `$length=null`, `$nullable=false`, `$default=null`,
+ `$options=[]`
+- **Boolean**: `$name`, `$nullable=false`, `$default=null`, `$options=[]`
+- **Char**: `$name`, `$length=null`, `$nullable=false`, `$default=null`,
+ `$options=[]`
+- **Column** (generic): `$name=''`, `$nullable=false`, `$default=null`,
+ `$options=[]`
+- **Date**: `$name`, `$nullable=false`, `$default=null`, `$options=[]`
+- **Datetime**: `$name`, `$nullable=false`, `$default=null`, `$options=[]`
+- **Decimal**: `$name`, `$digits=null`, `$decimal=null`, `$nullable`,
+ `$default`, `$options`
+- **Floating**: `$name`, `$digits=null`, `$decimal=null`, `$nullable`,
+ `$default`, `$options`
+- **Integer**: `$name`, `$nullable=false`, `$default=null`, `$options=[]`
+- **Text**: `$name`, `$length=null`, `$nullable=false`, `$default=null`,
+ `$options=[]`
+- **Time**: `$name`, `$nullable=false`, `$default=null`, `$options=[]`
+- **Timestamp**: `$name`, `$nullable=false`, `$default=null`, `$options=[]`
+- **Varbinary**: `$name`, `$length=null`, `$nullable=false`, `$default=null`,
+ `$options=[]`
+- **Varchar**: `$name`, `$length=null`, `$nullable=false`, `$default=null`,
+ `$options=[]`
Each of the above types can be utilized in any place that accepts a `Column\ColumnInterface`
instance. Currently, this is primarily in `CreateTable::addColumn()` and `AlterTable`'s
@@ -191,13 +194,12 @@ must implement `PhpDb\Sql\Ddl\Constraint\ConstraintInterface`.
In alphabetical order:
-Type | Arguments For Construction
------------|---------------------------
-Check | `$expression`, `$name`
-ForeignKey | `$name`, `$column`, `$referenceTable`, `$referenceColumn`, `$onDeleteRule = null`, `$onUpdateRule = null`
-PrimaryKey | `$columns`
-UniqueKey | `$column`, `$name = null`
+- **Check**: `$expression`, `$name`
+- **ForeignKey**: `$name`, `$columns`, `$refTable`, `$refColumn`,
+ `$onDelete`, `$onUpdate`
+- **PrimaryKey**: `$columns=null`, `$name=null`
+- **UniqueKey**: `$columns=null`, `$name=null`
Each of the above types can be utilized in any place that accepts a
-`Column\ConstraintInterface` instance. Currently, this is primarily in
+`Constraint\ConstraintInterface` instance. Currently, this is primarily in
`CreateTable::addConstraint()` and `AlterTable::addConstraint()`.
diff --git a/docs/book/sql.md b/docs/book/sql.md
index 1cda6899b..acf8359bb 100644
--- a/docs/book/sql.md
+++ b/docs/book/sql.md
@@ -61,7 +61,7 @@ $selectString = $sql->buildSqlString($select);
$results = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);
```
-`Laminas\\Db\\Sql\\Sql` objects can also be bound to a particular table so that in
+`PhpDb\\Sql\\Sql` objects can also be bound to a particular table so that in
obtaining a `Select`, `Insert`, `Update`, or `Delete` instance, the object will be
seeded with the table:
@@ -80,7 +80,10 @@ Each of these objects implements the following two interfaces:
```php
interface PreparableSqlInterface
{
- public function prepareStatement(Adapter $adapter, StatementInterface $statement) : void;
+ public function prepareStatement(
+ Adapter $adapter,
+ StatementInterface $statement
+ ) : void;
}
interface SqlInterface
@@ -92,6 +95,76 @@ interface SqlInterface
Use these functions to produce either (a) a prepared statement, or (b) a string
to execute.
+## SQL Arguments and Argument Types
+
+`PhpDb\Sql` provides individual `Argument\` types as well as an
+`Argument` factory class and an `ArgumentType` enum for type-safe
+specification of SQL values. This provides a modern, object-oriented
+alternative to using raw values or the legacy type constants.
+
+The `ArgumentType` enum defines six types, each backed by its corresponding class:
+
+- `Identifier` - For column names, table names, and other identifiers that
+ should be quoted
+- `Identifiers` - For arrays of identifiers (e.g., multi-column IN predicates)
+- `Value` - For values that should be parameterized or properly escaped
+ (default)
+- `Values` - For arrays of values (e.g., IN clauses)
+- `Literal` - For literal SQL fragments that should not be quoted or escaped
+- `Select` - For subqueries (Expression or SqlInterface objects)
+
+All argument classes are `readonly` and implement `ArgumentInterface`:
+
+```php
+use PhpDb\Sql\Argument;
+
+// Using the Argument factory class (recommended)
+$valueArg = Argument::value(123); // Value type
+$identifierArg = Argument::identifier('id'); // Identifier type
+$literalArg = Argument::literal('NOW()'); // Literal SQL
+$valuesArg = Argument::values([1, 2, 3]); // Multiple values
+$identifiersArg = Argument::identifiers(['col1', 'col2']); // Multiple identifiers
+
+// Direct instantiation is preferred
+$arg = new Argument\Identifier('column_name');
+$arg = new Argument\Value(123);
+$arg = new Argument\Literal('NOW()');
+$arg = new Argument\Values([1, 2, 3]);
+```
+
+The `Argument` classes are particularly useful when working with expressions
+where you need to explicitly control how values are treated:
+
+```php
+use PhpDb\Sql\Argument;
+use PhpDb\Sql\Expression;
+
+// With Argument classes - explicit and type-safe
+$expression = new Expression(
+ 'CONCAT(?, ?, ?)',
+ [
+ new Argument\Identifier('column1'),
+ new Argument\Value('-'),
+ new Argument\Identifier('column2')
+ ]
+);
+```
+
+Scalar values passed directly to `Expression` are automatically wrapped:
+
+- Scalars become `Argument\Value`
+- Arrays become `Argument\Values`
+- `ExpressionInterface` instances become `Argument\Select`
+
+> ### Literals
+>
+> `PhpDb\Sql` makes the distinction that literals will not have any parameters
+> that need interpolating, while `Expression` objects *might* have parameters
+> that need interpolating. In cases where there are parameters in an `Expression`,
+> `PhpDb\Sql\AbstractSql` will do its best to identify placeholders when the
+> `Expression` is processed during statement creation. In short, if you don't
+> have parameters, use `Literal` objects`.
+
## Select
`PhpDb\Sql\Select` presents a unified API for building platform-specific SQL
@@ -113,29 +186,63 @@ Once you have a valid `Select` object, the following API can be used to further
specify various select statement parts:
```php
-class Select extends AbstractSql implements SqlInterface, PreparableSqlInterface
+class Select extends AbstractPreparableSql implements SqlInterface, PreparableSqlInterface
{
- const JOIN_INNER = 'inner';
- const JOIN_OUTER = 'outer';
- const JOIN_FULL_OUTER = 'full outer';
- const JOIN_LEFT = 'left';
- const JOIN_RIGHT = 'right';
- const SQL_STAR = '*';
- const ORDER_ASCENDING = 'ASC';
- const ORDER_DESCENDING = 'DESC';
-
- public $where; // @param Where $where
-
- public function __construct(string|array|TableIdentifier $table = null);
- public function from(string|array|TableIdentifier $table) : self;
- public function columns(array $columns, bool $prefixColumnsWithTable = true) : self;
- public function join(string|array|TableIdentifier $name, string $on, string|array $columns = self::SQL_STAR, string $type = self::JOIN_INNER) : self;
- public function where(Where|callable|string|array|PredicateInterface $predicate, string $combination = Predicate\PredicateSet::OP_AND) : self;
- public function group(string|array $group);
- public function having(Having|callable|string|array $predicate, string $combination = Predicate\PredicateSet::OP_AND) : self;
- public function order(string|array $order) : self;
- public function limit(int $limit) : self;
- public function offset(int $offset) : self;
+ final public const JOIN_INNER = 'inner';
+ final public const JOIN_OUTER = 'outer';
+ final public const JOIN_FULL_OUTER = 'full outer';
+ final public const JOIN_LEFT = 'left';
+ final public const JOIN_RIGHT = 'right';
+ final public const JOIN_LEFT_OUTER = 'left outer';
+ final public const JOIN_RIGHT_OUTER = 'right outer';
+ final public const SQL_STAR = '*';
+ final public const ORDER_ASCENDING = 'ASC';
+ final public const ORDER_DESCENDING = 'DESC';
+ final public const QUANTIFIER_DISTINCT = 'DISTINCT';
+ final public const QUANTIFIER_ALL = 'ALL';
+ final public const COMBINE_UNION = 'union';
+ final public const COMBINE_EXCEPT = 'except';
+ final public const COMBINE_INTERSECT = 'intersect';
+
+ public Where $where;
+ public Having $having;
+ public Join $joins;
+
+ public function __construct(
+ array|string|TableIdentifier|null $table = null
+ );
+ public function from(array|string|TableIdentifier $table) : static;
+ public function quantifier(ExpressionInterface|string $quantifier) : static;
+ public function columns(
+ array $columns,
+ bool $prefixColumnsWithTable = true
+ ) : static;
+ public function join(
+ array|string|TableIdentifier $name,
+ PredicateInterface|string $on,
+ array|string $columns = self::SQL_STAR,
+ string $type = self::JOIN_INNER
+ ) : static;
+ public function where(
+ PredicateInterface|array|string|Closure $predicate,
+ string $combination = Predicate\PredicateSet::OP_AND
+ ) : self;
+ public function group(mixed $group) : static;
+ public function having(
+ Having|PredicateInterface|array|Closure|string $predicate,
+ string $combination = Predicate\PredicateSet::OP_AND
+ ) : static;
+ public function order(ExpressionInterface|array|string $order) : static;
+ public function limit(int|string $limit) : static;
+ public function offset(int|string $offset) : static;
+ public function combine(
+ Select $select,
+ string $type = self::COMBINE_UNION,
+ string $modifier = ''
+ ) : static;
+ public function reset(string $part) : static;
+ public function getRawState(?string $key = null) : mixed;
+ public function isTableReadOnly() : bool;
}
```
@@ -179,9 +286,9 @@ $select->columns([
```php
$select->join(
'foo', // table name
- 'id = bar.id', // expression to join on (will be quoted by platform object before insertion),
- ['bar', 'baz'], // (optional) list of columns, same requirements as columns() above
- $select::JOIN_OUTER // (optional), one of inner, outer, full outer, left, right also represented by constants in the API
+ 'id = bar.id', // expression to join on (will be quoted by platform),
+ ['bar', 'baz'], // (optional) list of columns, same as columns() above
+ $select::JOIN_OUTER // (optional), one of inner, outer, left, right, etc.
);
$select
@@ -260,7 +367,8 @@ key will be cast as follows:
As an example:
```php
-// SELECT "foo".* FROM "foo" WHERE "c1" IS NULL AND "c2" IN (?, ?, ?) AND "c3" IS NOT NULL
+// SELECT "foo".* FROM "foo" WHERE "c1" IS NULL
+// AND "c2" IN (?, ?, ?) AND "c3" IS NOT NULL
$select->from('foo')->where([
'c1' => null,
'c2' => [1, 2, 3],
@@ -313,22 +421,27 @@ $select->offset(10); // similarly takes an integer/numeric
The Insert API:
```php
-class Insert implements SqlInterface, PreparableSqlInterface
+class Insert extends AbstractPreparableSql implements SqlInterface, PreparableSqlInterface
{
- const VALUES_MERGE = 'merge';
- const VALUES_SET = 'set';
-
- public function __construct(string|TableIdentifier $table = null);
- public function into(string|TableIdentifier $table) : self;
- public function columns(array $columns) : self;
- public function values(array $values, string $flag = self::VALUES_SET) : self;
+ final public const VALUES_MERGE = 'merge';
+ final public const VALUES_SET = 'set';
+
+ public function __construct(string|TableIdentifier|null $table = null);
+ public function into(TableIdentifier|string|array $table) : static;
+ public function columns(array $columns) : static;
+ public function values(
+ array|Select $values,
+ string $flag = self::VALUES_SET
+ ) : static;
+ public function select(Select $select) : static;
+ public function getRawState(?string $key = null) : TableIdentifier|string|array;
}
```
As with `Select`, the table may be provided during instantiation or via the
`into()` method.
-### columns()
+### columns() (Insert)
```php
$insert->columns(['foo', 'bar']); // set the valid columns
@@ -356,16 +469,26 @@ $insert->values(['col_2' => 'value2'], $insert::VALUES_MERGE);
## Update
```php
-class Update
+class Update extends AbstractPreparableSql implements SqlInterface, PreparableSqlInterface
{
- const VALUES_MERGE = 'merge';
- const VALUES_SET = 'set';
-
- public $where; // @param Where $where
- public function __construct(string|TableIdentifier $table = null);
- public function table(string|TableIdentifier $table) : self;
- public function set(array $values, string $flag = self::VALUES_SET) : self;
- public function where(Where|callable|string|array|PredicateInterface $predicate, string $combination = Predicate\PredicateSet::OP_AND) : self;
+ final public const VALUES_MERGE = 'merge';
+ final public const VALUES_SET = 'set';
+
+ public Where $where;
+
+ public function __construct(string|TableIdentifier|null $table = null);
+ public function table(TableIdentifier|string|array $table) : static;
+ public function set(array $values, string|int $flag = self::VALUES_SET) : static;
+ public function where(
+ PredicateInterface|array|Closure|string|Where $predicate,
+ string $combination = Predicate\PredicateSet::OP_AND
+ ) : static;
+ public function join(
+ array|string|TableIdentifier $name,
+ string $on,
+ string $type = Join::JOIN_INNER
+ ) : static;
+ public function getRawState(?string $key = null) : mixed;
}
```
@@ -379,20 +502,30 @@ $update->set(['foo' => 'bar', 'baz' => 'bax']);
See the [section on Where and Having](#where-and-having).
+### join() (Update)
+
+```php
+$update->join('bar', 'foo.id = bar.foo_id', Update::JOIN_LEFT);
+```
+
## Delete
```php
-class Delete
+class Delete extends AbstractPreparableSql implements SqlInterface, PreparableSqlInterface
{
- public $where; // @param Where $where
-
- public function __construct(string|TableIdentifier $table = null);
- public function from(string|TableIdentifier $table);
- public function where(Where|callable|string|array|PredicateInterface $predicate, string $combination = Predicate\PredicateSet::OP_AND) : self;
+ public Where $where;
+
+ public function __construct(string|TableIdentifier|null $table = null);
+ public function from(TableIdentifier|string|array $table) : static;
+ public function where(
+ PredicateInterface|array|Closure|string|Where $predicate,
+ string $combination = Predicate\PredicateSet::OP_AND
+ ) : static;
+ public function getRawState(?string $key = null) : mixed;
}
```
-### where()
+### where() (Delete)
See the [section on Where and Having](#where-and-having).
@@ -419,15 +552,9 @@ There is also a special use case type for literal values (`TYPE_LITERAL`). All
element types are expressed via the `PhpDb\Sql\ExpressionInterface`
interface.
-> ### Literals
->
-> In Laminas 2.1, an actual `Literal` type was added. `PhpDb\Sql` now makes the
-> distinction that literals will not have any parameters that need
-> interpolating, while `Expression` objects *might* have parameters that need
-> interpolating. In cases where there are parameters in an `Expression`,
-> `PhpDb\Sql\AbstractSql` will do its best to identify placeholders when the
-> `Expression` is processed during statement creation. In short, if you don't
-> have parameters, use `Literal` objects.
+> **Note:** The `TYPE_*` constants are legacy constants maintained for backward
+> compatibility. New code should use the `ArgumentType` enum and `Argument`
+> class for type-safe argument handling (see the section below).
The `Where` and `Having` API is that of `Predicate` and `PredicateSet`:
@@ -435,85 +562,109 @@ The `Where` and `Having` API is that of `Predicate` and `PredicateSet`:
// Where & Having extend Predicate:
class Predicate extends PredicateSet
{
- public $and;
- public $or;
- public $AND;
- public $OR;
- public $NEST;
- public $UNNEST;
+ // Magic properties for fluent chaining
+ public Predicate $and;
+ public Predicate $or;
+ public Predicate $nest;
+ public Predicate $unnest;
public function nest() : Predicate;
- public function setUnnest(Predicate $predicate) : void;
+ public function setUnnest(?Predicate $predicate = null) : void;
public function unnest() : Predicate;
public function equalTo(
- int|float|bool|string $left,
- int|float|bool|string $right,
- string $leftType = self::TYPE_IDENTIFIER,
- string $rightType = self::TYPE_VALUE
- ) : self;
+ null|float|int|string|ArgumentInterface $left,
+ null|float|int|string|ArgumentInterface $right
+ ) : static;
public function notEqualTo(
- int|float|bool|string $left,
- int|float|bool|string $right,
- string $leftType = self::TYPE_IDENTIFIER,
- string $rightType = self::TYPE_VALUE
- ) : self;
+ null|float|int|string|ArgumentInterface $left,
+ null|float|int|string|ArgumentInterface $right
+ ) : static;
public function lessThan(
- int|float|bool|string $left,
- int|float|bool|string $right,
- string $leftType = self::TYPE_IDENTIFIER,
- string $rightType = self::TYPE_VALUE
- ) : self;
+ null|float|int|string|ArgumentInterface $left,
+ null|float|int|string|ArgumentInterface $right
+ ) : static;
public function greaterThan(
- int|float|bool|string $left,
- int|float|bool|string $right,
- string $leftType = self::TYPE_IDENTIFIER,
- string $rightType = self::TYPE_VALUE
- ) : self;
+ null|float|int|string|ArgumentInterface $left,
+ null|float|int|string|ArgumentInterface $right
+ ) : static;
public function lessThanOrEqualTo(
- int|float|bool|string $left,
- int|float|bool|string $right,
- string $leftType = self::TYPE_IDENTIFIER,
- string $rightType = self::TYPE_VALUE
- ) : self;
+ null|float|int|string|ArgumentInterface $left,
+ null|float|int|string|ArgumentInterface $right
+ ) : static;
public function greaterThanOrEqualTo(
- int|float|bool|string $left,
- int|float|bool|string $right,
- string $leftType = self::TYPE_IDENTIFIER,
- string $rightType = self::TYPE_VALUE
- ) : self;
- public function like(string $identifier, string $like) : self;
- public function notLike(string $identifier, string $notLike) : self;
- public function literal(string $literal) : self;
- public function expression(string $expression, array $parameters = null) : self;
- public function isNull(string $identifier) : self;
- public function isNotNull(string $identifier) : self;
- public function in(string $identifier, array $valueSet = []) : self;
- public function notIn(string $identifier, array $valueSet = []) : self;
+ null|float|int|string|ArgumentInterface $left,
+ null|float|int|string|ArgumentInterface $right
+ ) : static;
+ public function like(
+ null|float|int|string|ArgumentInterface $identifier,
+ null|float|int|string|ArgumentInterface $like
+ ) : static;
+ public function notLike(
+ null|float|int|string|ArgumentInterface $identifier,
+ null|float|int|string|ArgumentInterface $notLike
+ ) : static;
+ public function literal(string $literal) : static;
+ public function expression(
+ string $expression,
+ null|string|float|int|array|ArgumentInterface
+ |ExpressionInterface $parameters = []
+ ) : static;
+ public function isNull(
+ float|int|string|ArgumentInterface $identifier
+ ) : static;
+ public function isNotNull(
+ float|int|string|ArgumentInterface $identifier
+ ) : static;
+ public function in(
+ float|int|string|ArgumentInterface $identifier,
+ array|ArgumentInterface $valueSet
+ ) : static;
+ public function notIn(
+ float|int|string|ArgumentInterface $identifier,
+ array|ArgumentInterface $valueSet
+ ) : static;
public function between(
- string $identifier,
- int|float|string $minValue,
- int|float|string $maxValue
- ) : self;
+ null|float|int|string|array|ArgumentInterface $identifier,
+ null|float|int|string|array|ArgumentInterface $minValue,
+ null|float|int|string|array|ArgumentInterface $maxValue
+ ) : static;
public function notBetween(
- string $identifier,
- int|float|string $minValue,
- int|float|string $maxValue
- ) : self;
- public function predicate(PredicateInterface $predicate) : self;
+ null|float|int|string|array|ArgumentInterface $identifier,
+ null|float|int|string|array|ArgumentInterface $minValue,
+ null|float|int|string|array|ArgumentInterface $maxValue
+ ) : static;
+ public function predicate(PredicateInterface $predicate) : static;
// Inherited From PredicateSet
- public function addPredicate(PredicateInterface $predicate, $combination = null) : self;
- public function getPredicates() PredicateInterface[];
- public function orPredicate(PredicateInterface $predicate) : self;
- public function andPredicate(PredicateInterface $predicate) : self;
- public function getExpressionData() : array;
+ public function addPredicate(
+ PredicateInterface $predicate,
+ ?string $combination = null
+ ) : static;
+ public function addPredicates(
+ PredicateInterface|Closure|string|array $predicates,
+ string $combination = self::OP_AND
+ ) : static;
+ public function getPredicates() : array;
+ public function orPredicate(
+ PredicateInterface $predicate
+ ) : static;
+ public function andPredicate(
+ PredicateInterface $predicate
+ ) : static;
+ public function getExpressionData() : ExpressionData;
public function count() : int;
}
```
-Each method in the API will produce a corresponding `Predicate` object of a similarly named
-type, as described below.
+> **Note:** The `$leftType` and `$rightType` parameters have been removed
+> from comparison methods. Type information is now encoded within
+> `ArgumentInterface` implementations. Pass an `Argument\Identifier` for
+> column names, `Argument\Value` for values, or `Argument\Literal` for raw
+> SQL fragments directly to control how values are treated.
+
+Each method in the API will produce a corresponding `Predicate` object of a
+similarly named type, as described below.
### equalTo(), lessThan(), greaterThan(), lessThanOrEqualTo(), greaterThanOrEqualTo()
@@ -522,7 +673,7 @@ $where->equalTo('id', 5);
// The above is equivalent to:
$where->addPredicate(
- new Predicate\Operator($left, Operator::OPERATOR_EQUAL_TO, $right, $leftType, $rightType)
+ new Predicate\Operator('id', Operator::OPERATOR_EQUAL_TO, 5)
);
```
@@ -531,40 +682,47 @@ Operators use the following API:
```php
class Operator implements PredicateInterface
{
- const OPERATOR_EQUAL_TO = '=';
- const OP_EQ = '=';
- const OPERATOR_NOT_EQUAL_TO = '!=';
- const OP_NE = '!=';
- const OPERATOR_LESS_THAN = '<';
- const OP_LT = '<';
- const OPERATOR_LESS_THAN_OR_EQUAL_TO = '<=';
- const OP_LTE = '<=';
- const OPERATOR_GREATER_THAN = '>';
- const OP_GT = '>';
- const OPERATOR_GREATER_THAN_OR_EQUAL_TO = '>=';
- const OP_GTE = '>=';
+ final public const OPERATOR_EQUAL_TO = '=';
+ final public const OP_EQ = '=';
+ final public const OPERATOR_NOT_EQUAL_TO = '!=';
+ final public const OP_NE = '!=';
+ final public const OPERATOR_LESS_THAN = '<';
+ final public const OP_LT = '<';
+ final public const OPERATOR_LESS_THAN_OR_EQUAL_TO = '<=';
+ final public const OP_LTE = '<=';
+ final public const OPERATOR_GREATER_THAN = '>';
+ final public const OP_GT = '>';
+ final public const OPERATOR_GREATER_THAN_OR_EQUAL_TO = '>=';
+ final public const OP_GTE = '>=';
public function __construct(
- int|float|bool|string $left = null,
+ null|string|ArgumentInterface
+ |ExpressionInterface|SqlInterface $left = null,
string $operator = self::OPERATOR_EQUAL_TO,
- int|float|bool|string $right = null,
- string $leftType = self::TYPE_IDENTIFIER,
- string $rightType = self::TYPE_VALUE
+ null|bool|string|int|float|ArgumentInterface
+ |ExpressionInterface|SqlInterface $right = null
);
- public function setLeft(int|float|bool|string $left);
- public function getLeft() : int|float|bool|string;
- public function setLeftType(string $type) : self;
- public function getLeftType() : string;
- public function setOperator(string $operator);
+ public function setLeft(
+ string|ArgumentInterface|ExpressionInterface|SqlInterface $left
+ ) : static;
+ public function getLeft() : ?ArgumentInterface;
+ public function setOperator(string $operator) : static;
public function getOperator() : string;
- public function setRight(int|float|bool|string $value) : self;
- public function getRight() : int|float|bool|string;
- public function setRightType(string $type) : self;
- public function getRightType() : string;
- public function getExpressionData() : array;
+ public function setRight(
+ null|bool|string|int|float|ArgumentInterface
+ |ExpressionInterface|SqlInterface $right
+ ) : static;
+ public function getRight() : ?ArgumentInterface;
+ public function getExpressionData() : ExpressionData;
}
```
+> **Note:** The `setLeftType()`, `getLeftType()`, `setRightType()`, and
+> `getRightType()` methods have been removed. Type information is now
+> encoded within the `ArgumentInterface` implementations. Pass
+> `Argument\Identifier`, `Argument\Value`, or `Argument\Literal` directly
+> to `setLeft()` and `setRight()` to control how values are treated.
+
### like($identifier, $like), notLike($identifier, $notLike)
```php
@@ -581,11 +739,19 @@ The following is the `Like` API:
```php
class Like implements PredicateInterface
{
- public function __construct(string $identifier = null, string $like = null);
- public function setIdentifier(string $identifier) : self;
- public function getIdentifier() : string;
- public function setLike(string $like) : self;
- public function getLike() : string;
+ public function __construct(
+ null|string|ArgumentInterface $identifier = null,
+ null|bool|float|int|string|ArgumentInterface $like = null
+ );
+ public function setIdentifier(string|ArgumentInterface $identifier) : static;
+ public function getIdentifier() : ?ArgumentInterface;
+ public function setLike(
+ bool|float|int|null|string|ArgumentInterface $like
+ ) : static;
+ public function getLike() : ?ArgumentInterface;
+ public function setSpecification(string $specification) : static;
+ public function getSpecification() : string;
+ public function getExpressionData() : ExpressionData;
}
```
@@ -605,10 +771,10 @@ The following is the `Literal` API:
```php
class Literal implements ExpressionInterface, PredicateInterface
{
- const PLACEHOLDER = '?';
public function __construct(string $literal = '');
public function setLiteral(string $literal) : self;
public function getLiteral() : string;
+ public function getExpressionData() : ExpressionData;
}
```
@@ -628,23 +794,41 @@ The following is the `Expression` API:
```php
class Expression implements ExpressionInterface, PredicateInterface
{
- const PLACEHOLDER = '?';
+ final public const PLACEHOLDER = '?';
public function __construct(
- string $expression = null,
- int|float|bool|string|array $valueParameter = null
- /* [, $valueParameter, ... ] */
+ string $expression = '',
+ null|bool|string|float|int|array|ArgumentInterface
+ |ExpressionInterface $parameters = []
);
public function setExpression(string $expression) : self;
public function getExpression() : string;
- public function setParameters(int|float|bool|string|array $parameters) : self;
+ public function setParameters(
+ null|bool|string|float|int|array|ExpressionInterface
+ |ArgumentInterface $parameters = []
+ ) : self;
public function getParameters() : array;
+ public function getExpressionData() : ExpressionData;
}
```
-Expression parameters can be supplied either as a single scalar, an array of values, or as an array of value/types for more granular escaping.
+Expression parameters can be supplied in multiple ways:
```php
+// Using Argument classes (recommended)
+$expression = new Expression(
+ 'CONCAT(?, ?, ?)',
+ [
+ new Argument\Identifier('column1'),
+ new Argument\Value('-'),
+ new Argument\Identifier('column2')
+ ]
+);
+
+// Scalar values are auto-wrapped as Argument\Value
+$expression = new Expression('column > ?', 5);
+
+// Legacy array format still supported
$select
->from('foo')
->columns([
@@ -677,9 +861,12 @@ The following is the `IsNull` API:
```php
class IsNull implements PredicateInterface
{
- public function __construct(string $identifier = null);
- public function setIdentifier(string $identifier) : self;
- public function getIdentifier() : string;
+ public function __construct(null|string|ArgumentInterface $identifier = null);
+ public function setIdentifier(string|ArgumentInterface $identifier) : static;
+ public function getIdentifier() : ?ArgumentInterface;
+ public function setSpecification(string $specification) : static;
+ public function getSpecification() : string;
+ public function getExpressionData() : ExpressionData;
}
```
@@ -699,9 +886,12 @@ The following is the `IsNotNull` API:
```php
class IsNotNull implements PredicateInterface
{
- public function __construct(string $identifier = null);
- public function setIdentifier(string $identifier) : self;
- public function getIdentifier() : string;
+ public function __construct(null|string|ArgumentInterface $identifier = null);
+ public function setIdentifier(string|ArgumentInterface $identifier) : static;
+ public function getIdentifier() : ?ArgumentInterface;
+ public function setSpecification(string $specification) : static;
+ public function getSpecification() : string;
+ public function getExpressionData() : ExpressionData;
}
```
@@ -722,17 +912,20 @@ The following is the `In` API:
class In implements PredicateInterface
{
public function __construct(
- string|array $identifier = null,
- array|Select $valueSet = null
+ null|string|ArgumentInterface $identifier = null,
+ null|array|Select|ArgumentInterface $valueSet = null
);
- public function setIdentifier(string|array $identifier) : self;
- public function getIdentifier() : string|array;
- public function setValueSet(array|Select $valueSet) : self;
- public function getValueSet() : array|Select;
+ public function setIdentifier(string|ArgumentInterface $identifier) : static;
+ public function getIdentifier() : ?ArgumentInterface;
+ public function setValueSet(
+ array|Select|ArgumentInterface $valueSet
+ ) : static;
+ public function getValueSet() : ?ArgumentInterface;
+ public function getExpressionData() : ExpressionData;
}
```
-### between($identifier, $minValue, $maxValue), notBetween($identifier, $minValue, $maxValue)
+### between() and notBetween()
```php
$where->between($identifier, $minValue, $maxValue);
@@ -749,16 +942,24 @@ The following is the `Between` API:
class Between implements PredicateInterface
{
public function __construct(
- string $identifier = null,
- int|float|string $minValue = null,
- int|float|string $maxValue = null
+ null|string|ArgumentInterface $identifier = null,
+ null|int|float|string|ArgumentInterface $minValue = null,
+ null|int|float|string|ArgumentInterface $maxValue = null
);
- public function setIdentifier(string $identifier) : self;
- public function getIdentifier() : string;
- public function setMinValue(int|float|string $minValue) : self;
- public function getMinValue() : int|float|string;
- public function setMaxValue(int|float|string $maxValue) : self;
- public function getMaxValue() : int|float|string;
- public function setSpecification(string $specification);
+ public function setIdentifier(
+ string|ArgumentInterface $identifier
+ ) : static;
+ public function getIdentifier() : ?ArgumentInterface;
+ public function setMinValue(
+ null|int|float|string|bool|ArgumentInterface $minValue
+ ) : static;
+ public function getMinValue() : ?ArgumentInterface;
+ public function setMaxValue(
+ null|int|float|string|bool|ArgumentInterface $maxValue
+ ) : static;
+ public function getMaxValue() : ?ArgumentInterface;
+ public function setSpecification(string $specification) : static;
+ public function getSpecification() : string;
+ public function getExpressionData() : ExpressionData;
}
```
diff --git a/docs/book/table-gateway.md b/docs/book/table-gateway.md
index 5b8d2ebbf..9fdc1416e 100644
--- a/docs/book/table-gateway.md
+++ b/docs/book/table-gateway.md
@@ -227,26 +227,26 @@ listed.
- `preInitialize` (no parameters)
- `postInitialize` (no parameters)
- `preSelect`, with the following parameters:
- - `select`, with type `PhpDb\Sql\Select`
+ - `select`, with type `PhpDb\Sql\Select`
- `postSelect`, with the following parameters:
- - `statement`, with type `PhpDb\Adapter\Driver\StatementInterface`
- - `result`, with type `PhpDb\Adapter\Driver\ResultInterface`
- - `resultSet`, with type `PhpDb\ResultSet\ResultSetInterface`
+ - `statement`, with type `PhpDb\Adapter\Driver\StatementInterface`
+ - `result`, with type `PhpDb\Adapter\Driver\ResultInterface`
+ - `resultSet`, with type `PhpDb\ResultSet\ResultSetInterface`
- `preInsert`, with the following parameters:
- - `insert`, with type `PhpDb\Sql\Insert`
+ - `insert`, with type `PhpDb\Sql\Insert`
- `postInsert`, with the following parameters:
- - `statement` with type `PhpDb\Adapter\Driver\StatementInterface`
- - `result` with type `PhpDb\Adapter\Driver\ResultInterface`
+ - `statement` with type `PhpDb\Adapter\Driver\StatementInterface`
+ - `result` with type `PhpDb\Adapter\Driver\ResultInterface`
- `preUpdate`, with the following parameters:
- - `update`, with type `PhpDb\Sql\Update`
+ - `update`, with type `PhpDb\Sql\Update`
- `postUpdate`, with the following parameters:
- - `statement`, with type `PhpDb\Adapter\Driver\StatementInterface`
- - `result`, with type `PhpDb\Adapter\Driver\ResultInterface`
+ - `statement`, with type `PhpDb\Adapter\Driver\StatementInterface`
+ - `result`, with type `PhpDb\Adapter\Driver\ResultInterface`
- `preDelete`, with the following parameters:
- - `delete`, with type `PhpDb\Sql\Delete`
+ - `delete`, with type `PhpDb\Sql\Delete`
- `postDelete`, with the following parameters:
- - `statement`, with type `PhpDb\Adapter\Driver\StatementInterface`
- - `result`, with type `PhpDb\Adapter\Driver\ResultInterface`
+ - `statement`, with type `PhpDb\Adapter\Driver\StatementInterface`
+ - `result`, with type `PhpDb\Adapter\Driver\ResultInterface`
Listeners receive a `PhpDb\TableGateway\Feature\EventFeature\TableGatewayEvent`
instance as an argument. Within the listener, you can retrieve a parameter by
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
index 6fe40caa1..0055b7417 100644
--- a/phpstan-baseline.neon
+++ b/phpstan-baseline.neon
@@ -60,18 +60,6 @@ parameters:
count: 1
path: src/Adapter/Driver/Pdo/Result.php
- -
- message: '#^If condition is always true\.$#'
- identifier: if.alwaysTrue
- count: 1
- path: src/Adapter/Driver/Pdo/Statement.php
-
- -
- message: '#^Instanceof between PhpDb\\Adapter\\ParameterContainer and PhpDb\\Adapter\\ParameterContainer will always evaluate to true\.$#'
- identifier: instanceof.alwaysTrue
- count: 1
- path: src/Adapter/Driver/Pdo/Statement.php
-
-
message: '#^Method PhpDb\\Adapter\\Driver\\DriverInterface\:\:createResult\(\) invoked with 2 parameters, 1 required\.$#'
identifier: arguments.count
@@ -102,102 +90,12 @@ parameters:
count: 1
path: src/Metadata/Source/AbstractSource.php
- -
- message: '#^Instantiated class PhpDb\\Metadata\\Source\\MysqlMetadata not found\.$#'
- identifier: class.notFound
- count: 1
- path: src/Metadata/Source/Factory.php
-
- -
- message: '#^Instantiated class PhpDb\\Metadata\\Source\\OracleMetadata not found\.$#'
- identifier: class.notFound
- count: 1
- path: src/Metadata/Source/Factory.php
-
- -
- message: '#^Instantiated class PhpDb\\Metadata\\Source\\PostgresqlMetadata not found\.$#'
- identifier: class.notFound
- count: 1
- path: src/Metadata/Source/Factory.php
-
- -
- message: '#^Instantiated class PhpDb\\Metadata\\Source\\SqlServerMetadata not found\.$#'
- identifier: class.notFound
- count: 1
- path: src/Metadata/Source/Factory.php
-
- -
- message: '#^Instantiated class PhpDb\\Metadata\\Source\\SqliteMetadata not found\.$#'
- identifier: class.notFound
- count: 1
- path: src/Metadata/Source/Factory.php
-
- -
- message: '#^Method PhpDb\\Metadata\\Source\\Factory\:\:createSourceFromAdapter\(\) should return PhpDb\\Metadata\\MetadataInterface but returns PhpDb\\Metadata\\Source\\MysqlMetadata\.$#'
- identifier: return.type
- count: 1
- path: src/Metadata/Source/Factory.php
-
- -
- message: '#^Method PhpDb\\Metadata\\Source\\Factory\:\:createSourceFromAdapter\(\) should return PhpDb\\Metadata\\MetadataInterface but returns PhpDb\\Metadata\\Source\\OracleMetadata\.$#'
- identifier: return.type
- count: 1
- path: src/Metadata/Source/Factory.php
-
- -
- message: '#^Method PhpDb\\Metadata\\Source\\Factory\:\:createSourceFromAdapter\(\) should return PhpDb\\Metadata\\MetadataInterface but returns PhpDb\\Metadata\\Source\\PostgresqlMetadata\.$#'
- identifier: return.type
- count: 1
- path: src/Metadata/Source/Factory.php
-
- -
- message: '#^Method PhpDb\\Metadata\\Source\\Factory\:\:createSourceFromAdapter\(\) should return PhpDb\\Metadata\\MetadataInterface but returns PhpDb\\Metadata\\Source\\SqlServerMetadata\.$#'
- identifier: return.type
- count: 1
- path: src/Metadata/Source/Factory.php
-
- -
- message: '#^Method PhpDb\\Metadata\\Source\\Factory\:\:createSourceFromAdapter\(\) should return PhpDb\\Metadata\\MetadataInterface but returns PhpDb\\Metadata\\Source\\SqliteMetadata\.$#'
- identifier: return.type
- count: 1
- path: src/Metadata/Source/Factory.php
-
-
message: '#^Property PhpDb\\ResultSet\\AbstractResultSet\:\:\$dataSource \(Iterator\|IteratorAggregate\|null\) does not accept Traversable\\.$#'
identifier: assign.propertyType
count: 1
path: src/ResultSet/AbstractResultSet.php
- -
- message: '#^Call to function is_object\(\) with object will always evaluate to true\.$#'
- identifier: function.alreadyNarrowedType
- count: 1
- path: src/ResultSet/HydratingResultSet.php
-
- -
- message: '#^Call to function method_exists\(\) with \*NEVER\* and ''exchangeArray'' will always evaluate to true\.$#'
- identifier: function.alreadyNarrowedType
- count: 1
- path: src/ResultSet/ResultSet.php
-
- -
- message: '#^Call to function method_exists\(\) with ArrayObject and ''exchangeArray'' will always evaluate to true\.$#'
- identifier: function.alreadyNarrowedType
- count: 1
- path: src/ResultSet/ResultSet.php
-
- -
- message: '#^Instanceof between ArrayObject and ArrayObject will always evaluate to true\.$#'
- identifier: instanceof.alwaysTrue
- count: 1
- path: src/ResultSet/ResultSet.php
-
- -
- message: '#^Result of \|\| is always true\.$#'
- identifier: booleanOr.alwaysTrue
- count: 1
- path: src/ResultSet/ResultSet.php
-
-
message: '#^Call to an undefined method PhpDb\\Adapter\\StatementContainerInterface\:\:execute\(\)\.$#'
identifier: method.notFound
@@ -210,186 +108,12 @@ parameters:
count: 2
path: src/RowGateway/AbstractRowGateway.php
- -
- message: '#^Access to an undefined property \$this\(PhpDb\\Sql\\AbstractSql\)&PhpDb\\Sql\\Platform\\PlatformDecoratorInterface\:\:\$subject\.$#'
- identifier: property.notFound
- count: 1
- path: src/Sql/AbstractSql.php
-
- -
- message: '#^Call to function is_string\(\) with string will always evaluate to true\.$#'
- identifier: function.alreadyNarrowedType
- count: 1
- path: src/Sql/AbstractSql.php
-
- -
- message: '#^Cannot assign offset ''subselectCount'' to string\.$#'
- identifier: offsetAssign.dimType
- count: 1
- path: src/Sql/AbstractSql.php
-
- -
- message: '#^Method PhpDb\\Sql\\AbstractSql\:\:processJoin\(\) should return array\\|null but empty return statement found\.$#'
- identifier: return.empty
- count: 1
- path: src/Sql/AbstractSql.php
-
- -
- message: '#^Method PhpDb\\Sql\\AbstractSql\:\:processJoin\(\) should return array\\|null but returns array\\>\>\.$#'
- identifier: return.type
- count: 1
- path: src/Sql/AbstractSql.php
-
- -
- message: '#^Offset ''paramPrefix'' does not exist on string\.$#'
- identifier: offsetAccess.notFound
- count: 2
- path: src/Sql/AbstractSql.php
-
- -
- message: '#^Offset ''subselectCount'' does not exist on string\.$#'
- identifier: offsetAccess.notFound
- count: 2
- path: src/Sql/AbstractSql.php
-
- -
- message: '#^PHPDoc tag @param for parameter \$joins with type array\ is incompatible with native type PhpDb\\Sql\\Join\.$#'
- identifier: parameter.phpDocType
- count: 1
- path: src/Sql/AbstractSql.php
-
- -
- message: '#^Property PhpDb\\Sql\\AbstractSql\:\:\$processInfo \(string\) does not accept default value of type array\\.$#'
- identifier: property.defaultValue
- count: 1
- path: src/Sql/AbstractSql.php
-
- -
- message: '#^Strict comparison using \!\=\= between mixed and null will always evaluate to true\.$#'
- identifier: notIdentical.alwaysTrue
- count: 1
- path: src/Sql/AbstractSql.php
-
-
message: '#^Variable \$paramSpecs might not be defined\.$#'
identifier: variable.undefined
count: 1
path: src/Sql/AbstractSql.php
- -
- message: '#^Binary operation "\." between '' '' and PhpDb\\Sql\\Select results in an error\.$#'
- identifier: binaryOp.invalid
- count: 1
- path: src/Sql/Combine.php
-
- -
- message: '#^Method PhpDb\\Sql\\Combine\:\:buildSqlString\(\) should return string but empty return statement found\.$#'
- identifier: return.empty
- count: 1
- path: src/Sql/Combine.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\AlterTable\:\:processAddColumns\(\) should return array\ but returns array\\>\.$#'
- identifier: return.type
- count: 1
- path: src/Sql/Ddl/AlterTable.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\AlterTable\:\:processAddConstraints\(\) should return array\ but returns array\\>\.$#'
- identifier: return.type
- count: 1
- path: src/Sql/Ddl/AlterTable.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\AlterTable\:\:processChangeColumns\(\) should return array\ but returns array\\>\>\.$#'
- identifier: return.type
- count: 1
- path: src/Sql/Ddl/AlterTable.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\AlterTable\:\:processDropColumns\(\) should return array\ but returns array\\>\.$#'
- identifier: return.type
- count: 1
- path: src/Sql/Ddl/AlterTable.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\AlterTable\:\:processDropConstraints\(\) should return array\ but returns array\\>\.$#'
- identifier: return.type
- count: 1
- path: src/Sql/Ddl/AlterTable.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\AlterTable\:\:processDropIndexes\(\) should return array\ but returns array\\>\.$#'
- identifier: return.type
- count: 1
- path: src/Sql/Ddl/AlterTable.php
-
- -
- message: '#^PHPDoc type array of property PhpDb\\Sql\\Ddl\\AlterTable\:\:\$specifications is not covariant with PHPDoc type array\ of overridden property PhpDb\\Sql\\AbstractSql\:\:\$specifications\.$#'
- identifier: property.phpDocType
- count: 1
- path: src/Sql/Ddl/AlterTable.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\Column\\AbstractPrecisionColumn\:\:getLengthExpression\(\) should return string but returns int\.$#'
- identifier: return.type
- count: 1
- path: src/Sql/Ddl/Column/AbstractPrecisionColumn.php
-
- -
- message: '#^Class PhpDb\\Sql\\Ddl\\Column\\Boolean referenced with incorrect case\: PhpDb\\Sql\\Ddl\\Column\\boolean\.$#'
- identifier: class.nameCase
- count: 1
- path: src/Sql/Ddl/Column/Column.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\CreateTable\:\:processColumns\(\) should return array\\>\|null but empty return statement found\.$#'
- identifier: return.empty
- count: 1
- path: src/Sql/Ddl/CreateTable.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\CreateTable\:\:processCombinedby\(\) should return array\|string but return statement is missing\.$#'
- identifier: return.missing
- count: 1
- path: src/Sql/Ddl/CreateTable.php
-
- -
- message: '#^Method PhpDb\\Sql\\Ddl\\CreateTable\:\:processConstraints\(\) should return array\\>\|null but empty return statement found\.$#'
- identifier: return.empty
- count: 1
- path: src/Sql/Ddl/CreateTable.php
-
- -
- message: '#^PHPDoc type array of property PhpDb\\Sql\\Ddl\\DropTable\:\:\$specifications is not covariant with PHPDoc type array\ of overridden property PhpDb\\Sql\\AbstractSql\:\:\$specifications\.$#'
- identifier: property.phpDocType
- count: 1
- path: src/Sql/Ddl/DropTable.php
-
- -
- message: '#^Method PhpDb\\Sql\\Delete\:\:__get\(\) should return PhpDb\\Sql\\Where\|null but return statement is missing\.$#'
- identifier: return.missing
- count: 1
- path: src/Sql/Delete.php
-
- -
- message: '#^Method PhpDb\\Sql\\Delete\:\:processWhere\(\) should return string\|null but empty return statement found\.$#'
- identifier: return.empty
- count: 1
- path: src/Sql/Delete.php
-
- -
- message: '#^Call to function is_array\(\) with array will always evaluate to true\.$#'
- identifier: function.alreadyNarrowedType
- count: 1
- path: src/Sql/Expression.php
-
- -
- message: '#^Method PhpDb\\Sql\\Insert\:\:__set\(\) with return type void returns \$this\(PhpDb\\Sql\\Insert\) but should not return anything\.$#'
- identifier: return.void
- count: 1
- path: src/Sql/Insert.php
-
-
message: '#^PHPDoc type array of property PhpDb\\Sql\\InsertIgnore\:\:\$specifications is not covariant with PHPDoc type array\ of overridden property PhpDb\\Sql\\Insert\:\:\$specifications\.$#'
identifier: property.phpDocType
@@ -397,22 +121,16 @@ parameters:
path: src/Sql/InsertIgnore.php
-
- message: '#^Instanceof between PhpDb\\Sql\\PreparableSqlInterface\|PhpDb\\Sql\\SqlInterface and mixed results in an error\.$#'
- identifier: instanceof.invalidExprType
- count: 1
- path: src/Sql/Platform/AbstractPlatform.php
-
- -
- message: '#^Method PhpDb\\Sql\\Platform\\AbstractPlatform\:\:prepareStatement\(\) with return type void returns PhpDb\\Adapter\\StatementContainerInterface but should not return anything\.$#'
- identifier: return.void
+ message: '#^PHPDoc tag @implements has invalid value \(Countable\)\: Unexpected token "\\n ", expected ''\<'' at offset 419 on line 12$#'
+ identifier: phpDoc.parseError
count: 1
- path: src/Sql/Platform/AbstractPlatform.php
+ path: src/Sql/Join.php
-
- message: '#^Argument of an invalid type PhpDb\\Sql\\Platform\\PlatformDecoratorInterface supplied for foreach, only iterables are supported\.$#'
- identifier: foreach.nonIterable
+ message: '#^PHPDoc tag @implements has invalid value \(Iterator\)\: Unexpected token "\\n \* ", expected ''\<'' at offset 394 on line 11$#'
+ identifier: phpDoc.parseError
count: 1
- path: src/Sql/Platform/Platform.php
+ path: src/Sql/Join.php
-
message: '#^Cannot call method setSubject\(\) on class\-string\|object\.$#'
@@ -421,99 +139,21 @@ parameters:
path: src/Sql/Platform/Platform.php
-
- message: '#^Method PhpDb\\Sql\\Platform\\Platform\:\:getDecorators\(\) should return array\ but returns PhpDb\\Sql\\Platform\\PlatformDecoratorInterface\.$#'
- identifier: return.type
- count: 1
- path: src/Sql/Platform/Platform.php
-
- -
- message: '#^Method PhpDb\\Sql\\Platform\\Platform\:\:prepareStatement\(\) with return type void returns PhpDb\\Adapter\\StatementContainerInterface but should not return anything\.$#'
- identifier: return.void
- count: 1
- path: src/Sql/Platform/Platform.php
-
- -
- message: '#^Property PhpDb\\Sql\\Predicate\\IsNull\:\:\$identifier has unknown class PhpDb\\Sql\\Predicate\\nuill as its type\.$#'
- identifier: class.notFound
- count: 1
- path: src/Sql/Predicate/IsNull.php
-
- -
- message: '#^Method PhpDb\\Sql\\Predicate\\Predicate\:\:__get\(\) should return \$this\(PhpDb\\Sql\\Predicate\\Predicate\) but returns PhpDb\\Sql\\Predicate\\Predicate\.$#'
- identifier: return.type
- count: 2
- path: src/Sql/Predicate/Predicate.php
-
- -
- message: '#^Cannot call method addPredicates\(\) on array\|string\.$#'
- identifier: method.nonObject
- count: 1
- path: src/Sql/Select.php
-
- -
- message: '#^Cannot call method count\(\) on array\|string\.$#'
- identifier: method.nonObject
- count: 1
- path: src/Sql/Select.php
-
- -
- message: '#^Cannot call method getJoins\(\) on array\\.$#'
- identifier: method.nonObject
- count: 1
- path: src/Sql/Select.php
-
- -
- message: '#^Cannot call method join\(\) on array\\.$#'
- identifier: method.nonObject
- count: 1
- path: src/Sql/Select.php
-
- -
- message: '#^Cannot clone array\\.$#'
- identifier: clone.nonObject
- count: 1
- path: src/Sql/Select.php
-
- -
- message: '#^Cannot clone array\|string\.$#'
- identifier: clone.nonObject
- count: 1
- path: src/Sql/Select.php
-
- -
- message: '#^Offset ''paramPrefix'' does not exist on string\.$#'
- identifier: offsetAccess.notFound
- count: 2
- path: src/Sql/Select.php
-
- -
- message: '#^Property PhpDb\\Sql\\Select\:\:\$having \(array\|string\|null\) does not accept PhpDb\\Sql\\Having\.$#'
- identifier: assign.propertyType
- count: 3
- path: src/Sql/Select.php
-
- -
- message: '#^Property PhpDb\\Sql\\Select\:\:\$joins \(array\\) does not accept PhpDb\\Sql\\Join\.$#'
- identifier: assign.propertyType
- count: 2
- path: src/Sql/Select.php
-
- -
- message: '#^Return type \(array\) of method PhpDb\\Sql\\Select\:\:resolveTable\(\) should be compatible with return type \(string\) of method PhpDb\\Sql\\AbstractSql\:\:resolveTable\(\)$#'
- identifier: method.childReturnType
- count: 1
- path: src/Sql/Select.php
+ message: '#^Call to an undefined method PhpDb\\Adapter\\StatementContainerInterface\:\:execute\(\)\.$#'
+ identifier: method.notFound
+ count: 4
+ path: src/TableGateway/AbstractTableGateway.php
-
- message: '#^Result of method PhpDb\\Sql\\Platform\\Platform\:\:prepareStatement\(\) \(void\) is used\.$#'
- identifier: method.void
+ message: '#^Call to an undefined method PhpDb\\TableGateway\\Feature\\FeatureSet\:\:callMagicSet\(\)\.$#'
+ identifier: method.notFound
count: 1
- path: src/Sql/Sql.php
+ path: src/TableGateway/AbstractTableGateway.php
-
- message: '#^Call to an undefined method PhpDb\\Adapter\\StatementContainerInterface\:\:execute\(\)\.$#'
+ message: '#^Call to an undefined method PhpDb\\TableGateway\\Feature\\FeatureSet\:\:canCallMagicSet\(\)\.$#'
identifier: method.notFound
- count: 4
+ count: 1
path: src/TableGateway/AbstractTableGateway.php
-
@@ -540,12 +180,6 @@ parameters:
count: 1
path: src/TableGateway/AbstractTableGateway.php
- -
- message: '#^Method PhpDb\\TableGateway\\Feature\\EventFeature\\TableGatewayEvent\:\:getName\(\) should return string but returns null\.$#'
- identifier: return.type
- count: 1
- path: src/TableGateway/Feature/EventFeature/TableGatewayEvent.php
-
-
message: '#^Parameter \#1 \$params \(string\) of method PhpDb\\TableGateway\\Feature\\EventFeature\\TableGatewayEvent\:\:setParams\(\) should be compatible with parameter \$params \(array\|object\) of method Laminas\\EventManager\\EventInterface\