diff --git a/.github/workflows/build.yml b/.github/workflows/phpunit.yml similarity index 83% rename from .github/workflows/build.yml rename to .github/workflows/phpunit.yml index d6c1a48..a4516a5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/phpunit.yml @@ -1,4 +1,4 @@ -name: build +name: PHPUnit on: [push, pull_request] @@ -19,14 +19,13 @@ jobs: strategy: fail-fast: true matrix: - php: [ 8.0, 8.1, 8.2, 8.3 ] - stability: [ prefer-lowest, prefer-stable ] + php: [ 8.0, 8.1, 8.2, 8.3, 8.4 ] - name: PHP ${{ matrix.php }} - ${{ matrix.stability }} + name: PHP ${{ matrix.php }} steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -40,7 +39,7 @@ jobs: - name: Cache Composer packages id: composer-cache - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: vendor key: ${{ runner.os }}-${{ matrix.php }}-${{ hashFiles('**/composer.lock') }} @@ -58,8 +57,8 @@ jobs: runs-on: ubuntu-latest needs: [ test ] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: 'lts/*' diff --git a/README.md b/README.md index c0320b7..45b99b7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Doctrine DBAL Adapter for Casbin -[![Build Status](https://github.com/php-casbin/dbal-adapter/actions/workflows/build.yml/badge.svg)](https://github.com/php-casbin/dbal-adapter/actions/workflows/build.yml) +[![PHPUnit](https://github.com/php-casbin/dbal-adapter/actions/workflows/phpunit.yml/badge.svg)](https://github.com/php-casbin/dbal-adapter/actions/workflows/phpunit.yml) [![Coverage Status](https://coveralls.io/repos/github/php-casbin/dbal-adapter/badge.svg)](https://coveralls.io/github/php-casbin/dbal-adapter) [![Latest Stable Version](https://poser.pugx.org/casbin/dbal-adapter/v/stable)](https://packagist.org/packages/casbin/dbal-adapter) [![Total Downloads](https://poser.pugx.org/casbin/dbal-adapter/downloads)](https://packagist.org/packages/casbin/dbal-adapter) diff --git a/composer.json b/composer.json index 4927c19..36bf3d0 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "authors": [ { "name": "TechLee", - "email": "techlee@qq.com" + "email": "leeqvip@gmail.com" } ], "license": "Apache-2.0", diff --git a/phpunit.xml b/phpunit.xml index e34bc8d..5e3785d 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,28 +1,30 @@ - - - - - ./tests/ - - - - - ./src - - - - - - - - - - \ No newline at end of file + + + + + ./src + + + + + + + + + ./tests/ + + + + + + + diff --git a/src/Adapter.php b/src/Adapter.php index 17ffcf3..491ef5b 100644 --- a/src/Adapter.php +++ b/src/Adapter.php @@ -6,16 +6,12 @@ use Casbin\Persist\AdapterHelper; use Casbin\Model\Model; -use Casbin\Persist\BatchAdapter; -use Casbin\Persist\FilteredAdapter; -use Casbin\Persist\UpdatableAdapter; +use Casbin\Persist\{BatchAdapter, FilteredAdapter, UpdatableAdapter}; use Closure; use Doctrine\DBAL\Configuration; -use Doctrine\DBAL\DBALException; -use Doctrine\DBAL\Driver\ResultStatement; +use Doctrine\DBAL\{DBALException, Exception}; use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Exception; use Doctrine\DBAL\Query\Expression\CompositeExpression; use Doctrine\DBAL\Schema\Schema; use Throwable; @@ -23,7 +19,7 @@ /** * DBAL Adapter. * - * @author techlee@qq.com + * @author leeqvip@gmail.com */ class Adapter implements FilteredAdapter, BatchAdapter, UpdatableAdapter { @@ -34,24 +30,24 @@ class Adapter implements FilteredAdapter, BatchAdapter, UpdatableAdapter * * @var Connection */ - protected $connection; + protected Connection $connection; /** * Casbin policies table name. * * @var string */ - public $policyTableName = 'casbin_rule'; + public string $policyTableName = 'casbin_rule'; /** * @var bool */ - private $filtered = false; + private bool $filtered = false; /** * @var string[] */ - protected $columns = ['p_type', 'v0', 'v1', 'v2', 'v3', 'v4', 'v5']; + protected array $columns = ['p_type', 'v0', 'v1', 'v2', 'v3', 'v4', 'v5']; /** * Adapter constructor. @@ -59,7 +55,7 @@ class Adapter implements FilteredAdapter, BatchAdapter, UpdatableAdapter * @param Connection|array $connection * @throws Exception */ - public function __construct($connection) + public function __construct(Connection|array $connection) { if ($connection instanceof Connection) { $this->connection = $connection; @@ -85,7 +81,7 @@ public function __construct($connection) * @return Adapter * @throws Exception */ - public static function newAdapter($connection): Adapter + public static function newAdapter(Connection|array $connection): Adapter { return new static($connection); } @@ -95,9 +91,9 @@ public static function newAdapter($connection): Adapter * * @return void */ - public function initTable() + public function initTable(): void { - $sm = method_exists($this->connection, "createSchemaManager") ? $sm = $this->connection->createSchemaManager() : $sm = $this->connection->getSchemaManager(); + $sm = $this->connection->createSchemaManager(); if (!$sm->tablesExist([$this->policyTableName])) { $schema = new Schema(); $table = $schema->createTable($this->policyTableName); @@ -118,10 +114,10 @@ public function initTable() * @param $pType * @param array $rule * - * @return ResultStatement|int + * @return int|string * @throws Exception */ - public function savePolicyLine($pType, array $rule) + public function savePolicyLine(string $pType, array $rule): int|string { $queryBuilder = $this->connection->createQueryBuilder(); $queryBuilder @@ -135,7 +131,7 @@ public function savePolicyLine($pType, array $rule) $queryBuilder->setValue('v' . strval($key), '?')->setParameter($key + 1, $value); } - return $this->executeQuery($queryBuilder); + return $queryBuilder->executeStatement(); } /** @@ -147,9 +143,9 @@ public function savePolicyLine($pType, array $rule) public function loadPolicy(Model $model): void { $queryBuilder = $this->connection->createQueryBuilder(); - $stmt = $this->executeQuery($queryBuilder->select('p_type', 'v0', 'v1', 'v2', 'v3', 'v4', 'v5')->from($this->policyTableName)); + $stmt = $queryBuilder->select('p_type', 'v0', 'v1', 'v2', 'v3', 'v4', 'v5')->from($this->policyTableName)->executeQuery(); - while ($row = $this->fetch($stmt)) { + while ($row = $stmt->fetchAssociative()) { $this->loadPolicyArray($this->filterRule($row), $model); } } @@ -179,11 +175,9 @@ public function loadFilteredPolicy(Model $model, $filter): void throw new \Exception('invalid filter type'); } - $stmt = $this->executeQuery($queryBuilder->from($this->policyTableName)); - while ($row = $this->fetch($stmt)) { - $line = implode(', ', array_filter($row, function ($val) { - return '' != $val && !is_null($val); - })); + $stmt = $queryBuilder->from($this->policyTableName)->executeQuery(); + while ($row = $stmt->fetchAssociative()) { + $line = implode(', ', array_filter($row, static fn ($val): bool => '' != $val && !is_null($val))); $this->loadPolicyLine(trim($line), $model); } @@ -247,9 +241,7 @@ public function addPolicies(string $sec, string $ptype, array $rules): void $sets[] = array_pad([], $columnsCount, '?'); } - $valuesStr = implode(', ', array_map(function ($set) { - return '(' . implode(', ', $set) . ')'; - }, $sets)); + $valuesStr = implode(', ', array_map(static fn ($set): string => '(' . implode(', ', $set) . ')', $sets)); $sql = 'INSERT INTO ' . $table . ' (' . implode(', ', $columns) . ')' . ' VALUES' . $valuesStr; @@ -274,7 +266,7 @@ private function _removePolicy(Connection $conn, string $sec, string $ptype, arr $queryBuilder->andWhere('v' . strval($key) . ' = ?')->setParameter($key + 1, $value); } - $this->executeQuery($queryBuilder->delete($this->policyTableName)); + $queryBuilder->delete($this->policyTableName)->executeStatement(); } /** @@ -331,13 +323,13 @@ public function _removeFilteredPolicy(string $sec, string $ptype, int $fieldInde $fieldIndex++; } - $stmt = $this->executeQuery($queryBuilder->select(...$this->columns)->from($this->policyTableName)); + $stmt = $queryBuilder->select(...$this->columns)->from($this->policyTableName)->executeQuery(); - while ($row = $this->fetch($stmt)) { + while ($row = $stmt->fetchAssociative()) { $removedRules[] = $this->filterRule($row); } - $this->executeQuery($queryBuilder->delete($this->policyTableName)); + $queryBuilder->delete($this->policyTableName)->executeStatement(); }); return $removedRules; @@ -381,9 +373,7 @@ public function updatePolicy(string $sec, string $ptype, array $oldRule, array $ $queryBuilder->set('v' . strval($key), ':' . $placeholder)->setParameter($placeholder, $value); } - $queryBuilder->update($this->policyTableName); - - $this->executeQuery($queryBuilder); + $queryBuilder->update($this->policyTableName)->executeStatement(); } /** @@ -484,33 +474,4 @@ public function getColumns(): array { return $this->columns; } - - /** - * @param \Doctrine\DBAL\Result|\Doctrine\DBAL\Driver\PDOStatement $stmt - * - * @return mixed - * @throws Exception - */ - private function fetch($stmt) - { - if (method_exists($stmt, 'fetchAssociative')) { - return $stmt->fetchAssociative(); - } - - return $stmt->fetch(); - } - - /** - * Calls correct query execution method depending on Doctrine version and - * returns the result. - * - * @param \Doctrine\DBAL\Query\QueryBuilder $query - * - * @return mixed - */ - private function executeQuery($query) - { - return method_exists($query, "executeQuery") ? $query->executeQuery() : $query->execute(); - } - } diff --git a/src/Filter.php b/src/Filter.php index 7b5930e..851607f 100644 --- a/src/Filter.php +++ b/src/Filter.php @@ -7,19 +7,19 @@ /** * Class Filter * - * @author techlee@qq.com + * @author leeqvip@gmail.com */ class Filter { /** * @var string */ - private $predicates = ""; + private string $predicates = ''; /** * @var array|array */ - private $params = ""; + private array $params = []; /** * Filter constructor. diff --git a/tests/AdapterFeatureTest.php b/tests/AdapterFeatureTest.php index 8268f4a..29789fc 100644 --- a/tests/AdapterFeatureTest.php +++ b/tests/AdapterFeatureTest.php @@ -4,7 +4,6 @@ use CasbinAdapter\DBAL\Adapter as DatabaseAdapter; use CasbinAdapter\DBAL\Filter; -use Doctrine\DBAL\Query\Expression\CompositeExpression; use Doctrine\DBAL\Query\QueryBuilder; class AdapterFeatureTest extends TestCase diff --git a/tests/TestCase.php b/tests/TestCase.php index eeb21b7..e2c7741 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -33,7 +33,7 @@ protected function initDb(DatabaseAdapter $adapter) $conn = $adapter->getConnection(); $queryBuilder = $conn->createQueryBuilder(); $query = $queryBuilder->delete($tableName)->where('1 = 1'); - method_exists($query, "executeQuery") ? $query->executeQuery() : $query->execute(); + $query->executeStatement(); $data = [ ['p_type' => 'p', 'v0' => 'alice', 'v1' => 'data1', 'v2' => 'read'], @@ -44,7 +44,7 @@ protected function initDb(DatabaseAdapter $adapter) ]; foreach ($data as $row) { $query = $queryBuilder->insert($tableName)->values(array_combine(array_keys($row), array_fill(0, count($row), '?')))->setParameters(array_values($row)); - method_exists($query, "executeQuery") ? $query->executeQuery() : $query->execute(); + $query->executeStatement(); } }