--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es
Saludos companeros lo pude resolver de manera mas elegante y manteniendo las buenas practicas. Lo hice pasando el objeto a enlazar como parametro que se le pasa al objeto y realizando una consulta personalizada en el repositorio del elemento enlazado
El jun 3, 2012 10:20 a.m., "Marcelo Prizmic" <mpri...@gmail.com> escribió:
El 1 de junio de 2012 17:36, Ismael Ambrosi <ismaa...@gmail.com> escribió:
>
> Hola,
>
> Tengo que pedirte disculpas, pero estoy totalmente en desacuerdo con esta práctica. L...
tuve un problema similar y la documenación no recomendaba acceder al entitymanager desde el contructor de una entity, pero lo cierto es que yo, como en tu caso, necesitaba lógica ahí. No encontré una solución razonable.
La solución que proponés no parece elegante pero me parece que si la lógica la necesitás ahí, tampoco tiene mucho sentido darle vueltas innecesarias. Si tenés que ir de un punto a otro vas por la hipotenusa. No tiene mucho sentido recorrer los 2 catetos sólo porque es más elegante. De cualquier modo, no soy experto en SF2.
Marcelo
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para p...
Gran explicación Christian.Hay un caso bastante claro donde sí se inyecta el contenedor entero: en los controllers. Podrían haber hecho que en el routing se tuvieran que especificar los servicios a utilizar pero supongo que prefirieron simplificar para no espantar demasiado a los que empiezan con el framework ;)
On Friday, June 1, 2012 11:31:35 PM UTC+2, Christian Soronellas wrote:Hola Hely,Es una mala práctica pasar todo el contenedor de servicios cómo parámetro o en tu caso acceder a él desde el array de globals, no hay que hacerlo. Y mucho menos hacer que la entidades tengan acceso al mismo, pues se incumplen varios principios SOLID y las dependencias entre componentes (aka servicios), ya sean mandatorias o opcionales, dejan de ser explícitas y se pervierte el patrón. Ello comporta que dejes de tener visibilidad sobre qué es lo que necesita el servicio para poder ejecutarse y te sea imposible hacer unit test sobre el mismo. De hecho la recomendación oficial de Symfony2 al respecto del uso del contenedor de servicios, es evitar acoplar nuestro código con el contenedor (de hecho no hay ningún ejemplo, almenos que haya visto yo, en la documentación de Symfony2 que acople el contenedor de servicios)http://symfony.com/doc/current/components/dependency_injection/introduction.html#avoiding-your-code-becoming-dependent-on-the-container
En general (y no solo para Symfony2), una capa de servicios consta de varias subcapas: lógica de negocio o capa de servicio (en Symfony2 serían services y repositories, por ese orden) => capa entidades del modelo de dominio (en Symfony2 serían las Entities) => capa de acceso a datos (Doctrine 2 & PDO) => Data source (MySQL, Solr, MongoDB y un largo etc). Además debe cumplirse que un servicio debería poderse ejecutar tanto por CLI, como por el front de la aplicación o por dónde se quiera, por lo que no debe estar ligado a componentes intrínsecos a la request HTTP, a la request de CLI, etc.Adjunto aquí el enlace al patrón Service Layer, inicialmente propuesto por Randy Stafford en el libro de Patterns of Enterprise Application ArquitectureY por supuesto, Symfony2 por su arquitectura, te obliga un poco a no usar truquillos piratillas cómo el de la $GLOBALS['kernel'] y a usar algo más acorde con la OOP que ahora por ahora permite PHP en su actual versión. Esto es muy "phpquatro" !! :)Espero que te sirva!Un saludo!Christian.
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es
namespace AppBundle\Entity;
class Funcionario
{
private $conn;
public function __construct($idFuncionario)
{
// Aqui debo acceder al contenedor de servicio para crear la conexion $conn
$this->conn = $conn
$stmt = $conn->query("SELECT...");
//... crear el objeto funcionario
}$id = 1;
$funcionario = new Funcionario($id);
--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es
---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
#service.yml
miapp_listener_entityone_postload:
class: Miapp\EventListener\PostLoadEntityOne
arguments: ['@service_container'] # opcional
tags:
- { name: doctrine.event_listener, event: postLoad }
como argumento le paso contenedor de servicios, para poder llamar mas servicios detro si deseo.
cree la clasenamespace ....
use ....
class PostLoadEntityOne
{
private $container;
public function __construct(Container $container) {
$this->container = $container;
}
public function getSubscribedEvents()
{
return array(
'prePersist',
'preUpdate',
);
}
public function preUpdate(LifecycleEventArgs $args)
{
$this->miMetodo($args);
}
public function prePersist(LifecycleEventArgs $args)
{
$this->miMetodo($args);
}
....
ya con recibir a $args, puedo acceder a la entidad, (aunque debo validar que tipo de objeto me esta enviado)
public function miMetodo(LifecycleEventArgs $args)
{
$entity1 = $args->getEntity();
if ($entity1 instanceof ClassEntityOne)
{
# entidad 2 por defecto
$entity1->setEntidad2( $this->getEntidad2Default($args));
# o si en mi db asocio una entidad por defecto
$entity1->setEntidad2($this->getEntidad2DefaultFor($entity1,$args));
}
...
}
....
private function getEntidad2DefaultFor(ClassEntityOne $entity,
LifecycleEventArgs $args)
{
$em = $args->getEntityManager();
$repository = $em->getRepository('MiAppBundle:ClassEntityTow');
# puedo llamar otro evento
$this->container->get('event_dispatcher')->dispatch...
return $entity->getEntidad2();
}
Asi fue como solucione el problema, el codigo es desacoplado, y pued
// src/AppBundle/Controller/DefaultController.php // ... use AppBundle\Entity\Product; use Symfony\Component\HttpFoundation\Response; // ... public function createAction() { $product = new Product(); $product->setName('Keyboard'); $product->setPrice(19.99); $product->setDescription('Ergonomic and stylish!'); $em = $this->getDoctrine()->getManager(); // tells Doctrine you want to (eventually) save the Product (no queries yet) $em->persist($product); // actually executes the queries (i.e. the INSERT query) $em->flush(); return new Response('Saved new product with id '.$product->getId()); }
// src/AppBundle/Entity/Product.php namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="product") */ class Product { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\Column(type="string", length=100) */ private $name; /** * @ORM\Column(type="decimal", scale=2) */ private $price; /** * @ORM\Column(type="text") */ private $description; }
public function showAction($productId) { $product = $this->getDoctrine() ->getRepository('AppBundle:Product') ->find($productId); if (!$product) { throw $this->createNotFoundException( 'No product found for id '.$productId ); } // ... do something, like pass the $product object into a template }
--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+unsubscribe@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es
---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony-es+unsubscribe@googlegroups.com.