bigelephant/input-validator 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

bigelephant/input-validator

Composer 安装命令:

composer require bigelephant/input-validator

包简介

关键字:

README 文档

README

This package is designed to abstract out input validation for your controllers and reduce repeated code.

Build Status

Installation

Add the following to the "require" section of your composer.json file:

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

Edit the app/config/app.php file and...

  • Add the following to your providers array:
	'BigElephant\InputValidator\ValidatorServiceProvider',
  • Add the following to your aliases array:
	'InputValidator' => 'BigElephant\InputValidator\ValidatorFacade',

Click here to skip down to the recommended usage

Examples

Native Controller

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');
	}
}

Example closure to get input and rules

This first example is an option to group up input and rules. It isn't recommended but is an option, later examples are the designed way to use this package.

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');
	}
}

Example validator in closure

This is a closure method similar to Route closures...

First our closure

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();
});

Then our controller again with the updated information

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');
	}
}

Example validator class, the recommended way

This is the way this package was designed to be used.

The validator class

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();
	}
}

Then we can either make the validator with InputValidator::make('SignupValidator') or it could be added like the example above with InputValidator::add('signup', 'SignupValidator'), we will assume the latter in our example.

Controller again, same as the previous one

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');
	}
}

Example validator with fields only created once

For example, a username can be created when they sign up and not edited.

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();
	}
}

With the above if the HTTP method is PUT or PATCH then when the validator is run the username input will be skipped completely as we are updating the user (if using your methods properly). Alternatively you can call UserValidator::setUpdating to true or false to skip or include values set to noEdit. For example you would set it to false when an admin is editing a user.

Example usage with filters

I added a little feature to shorten the code even more, completely bypassing any validation in a controller. If you use InputValidation::add(...) you can define the third parameter as a response, like the following:

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

or you can fill out the filterFailResponse method of the specified validator for the same result. For example:

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();
	}
}

Note: with this you will still have the old input and any errors flushed into the session.

By doing this a filter is automatically created called validator.{name}, so in this case validator.signup. Now our controller is even smaller, with the addition of getting our data a different way:

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');
	}
}

Here you will see the use of InputValidator::input(...). This is used when we use filters, the usual $input array you get will instead be stored in the factory and you can access with InputValidator::input('validator_name').

统计信息

  • 总下载量: 22
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 3
  • 点击次数: 1
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 3
  • Watchers: 3
  • Forks: 2
  • 开发语言: PHP

其他信息

  • 授权协议: Unknown
  • 更新时间: 2013-02-06

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固