estasi / form
过滤和验证HTML表单输入数据。
v1.1.0
2020-08-07 08:35 UTC
Requires
- php: ^7.4
- estasi/filter: ^1.0
- estasi/plugin-manager: ^1.0
- estasi/utility: ^1.1
- estasi/validator: ^1.2
- php-ds/php-ds: dev-master
This package is auto-updated.
Last update: 2024-09-09 18:57:21 UTC
README
允许您创建表单字段的链,使用插件:estasi/filter
和 estasi/validator
进行过滤和验证。
安装
使用composer安装
composer require estasi/form
需求
- PHP 7.4或更高版本
- 数据结构:
composer require php-ds/php-ds
Polyfill与estasi/form包一起安装。
用法
如果在类初始化期间设置了相应的验证器(单个、在Estasi\Validator\Chain
中或在Estasi\Validator\Each
中),将自动创建以下字段属性:
- name
- value(如果设置了默认值,则为可选)
- required(如果设置了
\Estasi\Validator\Boolval
验证器,则为可选) - pattern(如果设置了
\Estasi\Validator\Regex
验证器,则为可选) - min(如果设置了
\Estasi\Validator\GreaterThan
验证器,则为可选) - max(如果设置了
\Estasi\Validator\LessThan
验证器,则为可选) - min 和 max(如果设置了
\Estasi\Validator\GreaterThan
和\Estasi\Validator\LessThan
或\Estasi\Validator\Between
验证器,则为可选) - minlength 和 maxlength(如果设置了
\Estasi\Validator\StringLength
验证器,则为可选) - step(如果设置了
\Estasi\Validator\Step
验证器,则为可选)
基本用法
创建表单
<?php declare(strict_types=1); use Estasi\Form\Field; use Estasi\Form\Form; use Estasi\Validator\Boolval; use Estasi\Validator\Chain as ValidatorChain; use Estasi\Validator\Email; use Estasi\Validator\Identical; use Estasi\Validator\Regex; $loginValidator = (new ValidatorChain())->attach(new Boolval(Boolval::DISALLOW_STR_CONTAINS_ONLY_SPACE), ValidatorChain::WITH_BREAK_ON_FAILURE) ->attach(new Regex('[A-Za-z0-9_]{3,10}'), ValidatorChain::WITH_BREAK_ON_FAILURE); $passwordValidator = (new ValidatorChain())->attach(new Boolval(Boolval::DISALLOW_STR_CONTAINS_ONLY_SPACE), ValidatorChain::WITH_BREAK_ON_FAILURE) ->attach(new Regex('((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!?_@#$%^&+-]).{6,15})'), ValidatorChain::WITH_BREAK_ON_FAILURE); $passwordConfirmValidator = $passwordValidator->attach(new Identical('password[confirm]', Identical::STRICT_IDENTITY_VERIFICATION)); $emailValidator = (new ValidatorChain())->attach(new Boolval(Boolval::DISALLOW_STR_CONTAINS_ONLY_SPACE), ValidatorChain::WITH_BREAK_ON_FAILURE) ->attach(new Email(Email::ALLOW_UNICODE), ValidatorChain::WITH_BREAK_ON_FAILURE); $login = new Field('login', Field::WITHOUT_FILTER, $loginValidator, Field::WITH_BREAK_ON_FAILURE, Field::WITHOUT_DEFAULT_VALUE, 'Login', 'Tooltip Login'); $password = new Field('password[first]', Field::WITHOUT_FILTER, $passwordValidator, Field::WITH_BREAK_ON_FAILURE, Field::WITHOUT_DEFAULT_VALUE, 'Password', 'Tooltip Password'); $passwordConfirm = new Field('password[confirm]', Field::WITHOUT_FILTER, $passwordConfirmValidator, Field::WITH_BREAK_ON_FAILURE, Field::WITHOUT_DEFAULT_VALUE, 'Password Confirm', 'Tooltip Password'); $email = new Field('email', Field::WITHOUT_FILTER, $emailValidator, Field::WITH_BREAK_ON_FAILURE, Field::WITHOUT_DEFAULT_VALUE, 'Email', 'Tooltip Email'); $formReg = new Form($login, $password, $passwordConfirm, $email);
用于模板
在模板中使用时,建议将字段数据转换为数组。
如果模板引擎允许,您可以不转换为数组,而是使用字段对象通过对象方法获取所有相同的数据。
<?php declare(strict_types=1); /** @var \Estasi\Form\Form $formReg */ $fields = \Estasi\Form\Utility\Fields::convertToArray($formReg->getFields()); /* $fields = [ 'login' => [ 'name' => 'login', 'label' => 'Login', 'tooltip' => 'Tooltip Login', 'select' => null, 'errors' => [], 'attributes' => [ [ 'name' => 'login', 'required' => true, 'pattern' => '[A-Za-z0-9_]{3,10}', 'value'=> null, ], ], 'required' => true, ], //... ]; */ $fieldsJson = \Estasi\Form\Utility\Fields::convertToJson($formReg->getFields()); /* $fieldsJson = '{ "login": { "name": "login", "label": "Login", "tooltip": "Tooltip Login", "select": null, "errors": [], "attributes": [{"name":"login","required":true,"pattern":"[A-Za-z0-9_]{3,10}","value":null}], "required": true } }'; */
用于检查从HTML表单接收到的数据
<?php declare(strict_types=1); $requestedData = [ 'login' => 'Joe', 'password[first]' => 'passwordJoe25!', 'password[confirm]' => 'passwordJoe25!', 'email' => 'joe@email.com' ]; /** @var \Estasi\Form\Form $formReg */ $formReg->setValues($requestedData); if ($formReg->isValid()) { // We get all filtered and verified data of the same structure // as the data passed for verification $validData = $formReg->getValues(); // or Getting all valid Fields with the corresponding data $validFields = $formReg->getFieldsValid(); }
使用字段数组
它支持处理字段数组,例如 "store_keywords[]"。这些字段的默认值应为 "array" 或 "null"。
<?php declare(strict_types=1); use Estasi\Filter\Callback; use Estasi\Filter\Chain; use Estasi\Filter\Each; use Estasi\Form\Field; use Estasi\Form\Form; use Estasi\Form\Utility\Fields; use Estasi\Validator\Boolval; $defaultValues= [ 'store_keywords[]' => ['keyword 1', 'keyword 2'], ]; $filterEachKeyword = new Each(new Chain(Chain::DEFAULT_PLUGIN_MANAGER, 'trim', 'lowercase')); $filterKeywords = (new Chain())->attach($filterEachKeyword) ->attach(new Callback(fn(array $val): array => array_filter($val, 'boolval'))); $store_keywords = new Field('store_keywords[]', $filterKeywords, new Boolval(), Field::WITH_BREAK_ON_FAILURE, $defaultValues['store_keywords[]'], 'Keywords', 'Tooltip Keywords'); $form = new Form($store_keywords); $fields = Fields::convertToArray($form->getFields()); /* $fields = [ 'store_keywords[]' => [ 'name' => 'store_keywords[]', 'label' => 'Keywords', 'tooltip' => 'Tooltip Keywords', 'select' => null, 'errors' => [], 'attributes' => [ [ 'name' => 'store_keywords[]', 'required' => true, 'value'=> 'keyword 1', ], [ 'name' => 'store_keywords[]', 'required' => true, 'value'=> 'keyword 2', ], ], 'required' => true, ], ]; */
与<select>
一起使用
支持<select>
类型的表单字段。为此,在初始化Field
时,传递带有选择列表的Select
对象。
如果默认值与列表中的某个值匹配,则将 "selected" 属性分配给列表中的值。
<?php declare(strict_types=1); use Estasi\Form\Field; use Estasi\Form\Form; use Estasi\Form\Option; use Estasi\Form\Select; use Estasi\Form\Utility\Fields; // You can prepare the selection list by getting data from the database /** @var \PDO $pdo */ $stm = $pdo->prepare( <<<SQL SELECT `name` `text`, JSON_OBJECT('value', `id`, 'title', `description`) `attributes` FROM `table` ORDER BY `id`; SQL ); $stm->execute(); $optionsList = $stm->fetchAll(PDO::FETCH_CLASS, Option::class); // or create a list manually $optionsList = [ new Option('Foo', ['value' => 1, 'title' => 'Foo it\'s ...']), new Option('Bar', ['value' => 2, 'title' => 'Bar great!']), new Option('Baz', ['value' => 3]), ]; $select = new Select(...$optionsList); $type = new Field( 'type', Field::WITHOUT_FILTER, Field::WITHOUT_VALIDATOR, Field::WITH_BREAK_ON_FAILURE, Field::WITHOUT_DEFAULT_VALUE, 'Type', 'Tooltip Type', $select ); $form = new Form($type); $fields = Fields::convertToArray($form->getFields()); /* $fields = [ 'type' => [ 'name' => 'type', 'label' => 'Type', 'tooltip' => 'Tooltip Type', 'select' => [ [ 'text' => 'Foo', 'attributes' => ['title' => 'Foo it\'s ...', 'value' => 1] ], [ 'text' => 'Bar', 'attributes' => ['title' => 'Bar great!', 'value' => 2] ], [ 'text' => 'Baz', 'attributes' => ['value' => 3] ], ], 'errors' => [], 'attributes' => [ [ 'name' => 'type', 'value'=> null, ], ], ], ]; */
许可证
本包所有内容均受BSD-3-Clause许可证许可。