Laravel 5 中的自定义验证器
Custom validator in Laravel 5
我正在将我的 Laravel 应用程序从 4 升级到 5。但是,我有一个无法开始工作的自定义验证器。
在 L4 中,我制作了一个 validators.php 文件并使用 [=12] 将其包含在 global.php 中=].
我尝试在 L5 中做一些相同的事情。我在 app/Validators/Validators.php 中删除了一个验证器,并更新了我的 composer.json.
"files": [
"app/Validators/Validators.php"
]
但是,现在任何页面上都不会呈现任何内容。我做错了什么?
尝试以下操作:
- 创建一个绑定 class,您可以在其中实现每个要扩展的规则
Validator
class。
- 创建一个扩展
ServiceProvider
. 的服务提供者
- 在
config/app.php
文件中添加您的自定义验证器提供程序。
您可以像这样在 Services
文件夹中创建绑定:
namespace MyApp\Services;
class Validator extends \Illuminate\Validation\Validator{
public function validateFoo($attribute, $value, $parameters){
return $value == "foo"
}
}
然后,使用服务提供商扩展核心:
namespace MyApp\Providers;
use MyApp\Services\Validator;
use Illuminate\Support\ServiceProvider;
class ValidatorServiceProvider extends ServiceProvider{
public function boot()
{
\Validator::resolver(function($translator, $data, $rules, $messages)
{
return new Validator($translator, $data, $rules, $messages);
});
}
public function register()
{
}
}
最后,像这样在 config/app.php
导入您的服务提供商:
'providers' => [
...
...
'MyApp\Providers\ValidatorServiceProvider';
]
所以这是我在添加自定义验证时所做的。这是 laravel 5.1
- 运行
PHP Artisan make:request MyFormValidationRequest
文件在 app\Requests\MyFormValidationRequest.php
下创建
这是初始代码:
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class MyFormValidationRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
重要:如果您没有进行任何身份验证,请将 authorize()
方法的 return 值更改为 true。它的初始值为假。否则你会得到一个带有 "Forbidden" 错误信息的白页。
我在函数rules()
下添加了一条规则,下面是它的样子
public function rules() {
return [
'activeuntil' => 'today_onwards'
];
}
today_onwards
是我的新验证。
我在App文件夹
下创建了一个名为'Services'的文件夹
我在 App\Services 文件夹下创建了一个名为 'ValidatorExtended.php' 的文件,代码如下:
<?php
namespace App\Services;
use Illuminate\Validation\Validator;
use Carbon\Carbon;
class ValidatorExtended extends Validator {
private $_custom_messages = array(
"today_onwards" => "The :attribute must be today onwards",
);
public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) {
parent::__construct( $translator, $data, $rules, $messages, $customAttributes );
$this->_set_custom_stuff();
}
protected function _set_custom_stuff() {
//setup our custom error messages
$this->setCustomMessages( $this->_custom_messages );
}
protected function validateTodayOnwards( $attribute, $value ) {
$now = strtotime('-1 day');
$valueDateFormat = strtotime($value);
if($valueDateFormat > $now){
return true;
}
else {
return false;
}
}
}
注意: validateTodayOnwards 方法是放置逻辑的地方。
该方法的名称应始终以 "validate" 开头,然后是您的新验证密钥的名称,该名称应以标题开头,
另请注意 您的验证密钥应由下划线和所有小写字母分隔,在本例中为 "today_onwards"。下划线应放在方法名称中所有第一个大写字母之前。我希望我解释得很好。
TodayOnwards 方法等同于 "today_onwards",
的验证名称
另一个例子,如果我创建了validateOldPassword,你的验证密钥应该是"old_password"。
我在 boot()
方法中的 app\Providers\AppServiceProvider.php
中添加了以下代码。
Validator::resolver(function($translator, $data, $rules, $messages = array(), $customAttributes = array())
{
return new ValidatorExtended($translator, $data, $rules, $messages, $customAttributes);
});
不要忘记添加下面的库,一个是验证器class,另一个是您自己的class,即“ValidatorExtended
”。
use App\Services\ValidatorExtended;
use Illuminate\Support\Facades\Validator;
这是整个文件的样子,[app\Providers\AppServiceProvider.php
]
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\ValidatorExtended;
use Illuminate\Support\Facades\Validator;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Validator::resolver(function($translator, $data, $rules, $messages = array(), $customAttributes = array())
{
return new ValidatorExtended($translator, $data, $rules, $messages, $customAttributes);
});
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
就是这样。完毕。您创建了自己的自定义验证。
另外,如果你想在你的控制器中使用它,下面是代码:
class testController extends Controller
{
public function updatePass(MiscValidation $request){
//code here
}
}
您不使用请求 Class,而是使用您自己的 class,它是请求 class.
的扩展
我正在将我的 Laravel 应用程序从 4 升级到 5。但是,我有一个无法开始工作的自定义验证器。
在 L4 中,我制作了一个 validators.php 文件并使用 [=12] 将其包含在 global.php 中=].
我尝试在 L5 中做一些相同的事情。我在 app/Validators/Validators.php 中删除了一个验证器,并更新了我的 composer.json.
"files": [
"app/Validators/Validators.php"
]
但是,现在任何页面上都不会呈现任何内容。我做错了什么?
尝试以下操作:
- 创建一个绑定 class,您可以在其中实现每个要扩展的规则
Validator
class。 - 创建一个扩展
ServiceProvider
. 的服务提供者
- 在
config/app.php
文件中添加您的自定义验证器提供程序。
您可以像这样在 Services
文件夹中创建绑定:
namespace MyApp\Services;
class Validator extends \Illuminate\Validation\Validator{
public function validateFoo($attribute, $value, $parameters){
return $value == "foo"
}
}
然后,使用服务提供商扩展核心:
namespace MyApp\Providers;
use MyApp\Services\Validator;
use Illuminate\Support\ServiceProvider;
class ValidatorServiceProvider extends ServiceProvider{
public function boot()
{
\Validator::resolver(function($translator, $data, $rules, $messages)
{
return new Validator($translator, $data, $rules, $messages);
});
}
public function register()
{
}
}
最后,像这样在 config/app.php
导入您的服务提供商:
'providers' => [
...
...
'MyApp\Providers\ValidatorServiceProvider';
]
所以这是我在添加自定义验证时所做的。这是 laravel 5.1
- 运行
PHP Artisan make:request MyFormValidationRequest
文件在app\Requests\MyFormValidationRequest.php
下创建
这是初始代码:
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class MyFormValidationRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
重要:如果您没有进行任何身份验证,请将 authorize()
方法的 return 值更改为 true。它的初始值为假。否则你会得到一个带有 "Forbidden" 错误信息的白页。
我在函数
rules()
下添加了一条规则,下面是它的样子public function rules() { return [ 'activeuntil' => 'today_onwards' ]; }
today_onwards
是我的新验证。
我在App文件夹
下创建了一个名为'Services'的文件夹
我在 App\Services 文件夹下创建了一个名为 'ValidatorExtended.php' 的文件,代码如下:
<?php namespace App\Services; use Illuminate\Validation\Validator; use Carbon\Carbon; class ValidatorExtended extends Validator { private $_custom_messages = array( "today_onwards" => "The :attribute must be today onwards", ); public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) { parent::__construct( $translator, $data, $rules, $messages, $customAttributes ); $this->_set_custom_stuff(); } protected function _set_custom_stuff() { //setup our custom error messages $this->setCustomMessages( $this->_custom_messages ); } protected function validateTodayOnwards( $attribute, $value ) { $now = strtotime('-1 day'); $valueDateFormat = strtotime($value); if($valueDateFormat > $now){ return true; } else { return false; } } }
注意: validateTodayOnwards 方法是放置逻辑的地方。 该方法的名称应始终以 "validate" 开头,然后是您的新验证密钥的名称,该名称应以标题开头,
另请注意 您的验证密钥应由下划线和所有小写字母分隔,在本例中为 "today_onwards"。下划线应放在方法名称中所有第一个大写字母之前。我希望我解释得很好。
TodayOnwards 方法等同于 "today_onwards",
的验证名称另一个例子,如果我创建了validateOldPassword,你的验证密钥应该是"old_password"。
我在
boot()
方法中的app\Providers\AppServiceProvider.php
中添加了以下代码。Validator::resolver(function($translator, $data, $rules, $messages = array(), $customAttributes = array()) { return new ValidatorExtended($translator, $data, $rules, $messages, $customAttributes); });
不要忘记添加下面的库,一个是验证器class,另一个是您自己的class,即“
ValidatorExtended
”。use App\Services\ValidatorExtended; use Illuminate\Support\Facades\Validator;
这是整个文件的样子,[
app\Providers\AppServiceProvider.php
]<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Services\ValidatorExtended; use Illuminate\Support\Facades\Validator; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { // Validator::resolver(function($translator, $data, $rules, $messages = array(), $customAttributes = array()) { return new ValidatorExtended($translator, $data, $rules, $messages, $customAttributes); }); } /** * Register any application services. * * @return void */ public function register() { // } }
就是这样。完毕。您创建了自己的自定义验证。
另外,如果你想在你的控制器中使用它,下面是代码:
class testController extends Controller { public function updatePass(MiscValidation $request){ //code here } }
您不使用请求 Class,而是使用您自己的 class,它是请求 class.
的扩展