fastbolt/sonata-admin-protected-fields

为sonata admin提供保护字段简单功能

v0.1.1 2022-08-24 10:09 UTC

This package is auto-updated.

Last update: 2024-09-24 14:57:15 UTC


README

Composer version

Code Climate maintainability Test Coverage

Type Coverage Psalm Level

GitHub

sonata admin的字段和实体保护

这个库旨在提供一个简单的方法来保护在sonata admin中编辑字段,同时仍然在表单中显示。

使用这个库,某些实体字段可能被固定,例如来自ERP或其他系统,而其他字段可能仍然可以被用户编辑。此外,在GUI中创建的项目可能仍然可编辑,包括所有在其他实例中不可编辑的字段。

此外,可以对这些实体进行相同的检查,以在每个项目的基础上保护实体不被sonata admin GUI删除。

该系统依赖于Fastbolt\SonataAdminProtectedFields\Protection\Checker\Checker接口,该接口可以访问所有实体属性。

对于自定义实现,请参阅实现自定义检查器部分。

先决条件

由于使用PHP属性,我们至少需要PHP 8.0或更高版本。

目前,该捆绑包已在PHP 8.0、8.1和8.2以及sonata admin bundle版本4.9上进行测试。

安装

可以通过composer安装此库

composer require fastbolt/sonata-admin-protected-fields

配置

如果未自动配置,则需要在项目的bundles.php文件中启用此捆绑包

<?php

return [
    Fastbolt\SonataAdminProtectedFields\SonataAdminProtectedFieldsBundle::class => ['all' => true],
];

使用

字段保护

要启用在sonata admin中编辑实体时的动态字段保护,只需将相应的属性添加到实体字段的属性中即可

<?php

#[ORM\Column(type: 'string', length: 255)]
#[SonataAdminProtectedFields\WriteProtected]
private string $name = '';

默认属性保护使用Fastbolt\SonataAdminProtectedFields\Protection\Checker\PropertyProtectionChecker服务执行,该服务通过捆绑包配置自动注册。

它期望您的实体实现一个返回布尔值的isProtected()方法

public function isProtected(): bool
{
    return $this->isProtected;
}

删除保护

要启用动态删除保护,只需将相应的属性添加到实体类的头部即可

<?php

#[ORM\Entity(repositoryClass: MaterialRepository::class)]
#[SonataAdminProtectedFields\DeleteProtected]
class Material

保护检查使用与字段保护部分中概述的相同机制。

实现自定义检查器

自定义检查器需要实现简单的Fastbolt\SonataAdminProtectedFields\Protection\Checker\Checker接口

<?php

use Fastbolt\SonataAdminProtectedFields\Protection\Checker\Checker;

class MyChecker implements Checker
{
    public function getName(): string
    {
        return 'my_checker';
    }

    public function shouldBeProtected(object $item): bool 
    {
        return true;    
    }
}

所有检查器都需要有DIC标签sonata_admin_protected_fields_checker。有关DIC标签的更多信息,请参阅symfony文档

services:
    App\MyChecker:
        tags:
            - 'sonata_admin_protected_fields.protection_checkers'

要启用自定义检查器,需要将getName方法返回的值设置在属性中

<?php

use Fastbolt\SonataAdminProtectedFields\Mapping\Attributes as SonataAdminProtectedFields;

#[ORM\Entity(repositoryClass: App\Repository\MyEntityRepository::class)]
#[SonataAdminProtectedFields\DeleteProtected(checker: 'my_checker')]
class MyEntity
{
    #[ORM\Column(type: 'string', length: 18)]
    #[SonataAdminProtectedFields\WriteProtected(checker: 'my_checker')]
    private string $myField = '';
}