sunnyphp/rbac-db

Yii RBAC 数据库存储

dev-master 2024-01-04 11:08 UTC

This package is auto-updated.

Last update: 2024-09-04 12:29:50 UTC


README

Yii RBAC 数据库


本包为 Yii 数据库 提供了 Yii RBAC 的存储功能。

Latest Stable Version Total Downloads Build status Scrutinizer Code Quality Code Coverage Mutation testing badge static analysis

要求

安装

可以使用 composer 安装此包

composer require yiisoft/rbac-db

通用用法

配置数据库连接

配置取决于所选的驱动程序。以下是一个 PostgreSQL 的示例

use Yiisoft\Cache\ArrayCache; // Requires https://github.com/yiisoft/cache
use Yiisoft\Db\Cache\SchemaCache;
use Yiisoft\Db\Pgsql\Connection;
use Yiisoft\Db\Pgsql\Driver;

$pdoDriver = new Driver('pgsql:host=127.0.0.1;dbname=yiitest;port=5432', 'user', 'password');
$pdoDriver->charset('UTF8');
$connection = Connection(
    $pdoDriver, 
    new SchemaCache(
        new ArrayCache(), // Any other PSR-16 compatible cache can be used.
    )
);

更多详细示例可以在 Yii 数据库文档 中找到。

处理架构

为了减少依赖项,本包不提供任何用于处理架构的 CLI。有多种选择可供选择

  • 使用迁移工具,如 Yii DB Migration。迁移作为纯 SQL 代码在 sql/migrations 文件夹中导出。
  • 如果没有迁移,可以使用 DbSchemaManager 类。包含该类的 CLI 命令示例可以在 此处 找到。
  • 使用在安装 rbac-db 包时的实际纯 SQL(位于 sql 文件夹的根目录)。

纯 SQL 文件的结构

  • pgsql-up.sql - 对 PostgreSQL 驱动程序应用更改。
  • pgsql-down.sql - 对 PostgreSQL 驱动程序撤销更改。

纯 SQL 假设使用所有 3 个表的默认名称(使用 yii_rbac_ 前缀)

  • yii_rbac_item.
  • yii_rbac_assignment.
  • yii_rbac_item_child.

DbSchemaManager 允许自定义表名

use Yiisoft\Db\Connection\ConnectionInterface;
use Yiisoft\Rbac\Db\DbSchemaManager;

/** @var ConnectionInterface $database */
$schemaManager = new DbSchemaManager(
    database: $database,
    itemsTable: 'custom_items',
    assignmentsTable: 'custom_assignments',
    itemsChildrenTable: 'custom_items_children',
);
$schemaManager->ensureTables();
$schemaManager->ensureNoTables(); // Note: All existing data will be erased.

使用存储

存储不应直接使用。相反,应使用它们与 Yii RBAC 包中的 Manager 一起使用

use Yiisoft\Db\Connection\ConnectionInterface;
use Yiisoft\Rbac\Db\AssignmentsStorage;
use Yiisoft\Rbac\Db\ItemsStorage;
use Yiisoft\Rbac\Db\TransactionalManagerDecorator;
use Yiisoft\Rbac\Manager;
use Yiisoft\Rbac\Permission;
use Yiisoft\Rbac\RuleFactoryInterface;

/** @var ConnectionInterface $database */
$itemsStorage = new ItemsStorage($database);
$assignmentsStorage = new AssignmentsStorage($database);
/** @var RuleFactoryInterface $rulesContainer */
$manager = new TransactionalManagerDecorator(
    new Manager(
        itemsStorage: $itemsStorage, 
        assignmentsStorage: $assignmentsStorage,
        // Requires https://github.com/yiisoft/rbac-rules-container or other compatible factory.
        ruleFactory: $rulesContainer,
    ),
);
$manager->addPermission(new Permission('posts.create'));

注意将管理器用装饰器包装 - 这会额外提供数据库事务以确保数据完整性。

注意,不需要使用两个 DB 存储空间。组合不同的实现是可能的。一个相当常见的用例是通过 PHP 文件 管理项,同时将分配存储在数据库中。

更多示例可以在 Yii RBAC 文档中找到。

测试

单元测试

本包使用 PHPUnit 进行测试。要运行测试

./vendor/bin/phpunit

突变测试

本包测试使用 Infection 突变框架进行检查。要运行它

./vendor/bin/infection

静态分析

使用 Psalm 对代码进行静态分析。要运行静态分析

./vendor/bin/psalm