bigelephant/input-validator

此包最新版本(dev-master)没有可用的许可信息。

dev-master 2013-02-11 17:45 UTC

This package is auto-updated.

Last update: 2024-09-22 04:33:49 UTC


README

此包旨在抽象化您的控制器中的输入验证,并减少重复代码。

Build Status

安装

将以下内容添加到您的composer.json文件的"require"部分

	"bigelephant/input-validator": "dev-master"

编辑app/config/app.php文件并...

  • 将以下内容添加到您的providers数组中
	'BigElephant\InputValidator\ValidatorServiceProvider',
  • 将以下内容添加到您的aliases数组中
	'InputValidator' => 'BigElephant\InputValidator\ValidatorFacade',

点击此处跳转到推荐用法

示例

原生控制器

class SignupController extends BaseController {

	// This will be left out of some examples
	public function getIndex()
	{
		return View::make('signup');
	}

	public function postIndex()
	{
		$input = [
			'email' => 				Input::get('email'),
			'password' => 			Input::get('password'),
			'password_confirmation' => Input::get('password_confirmation'),

			'first_name' => 		Input::get('first_name'),
			'last_name' => 			Input::get('last_name'),

			'country' => 			Input::get('country'),
			'city' => 				Input::get('city'),
			'post_code' => 			Input::get('post_code'),

			'terms' => 				Input::get('terms')
		];

		// Note this might be done by people with 2 other options, Input::all() or Input::only(['everything', 'here'])

		$rules = [
			'email' => 		'required|email',
			'password' => 	'required|min:5|confirmed',

			'first_name' => 'required',
			'last_name' => 	'required',

			'country' => 	'in:'.implode(':', external_country_list()),
			'post_code' => 	'numeric',

			'terms' => 	'accepted',
		];

		$messages = [
			'email' => 'Please enter valid email bro.';
			'password' => 'No password? You crazy!',
		];

		$validator = Validator::make($input, $rules, $messages);
		if ($validator->fails())
		{
			return Redirect::back()->withErrors($validator)->onlyInput(array_keys($input));
		}

		$user = new User($input);
		$user->save();

		return Redirect::to('something/pretty');
	}
}

示例闭包,获取输入和规则

此第一个示例是将输入和规则分组起来的选项。不推荐,但这是一个选项,后面的示例是使用此包的设计方式。

class SignupController extends BaseController {

	public function postIndex()
	{
		list ($input, $rules, $messages) = InputValidator::make(function($input)
		{
			$input->add('email')->required()->email()->fails('Please enter valid email bro.');
			// This hidden() here means if we fail this input won't be flashed to the session
			$input->add('password')->required()->min(5)->confirmed()->hidden()->fails('No password? You crazy!');

			$input->add('first_name')->required();
			$input->add('last_name')->required();

			$input->add('country')->in(external_country_list());
			$input->add('city');
			$input->add('postal_code')->numeric();

			$input->add('terms')->accepted();
		});

		$validator = Validator::make($input, $rules, $messages);
		if ($validator->fails())
		{
			return Redirect::back()->withErrors($validator)->onlyInput(array_keys($input));
		}

		$user = new User($input);
		$user->save();

		return Redirect::to('something/pretty');
	}
}

闭包中的示例验证器

这是一个类似于路由闭包的闭包方法...

首先是我们的闭包

InputValidator::add('signup', function($input)
{
	$input->add('email')->required()->email()->fails('Please enter valid email bro.');
	$input->add('password')->required()->min(5)->confirmed()->hidden()->fails('No password? You crazy!');

	$input->add('first_name')->required();
	$input->add('last_name')->required();

	$input->add('country')->in(external_country_list());
	$input->add('city');
	$input->add('postal_code')->numeric();

	$input->add('terms')->accepted();
});

然后是我们的控制器再次,带有更新后的信息

class SignupController extends BaseController {

	public function postIndex()
	{
		$validator = InputValidator::make('signup');
		if ($validator->fails())
		{
			return Redirect::back();

			// Old, why? Because the validator will automatically handle flushing the errors and input into the session for you
			//return Redirect::back()->withErrors($validator)->onlyInput(array_keys($input));
		}

		$user = new User($validator->getInput());
		$user->save();

		return Redirect::to('something/pretty');
	}
}

示例验证器类,推荐的方式

这是这个包设计的方式。

验证器类

class SignupValidator extends BigElephant\InputValidator\Validator {

	protected function defineInput()
	{
		$this->add('email')->required()->email()->fails('Please enter valid email bro.');
		$this->add('password')->required()->min(5)->confirmed()->hidden()->fails('No password? You crazy!');

		$this->add('first_name')->required();
		$this->add('last_name')->required();

		$this->add('country')->in(external_country_list());
		$this->add('city');
		$this->add('postal_code')->numeric();

		$this->add('terms')->accepted();
	}
}

然后我们可以使用InputValidator::make('SignupValidator')创建验证器,或者像上面的示例那样添加,我们将假设后者。

控制器再次,与前面相同

class SignupController extends BaseController {

	public function postIndex()
	{
		$validator = InputValidator::make('signup');
		if ($validator->fails())
		{
			return Redirect::back();
		}

		$user = new User($validator->getInput());
		$user->save();

		return Redirect::to('something/pretty');
	}
}

仅创建一次字段的示例验证器

例如,当用户注册时可以创建用户名,但不进行编辑。

class UserValidator extends BigElephant\InputValidator\Validator {
	
	protected function defineInputs()
	{
		$this->add('username')->required()->alphaDash()->noEdit();
		$this->add('password')->required()->min(5)->hidden();

		$this->add('email')->required()->email();
	}
}

在上面的示例中,如果HTTP方法是PUTPATCH,则在运行验证器时将完全跳过username输入,因为我们正在更新用户(如果正确使用您的这些方法)。或者,您可以调用UserValidator::setUpdating为true或false以跳过或包含设置为noEdit的值。例如,当管理员编辑用户时,您可以将它设置为false。

使用过滤器的示例用法

我添加了一个小功能来进一步缩短代码,完全绕过控制器中的任何验证。如果您使用InputValidation::add(...),可以将第三个参数定义为响应,如下所示

InputValidation::add('signup', 'SignupValidator', Redirect::back());

或者,您可以填写指定验证器的filterFailResponse方法以获得相同的结果。例如

class UserValidator extends BigElephant\InputValidator\Validator {
	
	protected function defineInputs()
	{
		$this->add('username')->required()->alphaDash()->noEdit();
		$this->add('password')->required()->min(5)->hidden();

		$this->add('email')->required()->email();
	}

	public function filterFailResponse()
	{
		return Redirect::back();
	}
}

注意:使用此方法,您仍然会保留旧输入和任何错误被刷新到会话中。

这样做将自动创建一个名为validator.{name}的过滤器,因此在这种情况下为validator.signup。现在我们的控制器更小了,因为添加了以不同的方式获取数据的方式

class SignupController extends BaseController {

	public function __construct()
	{
		$this->beforeFilter('validate.signup', ['only' => 'postIndex']);
	}

	public function postIndex()
	{
		$user = new User(InputValidator::input('signup'));
		$user->save();

		return Redirect::to('success/something/pretty');
	}
}

在这里,您将看到InputValidator::input(...)的使用。当使用过滤器时,通常获取的$input数组将被存储在工厂中,您可以使用InputValidator::input('validator_name')访问。