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

Cómo crear eventos en Symfony

29 de octubre de 2014

Hola, estoy intentando utilizar eventos con Symfony. He seguido lo que indica la documentación creando un subscriber, pero no entra en el. Lo que quiero hacer es que cuando actualiza la entidad Carrito (esta clase es plana, no tiene nada que ver con la base de datos, solo la uso para la session) alguna de sus líneas y esta la pone con cantidad 0, elimine la línea del carrito.

/**
 * Class CartEvent
 * @package Escuela\TiendaBundle\Event
 */
class CartEvent extends Event
{
    protected $cart;
 
    /**
     * @param Cart $cart
     */
    public function __construct(Cart $cart)
    {
        $this->cart = $cart;
    }
 
    /**
     * @return Cart
     */
    public function getCart()
    {
        return $this->cart;
    }
}
/**
 * Class CartSubscriber
 * @package Escuela\TiendaBundle\EventListener
 */
class CartSubscriber implements EventSubscriberInterface
{
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return array(
            CartEvents::UPDATE_CARTLINES => array('onCartUpdate', 1)
        );
    }
 
    /**
     * @param CartEvent $event
     */
    public function onCartUpdate(CartEvent $event)
    {
        $cart = $event->getCart();
 
        $cartLines = $cart->getCartLines();
        foreach($cartLines as $cartLine){
            if($cartLine->getCantidad() == 0){
                $cart->removeCartLine($cartLine);
            }
        }
    }
}
tienda.listener.cart:
    class: Escuela\TiendaBundle\EventListener\CartSubscriber
    tags:
        - { name: kernel.event_subscriber }

Controlador donde lo lanzo

$dispatcher = $this->container->get('event_dispatcher');
$cartSubscriber = new CartSubscriber($carrito);
$dispatcher->addSubscriber($cartSubscriber);

Respuestas

#1

En el código que nos has pasado faltarían dos cosas y sobraría una. La cosa que sobra es el último listado de código que has puesto y que dices que utilizas en el controlador. La gracia de definir el servicio tienda.listener_cart con la etiqueta kernel.event_susbcriber es que Symfony se encarga de registrar tu subscriber automáticamente. Así que puedes eliminar todas esas líneas.

Después, la primera cosa que falta es la clase CartEvents, que supongo que está bien porque es trivial.

Por último, la segunda cosa que te falta es el código que lanza los eventos. El código que has mostrado se encarga de escuchar eventos, pero falta que alguien lance los eventos. Para ello, utiliza un código como el siguiente en tu controlador:

$event = new CartEvent($cart);
$this->get('event_dispatcher')->dispatch(CartEvents::UPDATE_CARTLINES, $event);

@javiereguiluz

29 octubre 2014, 15:30
#2

Muchas gracias!! me arrodillo ante tus conocimientos!! me funciono por fin!!!

Pd: La clase 'CartEvents' la tengo hecha, como es muy sencilla no la había puesto.

Saludos

@AlbertoVioque

29 octubre 2014, 20:43