Laravel 5中的自定义验证器
我正在将我的Laravel应用程序从4升级到5.但是,我有一个自定义验证器,我无法工作。Laravel 5中的自定义验证器
在L4,我做了validators.php文件,并使用包含require app_path().'/validators.php';
它在global.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
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' ]; }
我创建了一个应用程序的文件夹下名为“服务”文件夹
-
我创建了一个下应用\服务文件夹命名为“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; } } }
-
我在
app\Providers\AppServiceProvider.php
的代码里面加了boot()
的方法。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 } }
today_onwards
是我的新的验证。
注:的validateTodayOnwards方法是,你把你的逻辑。 方法的名称应在“验证”永远启动,然后你的新的验证密钥的名称应该是在标题的情况下,
另注您的验证密钥应该用下划线和所有小字母分开,这种情况下,“today_onwards”。下划线应放在方法名称中的所有第一个大写字母之前。我希望我解释得很好。
TodayOnwards方法等效于“today_onwards”验证名称,
另一个例子,如果我创建validateOldPassword,您的验证关键应该是“OLD_PASSWORD”。
而不是使用请求类你用你自己的类,这是Request类的扩展。
对第9步抱歉无法让代码格式化工作,任何帮助表示赞赏。 – 2015-12-20 02:55:32
附加说明:如果您尝试验证的字段为空,则自定义验证不起作用。 – 2015-12-20 04:08:54
检查您的日志 - “app/storage/logs/laravel.log”和/或您的网络服务器的日志文件。 – ceejayoz 2015-02-09 19:49:39
你运行'composer dump-autoload'吗? – lukasgeiter 2015-02-09 21:32:09
@ceejayoz失败时不会记录任何内容。 lukasgeiter是的,我做过 – Maeh 2015-02-10 10:54:17