type querybuilder isvalid form collection php symfony doctrine2 symfony-forms

php - querybuilder - Cómo hacerlo: ¿Optimizar el rendimiento de las formas de Symfony?



symfony form validation (2)

El comportamiento descrito se ve como el trabajo del adivinador. Tengo la sensación de que es necesario mostrar un código adicional (oyentes, VariantType , VariantType , PartnerType ).

Supongamos que una clase tiene una variant asociación a Variant y FormType para esta clase tiene un código ->add(''variant'') sin un tipo de especificación explícito (como veo, hay muchos lugares donde no se especifica el tipo). Entonces DoctrineOrmTypeGuesser viene en el juego.

https://github.com/symfony/symfony/blob/2.7/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php#L46

Este código asigna el tipo de entity (!) A este niño. Se EntityRepository::findAll() y todas las variantes de DB están hidratadas.

En cuanto a otras formas de optimización de forma:

  • Intente especificar el tipo en todos los casos posibles para evitar un tipo adivinar;
  • Use SELECT con JOIN para obtener un pedido a medida que se envían nuevas subpeticiones a DB para establecer un dato subyacente para cada relación de mapas de formulario;
  • Conservar las claves para los elementos de la colección en una presentación, ya que la eliminación de un único elemento sin la preservación de las claves activará las actualizaciones innecesarias.

Tengo un formulario que es el cuello de botella de mi solicitud de ajax.

$order = $this->getDoctrine() ->getRepository(''AcmeMyBundle:Order'') ->find($id); $order = $order ? $order : new Order(); $form = $this->createForm(new OrderType(), $order); $formView = $form->createView(); return $this->render( ''AcmeMyBundle:Ajax:order_edit.html.twig'', array( ''form'' => $formView, ) );

Para obtener un código más limpio stopwatch declaraciones del stopwatch .

Mi OrderType tiene los siguientes campos:

$builder ->add(''status'') // enum (string) ->add(''paid_status'') // enum (string) ->add(''purchases_price'') // int ->add(''discount_price'') // int ->add(''delivery_price'') // int ->add(''delivery_real_price'', null, array(''required'' => false)) // int ->add(''buyer_name'') // string ->add(''buyer_phone'') // string ->add(''buyer_email'') // string ->add(''buyer_address'') // string ->add(''comment'') // string ->add(''manager_comment'') // string ->add(''delivery_type'') // enum (string) ->add(''delivery_track_id'') // string ->add(''payment_method'') // enum (string) ->add(''payment_id'') // string ->add(''reward'') // int ->add(''reward_status'') // enum (string) ->add(''container'') // string ->add(''partner'') // Entity: User ->add(''website'', ''website'') // Entity: Website ->add(''products'', ''collection'', array( // Entity: Purchase ''type'' => ''purchase'', ''allow_add'' => true, ''allow_delete'' => true, ''by_reference'' => false, ''property_path'' => ''purchases'', ''error_bubbling'' => false, ));

Tipo de compra :

$builder ->add(''amount'') ->add(''price'') ->add(''code'', ''variant'', array( ''property_path'' => ''variantEntity'', ''data_class'' => ''/Acme/MyBundle/Entity/Simpla/Variant'' )) ;

Además, el tipo de compra tiene un oyente que no es significativo aquí. Se representa en el generador de perfiles de Symfony a continuación como variant_retrieve , purchase_form_creating . Puedes ver que demora unos 200 ms.

Aquí pongo el resultado de los profilers:

Como puede ver: $this->createForm(...) toma 1011ms, $form->createView(); toma 2876ms y el renderizado de formas en ramas también es muy lento: 4335ms. Según lo indicado por blackfire profiler todo el trato en ObjectHydrator::gatherRowData() y UnitOfWork::createEntity() .

El método createEntity() llamó 2223 veces porque hay algún campo que se correlacionó con la entidad Variant y tiene el tipo de formulario Entity . Pero como puede ver en el código anterior, no hay tipos de entity para la variante. Mi VariantType es un tipo de formulario de text extendido simple que tiene modelTransformer . Para no estropear todo, puede ver el código para la clase Type similar en los docs .

Encontré con XDebug que buildView for VariantType ha sido llamado en buildView con el tipo de formulario de text . Pero después de eso, desde algún lugar se llamó de nuevo a buildView for VariantType y en este caso tiene el tipo de formulario de entity . ¿Cómo puede ser posible? Traté de definir la matriz vacía en las choices y las choices preferred_choices en cada uno de los tipos de formularios, pero no cambió nada. ¿Qué debo hacer para evitar que EntityChoiceList se cargue para mi formulario?


También tuve el mismo problema con el tipo de entidad, necesitaba enumerar ciudades, había como mire y 4000, básicamente lo que hice fue inyectar las opciones en el formulario. En su controlador, pregunte a las variantes desde la base de datos, en una llamada al repositorio, hidrátelas como matriz, y seleccione solo la identificación y el nombre, o título, y luego pase al formulario, como valor de las opciones. Con esto, la parte de la base de datos será mucho más rápida.