2017-01-12 25 views
5

Próbuję zweryfikować żądanie POST.Walidacja Laravel 5.2: format daty: Y.m.d nie działa

Format to: d.m.Y (12.1.2017) Moja reguła to required|date_format:d.m.Y dla tego pola.

otrzymuję komunikat o błędzie:

InvalidArgumentException in Carbon.php line 425: 
Unexpected data found. 
Unexpected data found. 
Data missing 

Gdybym zmienić . do - lub nawet / to działa -> Dane POST zmienione przed dopasować regułę.

Potrzebuję formatu niemieckiego do tego.

edit: moje zasady walidacji:

public function rules() 
{ 
    return [ 
     'title' => 'required|max:255', 
     'expiration_date' => 'required|date_format:d.m.Y', 
     //'description' => 'required', 
     'provision_agent' => 'required|integer|between:0,100', 
     'discount_consumer' => 'required|integer|between:0,100', 
     'quota' => 'required|integer', 
    ]; 
} 
+0

myślę, że jest w jakiś sposób związane z faktem, że '.' jest specjalny znak w struny reguły poprawności, normalnie używany przez Llaravel z innych powodów - ale nie ma pojęcia, jak można tego uniknąć. – Alex

+0

Czy próbowałeś \. ? Lub '['field' => 'date_format' => ['required', 'd.m.Y']]? Czy możesz pokazać nam więcej kodu? –

+0

@FelippeDuarte jest to składnia udokumentowana gdziekolwiek? Po prostu ciekawy ... – Alex

Odpowiedz

4

Zawijanie formatów powinno działać, po prostu próbowałem z 5.2, działa dobrze.

public function rules() 
{ 
    return [ 
     'title' => 'required|max:255', 
     'expiration_date' => 'required|date_format:"d.m.Y"', 
     //'description' => 'required', 
     'provision_agent' => 'required|integer|between:0,100', 
     'discount_consumer' => 'required|integer|between:0,100', 
     'quota' => 'required|integer', 
    ]; 
} 

ale błąd co dodaje się pytanie InvalidArgumentException zgodne Carbon.php 425: wydaje się coś innego Domyślam używasz EXPIRATION_DATE gdzieś w kontrolerze lub modelu jak ten z Carbon

echo Carbon::createFromFormat('Y-m-d', '12.1.2017'); 

należy spróbować coś takiego

echo Carbon::parse('12.1.2017')->format('Y-m-d') 
0

owinąć formatu w cudzysłowie:

'date_format:"d.m.Y"' 
+0

Próbowałem, ale ten sam problem. Myślę . jest operatorem używanym podczas sprawdzania poprawności. Muszę uciec, ale nie mogę znaleźć, czy to możliwe, czy nie. – mht

+0

@mht Wrap powinien działać, po prostu jestem zmęczony z 5.2 działa dobrze – vijaykumar

0

Spróbuj tak,

public function rules() 
{ 
    return [ 
     'title' => 'required|max:255', 
     'expiration_date' => 'date_format:"d.m.Y"|required', // I have changed order of validation 
     //'description' => 'required', 
     'provision_agent' => 'required|integer|between:0,100', 
     'discount_consumer' => 'required|integer|between:0,100', 
     'quota' => 'required|integer', 
    ]; 
} 

nadzieję, że to rozwiąże problem.

+0

Nie sądzę, zmiana zamówienia będzie działać, ale Wrap będzie działać. I po walidacji date_format. Nie wymaga tutaj żadnego wymaganego użycia? – vijaykumar

0

Jeśli nie uda się rozwiązać problem inaczej, nadal można używać custom validation rule:

Validator::extend('date_dmY', function ($attribute, $value) { 
    $format = 'd.m.Y'; 
    $date = DateTime::createFromFormat($format, $value); 
    return $date && $date->format($format) === $value; 
}, 'optional error message'); 

Dodatkowa kontrola $date->format($format) === $value jest uniknięcie błędnie przyjmując out-of-zakres dat, na przykład "32.01.2017". Zobacz ten comment na php.net.

Gdy reguła zwyczaj walidacja została zdefiniowana, można go używać tak:

public function rules() { 
    return [ 
     'expiration_date' => 'required|date_dmY', 
    ]; 
}