We have moved our forum to GitHub Discussions. For questions about Phalcon v3/v4/v5 you can visit here and for Phalcon v6 here.

Phalcon4: Error ModelBase, function getMessages()

Hola he migrado a Phalcon 4 y tengo el siguiente error en el Modelo Base, al tratar de configurar los mensajes, en la documentación aparece de la misma manera.

Ayuda por favor.

Declaration of Models\ModelBase::getMessages() must be compatible with Phalcon\Mvc\Model::getMessages($filter = NULL): array

mi modelo es:

<?php namespace Models; use \Phalcon\Mvc\Model;

class ModelBase extends Model {

public function getMessages()
{
    $messages = array();
    foreach (parent::getMessages() as $message) {
        switch ($message->getType()) {
            case 'InvalidCreateAttempt':
                $messages[] = 'El registro '.$message->getField().' no se puede crear porque ya existe.';
                break;
            case 'InvalidUpdateAttempt':
                $messages[] = 'El registro '.$message->getField().' no se puede actualizar porque ya existe.';
                break;
            case 'PresenceOf':
                $messages[] = 'El campo ' . $message->getField() . ' es obligatorio.';
                break;
        }
    }
    return implode("\n",$messages);
}

}



8.4k
edited Apr '20

you must comply with the overriden method Phalcon\Mvc\Model::getMessages()

you must have $filer = null and return value must be an array

public function getMessages($filter = null): array
{
    $messages = array();
    foreach (parent::getMessages() as $message) {
        switch ($message->getType()) {
            case 'InvalidCreateAttempt':
                $messages[] = 'El registro '.$message->getField().' no se puede crear porque ya existe.';
                break;
            case 'InvalidUpdateAttempt':
                $messages[] = 'El registro '.$message->getField().' no se puede actualizar porque ya existe.';
                break;
            case 'PresenceOf':
                $messages[] = 'El campo ' . $message->getField() . ' es obligatorio.';
                break;
        }
    }
    // return implode("\n",$messages);
    return $messages; // must return array
}

Hola talal424,

gracias por responder a mi problema, he modificado según lo que indicas y ya no me genera error pero ahora esa función no rescata el error porque he generado un error en forma manual y no captura el tipo de error. Te agradezco de antemano tu ayuda.

la llamada en el error es:

if ($registro->create()==false){
    throw new Exception($registro->getMessages());
}


8.4k
Accepted
answer
edited Apr '20

maybe its because the error isn't caught by switch since it doesnt have a default case

public function getMessages($filter = null): array
{
    $messages = array();

    foreach (parent::getMessages() as $message) {

        switch ($message->getType()) {

            case 'InvalidCreateAttempt':
                $messages[] = 'El registro '.$message->getField().' no se puede crear porque ya existe.';
                break;

            case 'InvalidUpdateAttempt':
                $messages[] = 'El registro '.$message->getField().' no se puede actualizar porque ya existe.';
                break;

            case 'PresenceOf':
                $messages[] = 'El campo ' . $message->getField() . ' es obligatorio.';
                break;

            default:
                $messages[] = $message->getMessage();
        }
    }

    return $messages;
}

the return from getMessages() is array so you should change that to

if ($registro->create() == false) {
    throw new Exception(implode("\n", $registro->getMessages()));
}

excelente, muchas gracias!., tienes razon, no esta capturando el error de duplicidad.

Saludos