Laravel 5 中的自定义验证器
Posted
技术标签:
【中文标题】Laravel 5 中的自定义验证器【英文标题】:Custom validator in Laravel 5 【发布时间】:2015-04-09 16:14:51 【问题描述】:我正在将我的 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"
]
但是,现在任何页面上都不会呈现任何内容。我做错了什么?
【问题讨论】:
检查您的日志 -app/storage/logs/laravel.log
和/或您的网络服务器的日志文件。
你跑composer dump-autoload
了吗?
@ceejayoz 失败时不会记录任何内容。 lukasgeiter 是的,我做到了
【参考方案1】:
尝试以下方法:
-
创建一个绑定类,您可以在其中实现您希望扩展
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';
]
【讨论】:
工作就像一个魅力。谢谢 好!很高兴为您提供帮助 为什么文档没有涵盖这个?!它实际上有 3 段关于整个主题。 @manix 我希望我早点看到这个。我刚刚在此问题上发布了一个类似(但不同)的答案:***.com/questions/26817045#30971705 我必须展示如何使用其他输入,所以我想这是值得的。 只需花 2 天时间在这个 **** 上,而用原生 PHP 编写它需要几秒钟......该死,Laravel!【参考方案2】:这就是我在添加自定义验证时所做的。这是针对 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 文件夹下创建了一个名为“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”。
我在app\Providers\AppServiceProvider.php
中的boot()
方法中添加了以下代码。
Validator::resolver(function($translator, $data, $rules, $messages = array(), $customAttributes = array())
return new ValidatorExtended($translator, $data, $rules, $messages, $customAttributes);
);
不要忘记添加下面的库,一个是验证器类,另一个是你自己的类,即“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
您使用自己的类而不是使用请求类,它是请求类的扩展。
【讨论】:
抱歉,第 9 步无法使代码格式化工作,感谢您的帮助。 附加说明:如果您尝试验证的字段为空,则自定义验证不起作用。以上是关于Laravel 5 中的自定义验证器的主要内容,如果未能解决你的问题,请参考以下文章
我可以通过 Laravel 5.1 中的自定义请求对象验证后恢复输入字段值吗?