bigelephant / input-validator
Requires
- php: >=5.3.0
- bigelephant/laravel-rules: dev-master
- illuminate/http: 4.0.x
- illuminate/routing: 4.0.x
- illuminate/support: 4.0.x
- illuminate/validation: 4.0.x
Requires (Dev)
- mockery/mockery: 0.7.2
This package is auto-updated.
Last update: 2024-09-22 04:33:49 UTC
README
此包旨在抽象化您的控制器中的输入验证,并减少重复代码。
安装
将以下内容添加到您的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方法是PUT
或PATCH
,则在运行验证器时将完全跳过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')
访问。