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