Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Memoria agotada al renderizar form collection

24 de abril de 2015

Hola.

Tengo un formulario con un campo collection de tipo ListadoDetallesType(). Este type de formulario tiene 22 campos, hasta aquí todo bien. El problema viene cuando quiero editar mas de un registro al mismo tiempo, pasando a:

$form = $this->createForm(new DetallesType(), $detalles);

Al hacer esto, cuando los detalles son mas de 30, obtengo el siguiente error:

OutOfMemoryException in Profile.php line 143:
Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2779493 bytes)

He notado que el problema se de debe al numero de campos de ListadoDetallesType(), porque si le dejo por ejemplo 5 campos no hay problema.

Para pasarle el array de objectos $detalles a createForm me he guiado con un ejemplo que hay aca: http://sf2.showmethecode.es/app.php/ejemplo/forms/user/edit

El codigo resumido es:

$detalles = $this->get('detalles_repository')->findUltimosDetalles(15);
$detallesContainer = new \AppBundle\Form\Model\Detalles($detalles);
 
$form = $this->createForm(new DetallesType(), $detalles);

Y la clase Detalles es:

namespace AppBundle\Form\Model;
 
use Symfony\Component\Validator\Constraints as Assert;
 
class Nota
{
    /**
     * @Assert\Valid()
     */
    public $notas;
 
    public function __construct($notas)
    {
        $this->notas = $notas;
    }
}

DetallesType.php:

...
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('detalles', 'collection', [
            'type' => new ListadoDetallesType(),
        ])
    ;
}
...

ListadoDetallesType.php:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('detalle1', null, [])
        .... // 22 campos mas
    ;
}

En la plantilla twig:

<form method="POST" role="form" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <button type="submit" class="btn btn-success">Guardar</button>
</form>

Al final esto se renderiza asi: http://postimg.org/image/vnuwn1ubf/

¿Qué debo hacer para evitar ese error? ¿O debo hacer este tipo de formulario de otra manera?

Espero que me puedan ayudar.

Gracias.


Respuestas

#1

Me parece que no va a tener buena solución el problema que planteas. Dices que estás usando unos 30 registros con 22 campos cada uno, lo que hace un total de 660 campos en el formulario. Como el servidor tiene "solo" 128 MB para PHP, creo que lo único que podrías hacer es aumentar la memoria disponible. No se cómo podrías optimizar de otra manera el formulario si no es eliminando registros o campos.

@javiereguiluz

29 abril 2015, 9:06
#2

Gracias por tu respuesta Javier, una duda adicional, estaria bien ampliar la memoria de PHP, el server tiene 4GB de memoria RAM.

Gracias.

@ramiroanacona

29 abril 2015, 21:06
#3

Soy de los que cree que se puede aumentar la memoria de PHP bastante sin causar ningún problema. La mayoría de páginas que sirvas con Symfony van a consumir menos de 10 MB. Pero puntualmente algunas aplicaciones PHP, como Composer, o algunos script sd econsola, o formularios gigantescos como el que propones van a requerir muchísima memoria. Así que puedes ampliarlo sin problemas a 256 MB o incluso 512 MB porque sabes seguro que el 99% de las veces no se va a usar tanta memoria, por lo que no va a afectar a tu servidor.

@javiereguiluz

29 abril 2015, 22:00