From 23c74decbd1af4f4a41b76f7145879dc5eb00e41 Mon Sep 17 00:00:00 2001 From: alexmerlin Date: Mon, 20 Jan 2025 11:37:06 +0200 Subject: [PATCH] Added support for laminas/laminas-servicemanager:4.x Signed-off-by: alexmerlin --- .laminas-ci.json | 6 ++++++ README.md | 6 +++--- composer.json | 15 +++++++------ docs/book/index.md | 2 +- docs/book/v3/overview.md | 2 +- mkdocs.yml | 2 +- psalm-baseline.xml | 5 ----- src/Provider/Factory.php | 6 +++++- src/Provider/ProviderPluginManager.php | 30 ++++++++++++++++++++------ test/Provider/FactoryTest.php | 12 +++++------ 10 files changed, 55 insertions(+), 31 deletions(-) create mode 100644 .laminas-ci.json mode change 100644 => 120000 docs/book/index.md diff --git a/.laminas-ci.json b/.laminas-ci.json new file mode 100644 index 0000000..790cfe4 --- /dev/null +++ b/.laminas-ci.json @@ -0,0 +1,6 @@ +{ + "ignore_php_platform_requirements": { + "8.4": true + }, + "backwardCompatibilityCheck": true +} diff --git a/README.md b/README.md index 8911399..77ba652 100644 --- a/README.md +++ b/README.md @@ -11,15 +11,15 @@ [![Build Static](https://github.com/dotkernel/dot-navigation/actions/workflows/static-analysis.yml/badge.svg?branch=3.0)](https://github.com/dotkernel/dot-navigation/actions/workflows/static-analysis.yml) [![codecov](https://codecov.io/gh/dotkernel/dot-navigation/graph/badge.svg?token=AI9WFYDDX9)](https://codecov.io/gh/dotkernel/dot-navigation) -[![SymfonyInsight](https://insight.symfony.com/projects/68b7c728-4cc9-40ac-a3be-cf17f9b2eaf1/big.svg)](https://insight.symfony.com/projects/68b7c728-4cc9-40ac-a3be-cf17f9b2eaf1) - Allows you to easily define and parse menus inside templates, configuration based approach. ## Installation Run - composer require dotkernel/dot-navigation +```shell +composer require dotkernel/dot-navigation +``` Merge `ConfigProvider` to your application's configuration. diff --git a/composer.json b/composer.json index 46272b2..3197633 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "dotkernel/dot-navigation", "type": "library", - "description": "DotKernel navigation component", + "description": "Dotkernel navigation component", "license": "MIT", "homepage": "https://github.com/dotkernel/dot-navigation", "keywords": [ @@ -13,7 +13,7 @@ ], "authors": [ { - "name": "DotKernel Team", + "name": "Dotkernel Team", "email": "team@dotkernel.com" } ], @@ -24,17 +24,17 @@ } }, "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", "dotkernel/dot-authorization": "^3.4.1", - "dotkernel/dot-helpers": "^3.5.1", + "dotkernel/dot-helpers": "^3.7.0", "laminas/laminas-escaper": "^2.13.0", - "laminas/laminas-servicemanager": "^3.22.1", + "laminas/laminas-servicemanager": "^4.0", "mezzio/mezzio-template": "^2.9.0", "psr/http-message": "^1.0 || ^2.0", "psr/http-server-middleware": "^1.0.2" }, "require-dev": { - "laminas/laminas-coding-standard": "^2.5.0", + "laminas/laminas-coding-standard": "^3.0.0", "phpunit/phpunit": "^10.4.2", "vimeo/psalm": "^5.16.0" }, @@ -51,7 +51,8 @@ "scripts": { "check": [ "@cs-check", - "@test" + "@test", + "@static-analysis" ], "cs-check": "phpcs", "cs-fix": "phpcbf", diff --git a/docs/book/index.md b/docs/book/index.md deleted file mode 100644 index ae42a26..0000000 --- a/docs/book/index.md +++ /dev/null @@ -1 +0,0 @@ -../../README.md diff --git a/docs/book/index.md b/docs/book/index.md new file mode 120000 index 0000000..fe84005 --- /dev/null +++ b/docs/book/index.md @@ -0,0 +1 @@ +../../README.md \ No newline at end of file diff --git a/docs/book/v3/overview.md b/docs/book/v3/overview.md index 510ecd9..159d976 100644 --- a/docs/book/v3/overview.md +++ b/docs/book/v3/overview.md @@ -1,3 +1,3 @@ # Overview -`dot-navigation` is DotKernel's component that allows you to easily define and parse menus inside templates, using a configuration based approach. +`dot-navigation` is Dotkernel's component that allows you to easily define and parse menus inside templates, using a configuration based approach. diff --git a/mkdocs.yml b/mkdocs.yml index 38b44dd..10f8597 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -17,7 +17,7 @@ nav: - "Required Page Options": v3/required-page-options.md - Usage: v3/usage.md site_name: dot-navigation -site_description: "DotKernel's component that allows you to easily define and parse menus inside templates, using a configuration based approach." +site_description: "Dotkernel's component that allows you to easily define and parse menus inside templates, using a configuration based approach." repo_url: "https://github.com/dotkernel/dot-navigation" plugins: - search diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 915d9e0..5b45731 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -10,9 +10,4 @@ RecursiveIterator - - - ProviderPluginManager - - diff --git a/src/Provider/Factory.php b/src/Provider/Factory.php index 7944eed..54e3ad2 100644 --- a/src/Provider/Factory.php +++ b/src/Provider/Factory.php @@ -5,6 +5,7 @@ namespace Dot\Navigation\Provider; use Dot\Navigation\Exception\RuntimeException; +use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerInterface; class Factory implements FactoryInterface @@ -18,6 +19,9 @@ public function __construct(ContainerInterface $container, ?ProviderPluginManage $this->providerPluginManager = $providerPluginManager; } + /** + * @throws ContainerExceptionInterface + */ public function create(array $specs): ProviderInterface { $type = $specs['type'] ?? ''; @@ -25,7 +29,7 @@ public function create(array $specs): ProviderInterface throw new RuntimeException('Undefined navigation provider type'); } - return $this->getProviderPluginManager()->get($type, $specs['options'] ?? null); + return $this->getProviderPluginManager()->build($type, $specs['options'] ?? null); } public function getProviderPluginManager(): ProviderPluginManager diff --git a/src/Provider/ProviderPluginManager.php b/src/Provider/ProviderPluginManager.php index 4ea540c..e258bef 100644 --- a/src/Provider/ProviderPluginManager.php +++ b/src/Provider/ProviderPluginManager.php @@ -5,24 +5,42 @@ namespace Dot\Navigation\Provider; use Laminas\ServiceManager\AbstractPluginManager; +use Laminas\ServiceManager\Exception\InvalidServiceException; use Laminas\ServiceManager\Factory\InvokableFactory; +use function gettype; +use function is_object; +use function sprintf; + +/** + * @template InstanceType + * @extends AbstractPluginManager + */ class ProviderPluginManager extends AbstractPluginManager { - /** @var string $instanceOf */ - protected $instanceOf = ProviderInterface::class; + protected string $instanceOf = ProviderInterface::class; - /** @var array */ - protected $factories = [ + protected array $factories = [ ArrayProvider::class => InvokableFactory::class, ]; - /** @var string[] $aliases */ - protected $aliases = [ + protected array $aliases = [ 'arrayprovider' => ArrayProvider::class, 'arrayProvider' => ArrayProvider::class, 'ArrayProvider' => ArrayProvider::class, 'array' => ArrayProvider::class, 'Array' => ArrayProvider::class, ]; + + public function validate(mixed $instance): void + { + if (! $instance instanceof $this->instanceOf) { + throw new InvalidServiceException(sprintf( + '%s can only create instances of %s; %s is invalid', + static::class, + $this->instanceOf, + is_object($instance) ? $instance::class : gettype($instance) + )); + } + } } diff --git a/test/Provider/FactoryTest.php b/test/Provider/FactoryTest.php index 1570f7e..ea4bee7 100644 --- a/test/Provider/FactoryTest.php +++ b/test/Provider/FactoryTest.php @@ -12,10 +12,9 @@ use Laminas\ServiceManager\Exception\ServiceNotFoundException; use PHPUnit\Framework\MockObject\Exception; use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerExceptionInterface; use Psr\Container\ContainerInterface; -use function sprintf; - class FactoryTest extends TestCase { /** @@ -42,6 +41,7 @@ public function testWillCreateFactoryWithProviderPluginManager(): void } /** + * @throws ContainerExceptionInterface * @throws Exception */ public function testFactoryWillNotCreateProviderWithoutProviderType(): void @@ -55,6 +55,7 @@ public function testFactoryWillNotCreateProviderWithoutProviderType(): void } /** + * @throws ContainerExceptionInterface * @throws Exception */ public function testFactoryWillNotCreateProviderWithInvalidProviderType(): void @@ -63,10 +64,7 @@ public function testFactoryWillNotCreateProviderWithInvalidProviderType(): void $this->expectException(ServiceNotFoundException::class); $this->expectExceptionMessage( - sprintf( - 'A plugin by the name "test" was not found in the plugin manager %s', - ProviderPluginManager::class - ) + 'Unable to resolve service "test" to a factory; are you certain you provided it during configuration?' ); $factory = new Factory($container); $factory->create([ @@ -75,6 +73,7 @@ public function testFactoryWillNotCreateProviderWithInvalidProviderType(): void } /** + * @throws ContainerExceptionInterface * @throws Exception */ public function testFactoryWillCreateProviderWithValidProviderTypeAndNoOptions(): void @@ -89,6 +88,7 @@ public function testFactoryWillCreateProviderWithValidProviderTypeAndNoOptions() } /** + * @throws ContainerExceptionInterface * @throws Exception */ public function testFactoryWillCreateProviderWithValidProviderTypeAndOptions(): void