CakePHP 3 warunkowa walidacja

Jedną z przydatnych funkcji CakePHP jest warunkowa walidacja (Conditional Validation). Podczas dodawania rekordu, co jeśli chcemy, aby pole nie było puste tylko wtedy, gdy inne pole nie jest puste? Podczas definiowania reguł sprawdzania poprawności można użyć klucza on, aby określić, kiedy należy zastosować regułę sprawdzania poprawności. Jeśli pozostanie niezdefiniowana, reguła będzie zawsze stosowana. Inne prawidłowe wartości to create i update. Użycie jednej z tych wartości spowoduje, że reguła będzie stosowana tylko przy tworzeniu lub aktualizacji.

Dodatkowo możesz podać funkcję, która określi, czy dana zasada ma zostać zastosowana tak jak w poniższym przykładzie.
$validator->add('picture', 'file', [
    'rule' => ['mimeType', ['image/jpeg', 'image/png']],
    'on' => function ($context) {
        return !empty($context['data']['show_profile_picture']);
    }
]);
Możesz uzyskać dostęp do innych przesłanych wartości pól za pomocą tablicy $context['data']. W powyższym przykładzie reguła dla picture będzie opcjonalna w zależności od tego, czy wartość dla pola show_profile_picture jest pusta. Można także użyć reguły sprawdzania poprawności uploadedFile, aby wysyłanie plików było opcjonalne.
$validator->add('picture', 'file', [
    'rule' => ['uploadedFile', ['optional' => true]],
]);
Metody allowEmpty, notEmpty i requirePresence również przyjmują funkcję wywołania zwrotnego jako ostatni argument. Jeśli jest obecna, wywołanie zwrotne określa, czy reguła powinna zostać zastosowana czy nie. Na listingu poniżej mamy określenie, że albo obydwa pola start_time i end_time muszą być wypełnione albo żadne.
$validator
	->notEmpty('start_time', 'Must have values in both or neither', function($context) {
		return $context['data']?$context['data']['end_time']:false;
	})
	->notEmpty('end_time', 'Must have values in both or neither', function($context) {
		return $context['data']?$context['data']['start_time']:false;
	});
Inny bardziej skomplikowany przykład dotyczący pola full_name. Pole to jest wymagane ale tylko wtedy gdy pole office ma wartość accountant.
$validator->requirePresence('full_name', function ($context) {
    if (isset($context['data']['office'])) {
        return $context['data']['office'] === 'accountant';
    }
    return false;
});