我正在将我的Laravel应用程序从4升级到5.但是,我有一个我无法开始工作的自定义验证器。
在L4中,我制作了一个 validators.php 文件,并使用require app_path().'/validators.php';
将其包含在 global.php 中。
我尝试在L5中做同样的事情。我在 app / Validators / Validators.php 中删除了验证器,并更新了我的 composer.json 。
"files": [
"app/Validators/Validators.php"
]
但是,现在在任何页面上都没有渲染。我做错了什么?
答案 0 :(得分:31)
尝试以下方法:
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';
]
答案 1 :(得分:5)
所以这就是我在添加自定义验证时所做的。这是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。它的初始值是假的。否则你会得到一个带有“禁止”错误信息的白页。
我在rules()
函数下添加了一条规则,这就是它的样子
public function rules() {
return [
'activeuntil' => 'today_onwards'
];
}
today_onwards
是我的新验证。
我在App文件夹
我在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”。
我在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
}
}
不使用Request Class,而是使用自己的类,它是Request类的扩展。