我正在将我的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"
]
但是,现在任何页面上都不会呈现任何内容。我做错了什么?
尝试以下操作:
- 制作一个绑定类,在其中可以实现要扩展
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。它的初始值为false。否则你会得到一个白色页面,上面有一条"禁止"的错误消息。
我在函数
rules()
下添加了一个规则,它看起来像public function rules() { return [ 'activeuntil' => 'today_onwards' ]; }
today_onwards
是我的新验证。
我在应用程序文件夹下创建了一个名为"服务"的文件夹
我在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_overage"。下划线应该放在方法名称的所有第一个大写字母之前。我希望我解释得很好。
TodayOnwards方法相当于验证名称"today_owards",
另一个例子是,如果我创建了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 } }
您不使用请求类,而是使用自己的类,它是请求类的扩展。