rnr1721/le7-entify

Entify 是 le7 PHP MVC 框架或任何 PHP 项目的实体框架

1.1.5 2023-05-16 19:32 UTC

This package is auto-updated.

Last update: 2024-09-16 22:37:37 UTC


README

Entify 是 le7 PHP MVC 框架或任何 PHP 项目的实体框架

本项目是一个通用的验证器/转换器。使用它,可以验证/规范化数组。例如,可以使用此项目使用以下规则

  • 验证/渲染表单(以及上传的文件)
  • 验证/渲染数组
  • 验证/渲染数据库中的数据

要求

  • PHP 8.1
  • Composer

安装

composer require rnr1721/le7-entify

测试

composer test

使用

  1. 在类或数组中创建规则。
  2. 使用数据创建一个 DataProvider。
  3. 获取实体
  4. 获取验证后的实体
use Core\Entify\RulesLoaderClass;
use Core\Entify\Entification;

// Loader for rules
$loader = new RulesLoaderClass();

// Get Entify factory. We can create $loader and $entifications in container
$entification = new Entification($loader);

// Make our rules. In this example is array,
// But more comfortable use classes
$rulesArray = [
		'name' => [
			'label' => 'User login',
			'validate' => 'required|minlength:3|maxlength:20'
	],
		'email' => [
			'label' => 'Email',
			'validate' => 'required|email'
	],
		'message' => [
			'label' => 'Message',
			'validate' => 'minlength:30|maxlength:200'
			'escape' => true
	],
		'age' => [
			'label' => 'Message',
			'convert' => 'int',
			'validate' => 'min:18|max:90'
	],
];

// Now get our data
$data = [
	'name' => 'John',
	'email' => 'johndoe@example.com',
	'message' => 'my message text',
	'age' => '33'
];

$provider = $entification->getArrayProvider($data, $rulesArray);

// Get entity
$entity = $provider->getEntity();

// our validated and normalized array
print_r($entity->export())

// Get validation errors if present
$entity->getErrors();

但这只是基本用法。您可以使用 Entify 做更多伟大的事情。

类中的规则

由于某些原因,您可能需要将规则存储在类中,而不是数组中。这对于存储在代码的不同位置多次使用很有用。例如,我们可以在命名空间 Entities 中创建一个文件。

<?php

declare(strict_types=1);

namespace Entities;

use Core\Entify\Interfaces\ModelInterface;

class Contactform implements ModelInterface
{

    public function getRules(): array
    {
        return [
                        'name' => [
                                'label' => 'User login',
                                'validate' => 'required|minlength:3|maxlength:20'
                ],
                        'email' => [
                                'label' => 'Email',
                                'validate' => 'required|email'
                ],
                        'message' => [
                                'label' => 'Message',
                                'validate' => 'minlength:30|maxlength:200'
                                'escape' => true
                ],
                        'age' => [
                                'label' => 'Message',
                                'convert' => 'int',
                                'validate' => 'min:18|max:90'
                ],
        ];
    }

}

这就是全部!现在我们可以使用我们的规则。这个例子类似于上一个例子,但在这个例子中,我们使用的是规则模型,而不是数组。

use Core\Entify\RulesLoaderClass;
use Core\Entify\Entification;

// Loader for rules. Warning! Now we set namespace with entities rules!
$loader = new RulesLoaderClass('\\Entities\\');

// Get Entify factory
$entification = new Entification($loader);

// Now get our data
$data = [
	'name' => 'John',
	'email' => 'johndoe@example.com',
	'message' => 'my message text',
	'age' => '33'
];

// Contatform - is class with rules. Now we can set it here
// Starts with lowercase
$provider = $entification->getArrayProvider($data, 'contactform');

// Get entity
$entity = $provider->getEntity();

// our validated and normalized array
print_r($entity->export())

// Get validation errors if present
$entity->getErrors();

DataProviders

默认情况下,您可以在 Entification 类中使用 Array 和 Form 提供者,但您可以编写自己的 DataProviders(DataProviderInterface)或 Renderers(EntityRendererInterface)。

规则

您可以为验证和规范化实体使用多个规则。规则按顺序运行,每个字段的规则列表是一个队列。例如,在这个例子中,'filter' 过滤器将在 'convert' 之后运行。

$rules = [
    'age' => [
        'label' => 'User age',
        'convert' => int,
        'filter' => function(mixed $data){
                        return $data + 1;
                    }
    ]
];

可用的过滤器

validate

这是一个验证过滤器。它使用 le7-validator 进行验证,您可以在以下链接中了解更多关于验证规则的信息: https://github.com/rnr1721/le7-validator

必填字段。可以是:字符串

  • required:字段必须填写
  • min:{n}:字段值必须至少为 {n}
  • max:{n}:字段值必须不超过 {n}
  • minlength:{n}:字符串字段值的长度必须至少为 {n}
  • maxlength:{n}:字符串字段值的长度必须不超过 {n}
  • email:字段值必须是一个有效的电子邮件地址
  • notempty:字段值不能为空或只包含空格
  • numeric:验证是否仅包含数字数据
  • email_dns:验证电子邮件地址的格式,并检查电子邮件地址的域名部分是否有有效的 DNS 记录
  • url:验证 URL
  • url_active:如果 URL 地址有效且存在
  • date:验证值是日期
  • date_format:{n}:验证日期格式:例如:date_format:Y-m-d
  • date_before:{n}:验证日期在某个日期之前。例如:date_before:2022-05-15
  • date_after:{n}:验证日期在某个日期之后。例如:date_after:2022-05-15
  • boolean:验证布尔值

例如

$rules = [
    'username' => [
        'label' => 'Username',
        // Required field, minimum length is 3, maximum 20 symbols
        'validate' => 'required|minlength:3|maxlength:20'
    ]
];

label

这是字段的标签(可读名称)。您可以使用 gettext 函数,如 _('我的伟大标签'),进行国际化。它用于验证器,当它生成表单错误消息时,或者您可以在将来渲染实体时使用它。

必填字段。可以是:字符串

例如

$rules = [
    'email' => [
        'label' => 'User Email',
        'validate' => 'required|email'
    ]
];

check

此过滤器用于自定义可调用的检查字段。如果成功,可调用返回 true,或者返回错误字符串。

非必填字段。可以是:false 或可调用

$rules = [
    'username' => [
        'label' => 'User login',
        'validate' => '',
        'check' => function(mixed $data){
                        if ($data === 'john') {
                            return true;
                        }
                        return 'Incorrect name';
                    }
    ]
];

default

如果字段在实体中不存在,则将其添加,并在您获取实体时,字段将以此默认值存在

非必填字段 可以是:混合类型

convert

将值转换为某些数据类型

非必填字段 可以是:字符串(值:'int'、'string'、'bool'、'float'、'double'、'bool')

例如

$rules = [
    'age' => [
        'label' => 'User age',
        'validate' => 'min:12|max:99',
        'convert' => 'int'
    ]
];

隐藏

在实体中隐藏值。您将得到不带值的实体

非必填字段可以是:true 或 false

例如

$rules = [
    'password' => [
        'label' => 'User password',
        'validate' => '',
        'hide' => true
    ]
];

转义

值将通过 htmlspecialchars() 函数进行转义

非必填字段可以是:true 或 false

例如

$rules = [
    'description' => [
        'label' => 'Description',
        'validate' => 'min:30|max:500',
        'escape' => true
    ]
];

允许

此过滤器将使用 strip_tags PHP 函数处理值

非必填字段可以是:null 或字符串 - strip_tags 函数的第二个参数

例如

$rules = [
    'description' => [
        'label' => 'Description',
        'validate' => 'min:30|max:500',
        'allowed' => '<p><a><br>'
    ]
];

过滤器

此过滤器允许使用您的自定义可调用函数处理值。可调用函数需要返回混合值

非必填字段可以是:可调用

例如

$rules = [
    'age' => [
        'label' => 'User age',
        'convert' => int,
        'filter' => function(mixed $data){
                        return $data + 1;
                    }
    ]
];

字符串、整数、浮点数、null、数组、对象、资源、可调用

如果值不是某些类型,此过滤器将抛出异常

非必填字段可以是:null 或 true

元数据

任何用于您目的的元信息

非必填字段 可以是:混合类型

实体

如果您从数组创建实体、表单或编写自己的 DataProvider,您需要知道 DefaultHandler 需要这些类型的数组

$data = [
    'login' => 'myuser',
    'password' => '7777777'
];
$data = [
    [
        'login' => 'myuser',
        'password' => '7777777'
    ]
];

如果您使用此类型数组

$data = [
    'myuser',
    '7777777'
];

您将得到错误。

获取实体时使用选项

在 Default Handler 中,当数据从 DataProvider 到实体的数据数组到来时的步骤:(这些操作在 EntityHandlerDefault 的 handle() 方法中运行)

  1. 检查数组格式
  2. 标准化(检查实体中是否包含规则中所有字段,或对于冗余字段)
  3. 验证(为所有实体运行验证器)
  4. 过滤器(运行过滤器)
  5. 移除隐藏 ('hide') 字段

在这些示例中,您可以了解如何使用一些选项

use Core\Entify\RulesLoaderClass;
use Core\Entify\Entification;

// Loader for rules. Warning! Now we set namespace with entities rules!
$loader = new RulesLoaderClass('\\Entities\\');

// Get Entify factory
$entification = new Entification($loader);

// Now get our data
$data = [
	'name' => 'John',
	'email' => 'johndoe@example.com',
	'message' => 'my message text',
	'age' => '33'
];

// Contatform - is class with rules. Now we can set it here
// Starts with lowercase
$provider = $entification->getArrayProvider($data, 'contactform');

// If this, the fields that not present in rules, will be deleted
// Default is true;
$provider->getOptions()->setDeleteRedundant(true);

// Skip validation (only skip validator)
// Default is false
$provider->getOptions()->setSkipValidation(true);

// If validator got errors, any filters will not be applied
// Default false
$provider->getOptions()->setReturnIfValidationErrors(true);

// If some field of array not present in rules, return before filters and validation
// Default false
$provider->getOptions()->setReturnIfNotExistsErrors(true);

// Get entity
$entity = $provider->getEntity();

// our validated and normalized array
print_r($entity->export())

// Get validation errors if present
$entity->getErrors();