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 是我们传递给验证器的参数(from_date)见于'to_date' => 'date|afterField:from_date'。我们还需要传递给验证器的其他数据字段,我们可以通过$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)
{
...
全部完成。我觉得这是解决问题的一种非常可靠的方法。