Laravel 5:
下面是更广泛的方法,遵循现代原则,更像Laravel。这有点复杂,但仍然容易遵循,最终结果更清晰。
让我们从改变一些事情开始。让我们减少这个问题,使用更新的数组语法并应用格式。
$rules = [
'from_date' => [
'before:'.Input::get('to_date') // This is what we will learn to do
],
'to_date' => [
'after:'.Input::get('from_date') // Do this one on your own
]
];
现在让我们创建一个新的请求php artisan make:request StoreWhateverRequest
。这将创建App/HTTP/Request/StoreWhateverRequest.php
文件。打开它并将你的规则放在rules()
函数的返回数组中。
return [
'from_date' => 'date',
'to_date' => 'date|after_field:from_date'
];
因为after_field
不提供给尚未使用这将无法工作。我们来创建它。我们需要一个扩展验证器的新类。你可以把它放在app/Services
。我们需要类似的东西:
<?php namespace App\Services;
use Illuminate\Validation\Validator;
use Carbon\Carbon;
class AfterFieldValidator extends Validator {
public function validateAfterField($attribute, $value, $parameters)
{
return Carbon::parse($value) > Carbon::parse($this->data[$parameters[0]]);
}
}
在上面我们有:$attribute
这是我们正在检查(TO_DATE)的字段的名称,$value
是我们正在检查和$parameters
字段的值是参数我们传递给'to_date' => 'date|afterField:from_date'
中的验证器(from_date)。我们还需要将其他数据字段传递给Validator,我们可以使用$this->data
来获得这些数据字段。那么我们只需要适当地预先制定逻辑。在这里你甚至不需要Carbon,但一定要解析这个字符串,这样我们才不会进行字符串比较。
现在我们需要将它加载到应用程序中。要做到这一点,请在app/Providers/AppServiceProviders.php
中的boot()
函数中使用下面的代码。
Validator::resolver(function($translator, $data, $rules, $messages)
{
return new afterFieldValidator($translator, $data, $rules, $messages);
});
最后一步是最简单的。只需在我们的控制器中注入并实例化StoreWhateverRequest
即可。
...
public function store(StoreWhateverRequest $request)
{
...
全部完成。我觉得这是一个很好的解决问题的方法。
现在Laravel 5接受字段名传递给'before'和'验证器之后。在那种情况下,只需使用'after:from_date' – 2016-07-23 00:34:28