J'ai donc dû surcharger les getter/setter magique de Doctrine pour ça:

// plugins/NairusPlugin/lib/model/doctrine/PluginNairus.class.php
abstract class PluginNairus extends BaseNairus
{
  /**
   * Returns the array representation of the validator_messages field.
   *
   * @return array
   */
  public function getValidatorMessages()
  {
    return json_decode($this->_get('validator_messages'), true);
  }

  /**
   * Set the array representation of the validator_messages field into a string serialized.
   *
   * @param  array $options
   * @return void
   */
  public function setValidatorMessages($options)
  {
    if( is_array($options) )
    {
      $this->_set('validator_messages', json_encode($options));
    }
  }
}

Note:  Dans l'exemple ci-dessus je n'ai pas mis toute la logique volontairement.
J'ai uniquement implémenter la personnalisation des messages.
On peut très bien imaginer que l'on aura aussi besoin de la même architecture pour créer et configurer les options et les attributs des wigdets.

2 points importants sont à préciser:

  1. Dans la méthode "json_decode", il faut passer le 2ème paramètres à "true" pour renvoyer un tableau indéxé.
  2. Pour que les "accessors" surchargés soient bien pris en compte, il faut appeler les méthodes explicites "_get/_set" sinon la modification sur l'objet ne se fait pas.

Quelques tests unitaires pour s'assurer que tout marche bien...

<?php
// plugins/nairusPlugin/test/unit/model/NairusTest.php
include(dirname(__FILE__).'/../../../bootstrap/unit.php');
$t = new lime_test(2, new lime_output_color());
$messages = array('required' => 'Champ obligatoire.', 'invalid' => 'Champ non valide.');
$record = new Nairus();
$record->setValidatorMessages($messages);
$t->comment('$record->isValid()');
$t->ok($record->isValid(), '3.1 The record must be valid');
$t->comment('$record->save()');
$record->save();
$t->is($record->getValidatorMessages(), $messages, '4.1 the validator_messages field must be well setted.');

NOTE: Pour écrire les tests unitaires dans le plugin et les lancer dans le projet symfony, il suffit de faire un lien symbolique du répertoire de test du plugin vers celui de l'application.

nairus$ ln -s plugins/nairusPlugin/test/unit test/unit/nairusPlugin

Et voilà, le tour est joué!

A++
NairuS