[英]Custom validator in Laravel 5
我正在將我的Laravel應用程序從4升級到5.但是,我有一個我無法工作的自定義驗證器。
在L4中,我創建了一個validators.php文件,並使用require app_path().'/validators.php';
將其包含在global.php中 require app_path().'/validators.php';
。
我嘗試在L5中做同樣的事情。 我在app / Validators / Validators.php中刪除了一個驗證器 ,並更新了我的composer.json 。
"files": [
"app/Validators/Validators.php"
]
但是,現在在任何頁面上都沒有渲染。 我做錯了什么?
請嘗試以下方法:
Validator
類的每個規則。 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 Artisan make:request MyFormValidationRequest
文件 這是初始代碼:
<?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()
方法的返回值更改為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); });
不要忘記添加下面的庫,一個是Validator類,另一個是你自己的類,它是“ 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 } }
您可以使用自己的類,而不是使用Request Class,它是Request類的擴展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.