Validatori Core
Panoramica
I validatori core forniscono le regole di base utilizzate nella maggior parte dei form: obbligatorietà del campo, vincoli di lunghezza/valore, confronto con espressioni regolari e liste di valori ammessi. Sono il punto di partenza per qualsiasi schema di validazione.
Comportamento comune
Tutti i validatori core (eccetto required) considerano un valore vuoto (null, undefined, stringa vuota) come valido. Per rendere un campo obbligatorio, combinare required con gli altri validatori:
required|min:3|max:100
[@pzeta/vue-form] ValidationService: validatore "…" non trovato, una volta per regola. Prima il campo restava invalido senza nessuna traccia.Validatori
required
Sintassi: required
Descrizione: Verifica che il campo non sia vuoto. Per le stringhe controlla che non siano vuote dopo il trim. Per gli array verifica che contengano almeno un elemento.
Esempi:
// Valido
ValidationService.validate('testo', 'required')
ValidationService.validate(['a', 'b'], 'required')
// Non valido
ValidationService.validate('', 'required')
ValidationService.validate([], 'required')
ValidationService.validate(null, 'required')
// In schema DynamicFormLayouts
{ name: 'nome', type: 'text', validation: 'required' }
min
Sintassi: min:N
Descrizione: Per le stringhe verifica la lunghezza minima (numero di caratteri). Per i numeri verifica che il valore sia maggiore o uguale a N. Non conta gli elementi di un array: per quello c'è minItems.
Parametro: valore minimo (intero)
Esempi:
// Stringa - lunghezza minima
ValidationService.validate('ab', 'min:3') // non valido: troppo corta
ValidationService.validate('abc', 'min:3') // valido
// Numero - valore minimo
ValidationService.validate(5, 'min:10') // non valido: 5 < 10
ValidationService.validate(15, 'min:10') // valido
// In schema DynamicFormLayouts
{ name: 'username', type: 'text', validation: 'required|min:3|max:30' }
max
Sintassi: max:N
Descrizione: Per le stringhe verifica la lunghezza massima. Per i numeri verifica che il valore sia minore o uguale a N. Non conta gli elementi di un array: per quello c'è maxItems.
Parametro: valore massimo (intero)
Esempi:
// Stringa - lunghezza massima
ValidationService.validate('test123456', 'max:5') // non valido: troppo lunga
ValidationService.validate('ciao', 'max:5') // valido
// Numero - valore massimo
ValidationService.validate(150, 'max:100') // non valido: 150 > 100
ValidationService.validate(50, 'max:100') // valido
// In schema DynamicFormLayouts
{ name: 'descrizione', type: 'textarea', validation: 'max:500' }
minItems e maxItems
Sintassi: minItems:N, maxItems:N
Descrizione: Numero minimo e massimo di elementi di un valore a elenco: tag, selezione multipla, righe. Disponibili dalla 2.20.0.
Parametro: numero di elementi (intero)
// Al massimo 20 tag
ValidationService.validate(tags, 'maxItems:20')
// con 21 tag => errors: ['validation.core.maxItems|max:20']
// «Il campo può contenere al massimo 20 elementi»
// Limite 1: il messaggio è al singolare
ValidationService.validate(['a', 'b'], 'maxItems:1')
// => errors: ['validation.core.maxItemsOne|max:1']
// «Il campo può contenere al massimo un elemento»
// Almeno 2 destinatari, e l'elenco non può restare vuoto
ValidationService.validate(['a'], 'required|minItems:2')
// => errors: ['validation.core.minItems|min:2']
// In schema DynamicFormLayouts
{ name: 'reparti', type: 'multiselect', label: 'Reparti', validation: 'required|maxItems:3' }
Come le altre regole, l'elenco vuoto ([], null, undefined) è un valore vuoto e passa: per renderlo obbligatorio si aggiunge required. Per questo minItems:1 da solo non aggiunge niente, e «almeno uno» si scrive required. Un valore che non è un array non è valido: validation.common.mustBeArray, «Il valore deve essere un elenco».
min e max non contano gli elementi. Su un array min:N e max:N non controllano niente e il valore risulta sempre valido: max:20 su un campo di tag non pone alcun limite. Dalla 2.20.0 la console lo segnala, una volta per regola, con [@pzeta/vue-form] La regola "max:N" non conta gli elementi di un elenco…, e rimanda a maxItems:N/minItems:N.length
Sintassi: length:N
Descrizione: Verifica che la stringa abbia esattamente N caratteri. Utile per codici a lunghezza fissa (PIN, OTP, codici postali).
Parametro: lunghezza esatta (intero)
Esempi:
// Codice a 6 caratteri
ValidationService.validate('AB123', 'length:6') // non valido: 5 caratteri
ValidationService.validate('AB1234', 'length:6') // valido
// PIN a 4 cifre
ValidationService.validate('123', 'length:4') // non valido
ValidationService.validate('1234', 'length:4') // valido
// In schema DynamicFormLayouts
{ name: 'pin', type: 'text', validation: 'required|length:4' }
between
Sintassi: between:min,max
Descrizione: Verifica che un valore numerico sia compreso tra min e max (inclusi). Restituisce errore se il valore non è un numero o è fuori range.
Parametro: range nel formato min,max (numeri separati da virgola)
Esempi:
// Valore in range
ValidationService.validate(50, 'between:1,100') // valido
ValidationService.validate(1, 'between:1,100') // valido (incluso)
ValidationService.validate(100, 'between:1,100') // valido (incluso)
// Valore fuori range
ValidationService.validate(0, 'between:1,100') // non valido
ValidationService.validate(150, 'between:1,100') // non valido
// In schema DynamicFormLayouts
{ name: 'percentuale', type: 'number', validation: 'required|between:0,100' }
range
Sintassi: range:min,max
Descrizione: Alias di between. Verifica che un valore numerico sia compreso nel range specificato. Utile per chi preferisce la nomenclatura "range" rispetto a "between".
Parametro: range nel formato min,max
Esempi:
// Equivalente a between
ValidationService.validate(50, 'range:1,100') // valido
ValidationService.validate(150, 'range:1,100') // non valido
// In schema DynamicFormLayouts
{ name: 'eta', type: 'number', validation: 'required|range:18,120' }
pattern
Sintassi: pattern:regex
Descrizione: Verifica che la stringa corrisponda all'espressione regolare specificata. Il pattern non deve includere delimitatori. Include protezione anti-ReDoS: pattern più lunghi di 500 caratteri o con quantificatori annidati pericolosi vengono rifiutati.
Parametro: espressione regolare (senza delimitatori /)
Esempi:
// Solo lettere minuscole e numeri
ValidationService.validate('abc123', 'pattern:^[a-z0-9]+$') // valido
ValidationService.validate('abc-123', 'pattern:^[a-z0-9]+$') // non valido
// Formato specifico (es. codice prodotto)
ValidationService.validate('PROD-001', 'pattern:^[A-Z]+-\d{3}$') // valido
// In schema DynamicFormLayouts
{ name: 'codice', type: 'text', validation: 'required|pattern:^[A-Z]{2}\\d{4}$' }
regex
Sintassi: regex:pattern
Descrizione: Alias di pattern. Verifica match con espressione regolare. Stessa logica e protezione anti-ReDoS di pattern.
Parametro: espressione regolare (senza delimitatori)
Esempi:
// Equivalente a pattern
ValidationService.validate('test123', 'regex:^[a-z]+\\d+$') // valido
ValidationService.validate('123test', 'regex:^[a-z]+\\d+$') // non valido
// In schema DynamicFormLayouts
{ name: 'targa', type: 'text', validation: 'required|regex:^[A-Z]{2}\\d{3}[A-Z]{2}$' }
enum
Sintassi: enum:val1,val2,val3
Descrizione: Verifica che il valore sia uno di quelli specificati nella lista. I valori sono separati da virgola e confrontati come stringhe.
Parametro: lista valori ammessi separati da virgola
Esempi:
// Valore ammesso
ValidationService.validate('active', 'enum:active,pending,closed') // valido
ValidationService.validate('pending', 'enum:active,pending,closed') // valido
// Valore non ammesso
ValidationService.validate('deleted', 'enum:active,pending,closed') // non valido
ValidationService.validate('ACTIVE', 'enum:active,pending,closed') // non valido (case sensitive)
// In schema DynamicFormLayouts
{ name: 'stato', type: 'select', validation: 'required|enum:bozza,pubblicato,archiviato' }
in
Sintassi: in:val1,val2,val3
Descrizione: Alias di enum (dalla 2.15.2), con lo stesso comportamento: è il nome che questa regola ha in molte librerie di validazione. Come per enum, il parametro può contenere |.
ValidationService.validate('active', 'in:active,pending') // valido
{ name: 'stato', type: 'select', validation: 'required|in:bozza,pubblicato' }