Más con Symfony

14.4. Aplicando la configuración YAML

La forma más sencilla de aplicar esta configuración YAML a cada formulario consiste en cargarla en un array y después recorrer cada configuración:

public function enhance(sfForm $form)
{
  $config = sfYaml::load(sfConfig::get('sf_config_dir').'/forms.yml');

  foreach ($config as $class => $fieldConfigs)
  {
    if ($form instanceof $class)
    {
      foreach ($fieldConfigs as $fieldName => $fieldConfig)
      {
        if (isset($form[$fieldName]))
        {
          if (isset($fieldConfig['label']))
          {
            $form->getWidget($fieldName)->setLabel($fieldConfig['label']);
          }

          if (isset($fieldConfig['attributes']))
          {
            $form->getWidget($fieldName)->setAttributes(array_merge(
              $form->getWidget($fieldName)->getAttributes(),
              $fieldConfig['attributes']
            ));
          }

          if (isset($fieldConfig['errors']))
          {
            foreach ($fieldConfig['errors'] as $code => $msg)
            {
              $form->getValidator($fieldName)->setMessage($code, $msg);
            }
          }
        }
      }
    }
  }
}

Esta solución tiene varios problemas. En primer lugar, los archivos YAML se leen desde el sistema de archivos y se cargan en un objeto de tipo sfYaml cada vez que se aplica la configuración a un formulario. Para mejorar el rendimiento de la aplicación deberíamos evitar tantos accesos al sistema de archivos. En segundo lugar, el rendimiento también se verá penalizado por la cantidad de bucles y condiciones del código. La solución de estos dos problemas consiste en utilizar la cache de configuración de Symfony.