frangeris/simple-validation

简单、快速、美观的方式为表单或任何你能想到的东西进行验证

v0.1.1 2015-03-13 21:32 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:04:35 UTC


README

在PHP中,为表单进行验证的方法有很多种,每个框架(Laravel 4+、Symfony 2+、CodeIgniter、FuelPHP、CakePHP等)都有自己的验证实现,这是正常的,我们期望它们提供这种功能,但是,有时候这些验证很复杂,有时候我们只想验证一个简单的HTML表单并获取可能的失败,就这么简单,你可以在模型中插入你的规则,这是另一种方式,带有超级能力...

安装

最简单的方法是使用 Composer 并将其添加到 composer.json 的需求部分。

{
  "require": {
    "frangeris/simple-validation": "dev-master"
  }
}

它遵循PSR-0规范,因此你也可以使用自己的自定义自动加载器。

用法

通常,每个表单都可以有 规则,什么是规则?规则就是你想验证的内容,就是这样,以下是支持规则的列表

  • regex(用于正则表达式目的)
  • min(验证是否大于)
  • max(验证不超出一个数字)
  • required(验证值不是null或空)
  • filter(php原生过滤器 :D)
  • uploaded(验证文件是否已上传)
  • file_max(使用MB进行比较,验证文件的最大大小)
  • allow_format(指定允许上传文件的格式)
  • not_equal(验证值不等于指定的模式)

让我们开始吧

以下是一个自定义验证结构的示例,在这种情况下,我想验证一个保存18岁以上用户的表单,当然还有有效的姓氏、名字和电子邮件。

<form method="post" action="#">	
	<input type="text" name="email">
	<input type="text" name="f_name">
	<input type="text" name="l_name">
	<input type="text" name="age">
</form>  

规则文件

<?php

/*
|--------------------------------------------------------------------------
| Secure validations
|--------------------------------------------------------------------------
| Here you need to define the rules of each form that you want to validate, 
| each index represent a form <form_name>, followed by an associative 
| array with the fields that contains; each field will have [requirements] 
| and [messages], each [requirements] must have a message to respond (in 
| case of failure). Putting the prefix on + <requirement> following 
| cammell case convention for the event
|
*/

return array(
	'frm_user_add' => array(
		'email' => array(
			'requirements' => array('required' => true, 'filter' => FILTER_VALIDATE_EMAIL),
			'messages' => array(				
				'on_required' => 'Insert the email or username for begin',
				'on_filter' => 'Invalid email, please try another'
			)			
		),

		'f_name' => array(
			'requirements' => array('required' => true, 'min' => 3, 'max' => 30, 'regex' => '/^[a-z ]+$/i'),
			'messages' => array(
				'on_required' => 'Last name is required for create a user',
				'on_min' => 'Last name is very short',
				'on_max' => 'Last name is too long',
				'on_regex' => 'Invalid user name, please try again'
			)
		),		

		'l_name' => array(
			'requirements' => array('required' => true, 'min' => 3, 'max' => 30 'regex' => '/^[a-z ]+$/i'),
			'messages' => array(
				'on_required' => 'Last name is required for create a user',
				'on_min' => 'Last name is very short',
				'on_max' => 'Last name is too long',
				'on_regex' => 'Invalid user name, please try again'
			)
		),

		'age' => array(
			'requirements' => array('required' => true, 'min' => 18),
			'messages' => array(
				'on_required' => 'Last name is required for create a user',
				'on_min' => 'Last name is very short',
				'on_max' => 'Last name is too long'
			)
		),		
	),
);

如你所见,frm_user_add 是表单的名称,后面跟着一个关联数组,用于字段要求和消息。

email 是表单 frm_build_add 中的一个字段,我们希望这个字段存在,并且必须使用 PHP中的过滤器 进行验证,根据每个错误,消息中的字符串将被返回...太棒了,对吧? :D

f_name 稍微复杂一些,在这种情况下,我们希望该字段是必填的,大于3且小于30,并且需要匹配正则表达式 /^[a-z ]+$/i...

对于 l_namef_name 具有相同的规则...

最后一个 age,我只想让它存在,最小值必须是18,就是这样... :)

在PHP端,只需调用验证器类并传递请求中的字段和表单的名称

此示例使用 phalcon框架 进行POST请求

<?php

use Simple\Validation\Validator;

class ApplicationController extends \Phalcon\Mvc\Controller
{
	public function addAction()
	{
		if($this->request->isPost())
		{
			$request = $this->request->getPost();

			// Here make the trick for pass the rules
    		$validator = Validator::getInstance(require_once(URL_TO_YOUR_FILE_WITH_RULES));

    		// Begin the validation (<form_name>, <array_with_values>)
			if($validator->isValid($request, $request))
			{
				echo 'valid';
				// Do your stuff
				
			} else
				echo 'Error: '.$validator->getLastError(true)); // This will give you the last error
			
			// If you wanna all the errors with messages just call
			print_r($validator->getErrors());
		}
	}	
}

所需函数可以放在另一个地方,只需记住,isValid 方法需要这个数组来验证...

PS:如果你使用的是phalcon,不要这样做,在服务中创建一个DI,并作为di使用,就像这样

// Set up the validator service
$di->set('validator', function() use ($config)
{
    $validations = require_once($config->security->validations);
    return Simple\Validation\Validator::getInstance($validations);
});