diff --git a/src/Adapter/Driver/Feature/AbstractFeature.php b/src/Adapter/Driver/Feature/AbstractFeature.php index e5273759a..6452b0c29 100644 --- a/src/Adapter/Driver/Feature/AbstractFeature.php +++ b/src/Adapter/Driver/Feature/AbstractFeature.php @@ -1,28 +1,18 @@ driver = $driver; + return $this; } - - /** - * Get name - * - * @return string - */ - abstract public function getName(); } diff --git a/src/Adapter/Driver/Feature/DriverFeatureInterface.php b/src/Adapter/Driver/Feature/DriverFeatureInterface.php index d740f0502..79a5d48ee 100644 --- a/src/Adapter/Driver/Feature/DriverFeatureInterface.php +++ b/src/Adapter/Driver/Feature/DriverFeatureInterface.php @@ -1,25 +1,9 @@ $features + */ +interface DriverFeatureProviderInterface +{ + /** @param DriverFeatureInterface[] $features */ + public function addFeatures(array $features): DriverFeatureProviderInterface; + + public function addFeature(DriverFeatureInterface $feature): DriverFeatureProviderInterface; + + /** + * Get feature + * + * todo: narrow to DriverFeatureInterface|false once PHP 8.2 is the minimum version + */ + public function getFeature(string $name): DriverFeatureInterface|bool; +} diff --git a/src/Adapter/Driver/Feature/DriverFeatureProviderTrait.php b/src/Adapter/Driver/Feature/DriverFeatureProviderTrait.php new file mode 100644 index 000000000..d3d0b67ca --- /dev/null +++ b/src/Adapter/Driver/Feature/DriverFeatureProviderTrait.php @@ -0,0 +1,51 @@ + + */ + protected array $features = []; + + public function addFeature(DriverFeatureInterface $feature): DriverFeatureProviderInterface + { + if (! $this instanceof DriverInterface) { + throw new RuntimeException(sprintf( + '%s can only be composed into %s', + __TRAIT__, + DriverInterface::class + )); + } + + $feature->setDriver($this); + $this->features[$feature::class] = $feature; + return $this; + } + + public function addFeatures(array $features): DriverFeatureProviderInterface + { + foreach ($features as $feature) { + $this->addFeature($feature); + } + return $this; + } + + public function getFeature(string $name): DriverFeatureInterface|bool + { + return $this->features[$name] ?? false; + } +} diff --git a/src/Adapter/Driver/Oci8/Feature/RowCounter.php b/src/Adapter/Driver/Oci8/Feature/RowCounter.php index 97ba92405..45730af5b 100644 --- a/src/Adapter/Driver/Oci8/Feature/RowCounter.php +++ b/src/Adapter/Driver/Oci8/Feature/RowCounter.php @@ -13,14 +13,6 @@ */ class RowCounter extends AbstractFeature { - /** - * @return string - */ - public function getName() - { - return 'RowCounter'; - } - /** * @return null|int */ diff --git a/src/Adapter/Driver/Oci8/Oci8.php b/src/Adapter/Driver/Oci8/Oci8.php index b36693093..9400e591f 100644 --- a/src/Adapter/Driver/Oci8/Oci8.php +++ b/src/Adapter/Driver/Oci8/Oci8.php @@ -46,7 +46,7 @@ public function __construct( ?Statement $statementPrototype = null, ?Result $resultPrototype = null, array $options = [], - $features = self::FEATURES_DEFAULT + $features = [new Feature\RowCounter()] ) { if (! $connection instanceof Connection) { $connection = new Connection($connection); diff --git a/src/Adapter/Driver/Pdo/AbstractPdo.php b/src/Adapter/Driver/Pdo/AbstractPdo.php index 3fbc9020b..9f65c3b52 100644 --- a/src/Adapter/Driver/Pdo/AbstractPdo.php +++ b/src/Adapter/Driver/Pdo/AbstractPdo.php @@ -6,8 +6,7 @@ use Laminas\Db\Adapter\Driver\ConnectionInterface; use Laminas\Db\Adapter\Driver\DriverAwareInterface; -use Laminas\Db\Adapter\Driver\Feature\AbstractFeature; -use Laminas\Db\Adapter\Driver\Feature\DriverFeatureInterface; +use Laminas\Db\Adapter\Driver\Feature\DriverFeatureProviderInterface; use Laminas\Db\Adapter\Driver\PdoDriverAwareInterface; use Laminas\Db\Adapter\Driver\PdoDriverInterface; use Laminas\Db\Adapter\Driver\ResultInterface; @@ -25,10 +24,8 @@ use function preg_match; use function sprintf; -abstract class AbstractPdo implements PdoDriverInterface, DriverFeatureInterface, ProfilerAwareInterface +abstract class AbstractPdo implements PdoDriverInterface, ProfilerAwareInterface { - public const FEATURES_DEFAULT = 'default'; - /** @internal */ public ?ProfilerInterface $profiler; @@ -36,7 +33,7 @@ public function __construct( protected readonly AbstractPdoConnection|\PDO $connection, protected readonly StatementInterface&PdoDriverAwareInterface $statementPrototype, protected readonly ResultInterface $resultPrototype, - protected array|string $features = self::FEATURES_DEFAULT + array $features = [], ) { if ($this->connection instanceof DriverAwareInterface) { @@ -47,14 +44,8 @@ public function __construct( $this->statementPrototype->setDriver($this); } - if (is_array($features)) { - foreach ($features as $name => $feature) { - $this->addFeature($name, $feature); - } - } elseif ($features instanceof AbstractFeature) { - $this->addFeature($features->getName(), $features); - } elseif ($features === self::FEATURES_DEFAULT) { - $this->setupDefaultFeatures(); + if ($features !== [] && $this instanceof DriverFeatureProviderInterface) { + $this->addFeatures($features); } } @@ -96,60 +87,6 @@ public function registerResultPrototype(ResultInterface $resultPrototype) $this->resultPrototype = $resultPrototype; } - /** - * Add feature - * - * todo: needs improvement - * - * @param string $name - * @param AbstractFeature $feature - * @return $this Provides a fluent interface - */ - public function addFeature($name, $feature) - { - if ($feature instanceof AbstractFeature) { - $name = $feature->getName(); // overwrite the name, just in case - $feature->setDriver($this); - } - $this->features[$name] = $feature; - return $this; - } - - /** - * Setup the default features for Pdo - * - * @return $this Provides a fluent interface - */ - // public function setupDefaultFeatures() - // { - // $driverName = $this->connection->getDriverName(); - // if ($driverName === 'sqlite') { - // $this->addFeature(null, new Feature\SqliteRowCounter()); - // return $this; - // } - - // if ($driverName === 'oci') { - // $this->addFeature(null, new Feature\OracleRowCounter()); - // return $this; - // } - - // return $this; - // } - - /** - * Get feature - * - * @param string $name - * @return AbstractFeature|false - */ - public function getFeature($name) - { - if (isset($this->features[$name])) { - return $this->features[$name]; - } - return false; - } - /** * Get database platform name *