Secciones

Validación del Modelo


Resumen

Phalcon\Mvc\Model proporciona varios eventos para validar datos e implementar reglas de negocio.

<?php

namespace MyApp\Models;

use Phalcon\Mvc\Model;
use Phalcon\Validation;
use Phalcon\Validation\Validator\Uniqueness;

class Customers extends Model
{
    public function validation()
    {
        $validator = new Validation();

        $validator->add(
            'cst_email',
            new Uniqueness(
                [
                    'message' => 'The customer email must be unique',
                ]
            )
        );

        return $this->validate($validator);
    }
}

Integridad de Datos

La integridad de datos es esencial en cada aplicación. Puede implementar validadores en sus modelos para introducir otra capa de validación, de modo que se pueda asegurar que los datos que se almacenan en su base de datos cumplen sus reglas de negocio.

El eventos especial validation nos permite llamar validadores integrados sobre el registro. Phalcon expone validadores integrados adicionales que se pueden usar en esta fase de validación. Todos los validadores disponibles están bajo el espacio de nombres Phalcon\Validation.

<?php

namespace MyApp\Models;

use Phalcon\Mvc\Model;
use Phalcon\Validation;
use Phalcon\Validation\Validator\Uniqueness;
use Phalcon\Validation\Validator\InclusionIn;

class Invoices extends Model
{
    public function validation()
    {
        $validator = new Validation();

        $validator->add(
            'inv_status_flag',
            new InclusionIn(
                [
                    'domain'  => [
                        'Paid',
                        'Unpaid',
                    ],
                    'message' => 'The invoice must be ' .
                                 'either paid or unpaid',
                ]
            )
        );

        $validator->add(
            'inv_number',
            new Uniqueness(
                [
                    'message' => 'The invoice number must be unique',
                ]
            )
        );

        return $this->validate($validator);
    }
}

El ejemplo anterior realiza una validación usando el validador integrado Phalcon\Validation\Validator\InclusionIn. Comprueba el valor del campo inv_status_flag en una lista de dominios. Si el valor no está incluido en el método entonces el validador fallará y devolverá false.

NOTA: Para más información sobre validadores, ver la documentación de Validación

Mensajes

Phalcon\Mvc\Model usa la colección Phalcon\Messages\Messages para almacenar cualquier mensaje de validación que se haya generado durante el proceso de validación.

Cada mensaje es una instancia de Phalcon\Messages\Message y el conjunto de mensajes generado se puede recuperar con el método getMessages(). Cada mensaje proporciona información adicional como el nombre del campo que ha generado el mensaje o el tipo de mensaje:

<?php

if (false === $invoice->save()) {
    $messages = $invoice->getMessages();

    foreach ($messages as $message) {
        echo 'Message: ', $message->getMessage();
        echo 'Field: ', $message->getField();
        echo 'Type: ', $message->getType();
    }
}

Phalcon\Mvc\Model puede generar los siguientes tipos de mensajes de validación:

Tipo Generado cuando
ConstraintViolation Un campo, parte de una clave ajena virtual, está intentando insertar/actualizar un valor que no existe en el modelo referenciado
InvalidCreateAttempt Se Intenta crear un registro que ya existe
InvalidUpdateAttempt Se intenta actualizar un registro que no existe
InvalidValue Un validador falla a causa de un valor inválido
PresenceOf Un campo con un atributo no nulo en la base de datos está intentando insertar/actualizar un valor nulo

El método getMessages() se puede anular en un modelo para reemplazar/traducir los mensajes por defecto generados automáticamente por el ORM:

<?php

namespace MyApp\Models;

use Phalcon\Mvc\Model;

class Invoices extends Model
{
    public function getMessages()
    {
        $messages = [];

        foreach (parent::getMessages() as $message) {
            switch ($message->getType()) {
                case 'InvalidCreateAttempt':
                    $messages[] = 'The record cannot be created '
                                . 'because it already exists';
                    break;

                case 'InvalidUpdateAttempt':
                    $messages[] = "The record cannot be updated '
                                . 'because it doesn't exist";
                    break;

                case 'PresenceOf':
                    $messages[] = 'The field ' 
                                . $message->getField() 
                                . ' is mandatory';
                    break;
            }
        }

        return $messages;
    }
}

Eventos Fallidos

Hay disponibles eventos adicionales cuando el proceso de validación de datos encuentra cualquier inconsistencia:

Operación Nombre Explicación
Insertar o actualizar notSaved Se dispara cuando la operación de INSERT o UPDATE falla por alguna razón
Insertar, borrar o actualizar onValidationFails Se dispara cuando cualquier operación de manipulación de datos falla

Personalizado

El documento de validación explica en detalle cómo puede crear sus propios validadores. Puede usar dichos validadores y reutilizarlos entre varios modelos. Un validador también puede ser tan simple como:

<?php

namespace MyApp\Models;

use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Message;

class Invoices extends Model
{
    public function validation()
    {
        if ('Unpaid' === $this->inv_type_flag) {
            $message = new Message(
                'Unpaid invoices are not allowed',
                'inv_type_flag',
                'UnpaidInvoiceType'
            );

            $this->appendMessage($message);

            return false;
        }

        return true;
    }
}