Más con Symfony

6.5. Refactorizando

Aunque el formulario anterior funciona como se esperaba, es mejor refactorizar un poco su código para facilitar la creación de pruebas unitarias y para que el código sea fácilmente reutilizable.

En primer lugar se aprovecha el código anterior para crear un nuevo formulario que represente a una colección de ProductPhotoForm:

// lib/form/doctrine/ProductPhotoCollectionForm.class.php
class ProductPhotoCollectionForm extends sfForm
{
  public function configure()
  {
    if (!$product = $this->getOption('product'))
    {
      throw new InvalidArgumentException('You must provide a product object.');
    }

    for ($i = 0; $i < $this->getOption('size', 2); $i++)
    {
      $productPhoto = new ProductPhoto();
      $productPhoto->Product = $product;

      $form = new ProductPhotoForm($productPhoto);

      $this->embedForm($i, $form);
    }
  }
}

Este formulario require dos opciones:

  • product: el producto para el que se crea una colección de ProductPhotoForm
  • size: el número de ProductPhotoForm que se crean (por defecto so dos)

Ahora se puede modificar el método configure() de ProductForm de la siguiente forma:

// lib/form/doctrine/ProductForm.class.php
public function configure()
{
  $form = new ProductPhotoCollectionForm(null, array(
    'product' => $this->getObject(),
    'size'    => 2,
  ));

  $this->embedForm('newPhotos', $form);
}