rnr1721 / le7-entify
Entify 是 le7 PHP MVC 框架或任何 PHP 项目的实体框架
Requires
- php: >=8.1
- psr/http-message: ^2.0
- rnr1721/le7-validator: ^1.0
Requires (Dev)
- phpunit/phpunit: ^10.0
- vimeo/psalm: ^5.7
README
Entify 是 le7 PHP MVC 框架或任何 PHP 项目的实体框架
本项目是一个通用的验证器/转换器。使用它,可以验证/规范化数组。例如,可以使用此项目使用以下规则
- 验证/渲染表单(以及上传的文件)
- 验证/渲染数组
- 验证/渲染数据库中的数据
要求
- PHP 8.1
- Composer
安装
composer require rnr1721/le7-entify
测试
composer test
使用
- 在类或数组中创建规则。
- 使用数据创建一个 DataProvider。
- 获取实体
- 获取验证后的实体
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() 方法中运行)
- 检查数组格式
- 标准化(检查实体中是否包含规则中所有字段,或对于冗余字段)
- 验证(为所有实体运行验证器)
- 过滤器(运行过滤器)
- 移除隐藏 ('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();