Vérifier l'unicité d'un champ avec Zend Framework

Question : comment vérifier, lors de la soumission d'un formulaire, qu'une valeur n'est pas déjà présente en base ?

Rappel : avec CakePHP, une règle existe déjà de base pour effectuer ce type de vérification :

var $validate = array(
'monchamp' => array(
'rule' => 'isUnique',
'message' => 'Nom déjà utilisé'
));

Solution : et maintenant, la solution que j'ai pondue (testée mais bon, on est pas à l'abri des erreurs alors si vous en voyez, hésitez pas à me le signaler).

require_once 'Zend/Validate/Abstract.php';
require_once 'Zend/Db/Table/Abstract.php';

class Fxc_Validate_Unique
extends Zend_Validate_Abstract
{
const ALREADY_EXISTS = 'alreadyExists';

protected $_modelName;
protected $_tableName;
protected $_fieldName;
protected $_rowPk;

protected $_messageVariables = array(
'table' => '_tableName',
'field' => '_fieldName'
);

protected $_messageTemplates = array(
self::ALREADY_EXISTS => "'%value%' already exists in: '%table%.%field%'",
);

/**
* Initialise les attributs
*
* @param string $modelName Nom du modèle
* @param string $fieldName Nom du champ
* @param array $rowPk Valeurs permettant d'identifier l'enregistrement en cours de modification
*/
public function __construct($modelName, $fieldName, Array $rowPk = array())
{
$this->_modelName = (string)$modelName;
$this->_fieldName = (string)$fieldName;
$this->_rowPk = $rowPk;
}

/**
* Vérifie que $this->_tableName.$this->_fieldName ne contient pas déjà la valeur $value
*
* @param string $value
* @return boolean
*/
public function isValid($value)
{
$this->_setValue((string)$value);

$table = new $this->_modelName(); // je suppose que ça plante ici si l'autoload n'est pas activé
$this->_tableName = $table->info(Zend_Db_Table_Abstract::NAME);
$tablePk = $table->info(Zend_Db_Table_Abstract::PRIMARY);

$select = $table->select()->where($this->_fieldName . ' = ?', $value);

// si la vérification concerne un enregistrement en cours de modification
if (array() !== $this->_rowPk) {
// on indique de ne pas prendre en compte cet enregistrement dans la recherche
foreach ($tablePk as $pk) {
if (isset($this->_rowPk[$pk])) {
$select->where($pk . ' != ?', $this->_rowPk[$pk]);
} else {
throw new Exception('Fxc_Validate_Unique: a primary key value is missing');
}
}
}

$row = $table->fetchRow($select);

if ($row === null) {
return true;
} else {
$this->_error(self::ALREADY_EXISTS);
return false;
}
}
}

On a pas accès aux autres données soumises via le formulaire donc il faut savoir en amont si on est en ajout ou en modif. Si on est en modif, passer au validateur les valeurs de clés primaires...

y a pas à dire, au niveau de la partie Modèle, CakePHP écrase très largement ZF (avis fondé sur d'autres expériences que ce simple exemple, je vous rassure)

ouch !

ça donne pas envie de passer à ZF !
c'est le fan de CakePHP qui parle ;)