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

Pasar servicio como parámetro

28 de enero de 2015

Hola, estoy intentando hacer una cosa pero no me sale. Se que lo que estoy haciendo es multiplicarme el trabajo, pero todo es para aprender.

Estoy intentado hacer una especie de gestor de mailing. Para ello quería hacerlo de manera que no dependiese de Swifmailer, por lo que pensé en hacerlo mediante patrón Adapter. Esto lo tengo más o menos hecho: tengo un servicio que es el que contiene el que se utiliza para enviar correos y demás cosas.

El caso es que claro, al servicio este le mando el adapter elegido pero quiero poder hacer que sea fácil de cambiar de adapter. Creo el servicio así ahora mismo:

prueba_mail:
    class: %prueba_mail.class%
    arguments:
        mailer.adapter: @swift_mailer_adapter

Pero me gustaría hacer que fuese de esta manera:

En mi bundle:

parameters:
    prueba_mail.class: "Clase\\servicio"

services: 
    prueba_mail:
        class: %prueba_mail.class%
        arguments:
            mailer.adapter: %mailer_adapter%

Y luego quien use el bundle y quiera cambiar a otro "motor de correo" que ponga en su config:

parameters:
    mailer_adapter: "@miMailAdapter"

Pues esto no se hacerlo porque no funciona así, y también quiero que tenga un valor por defecto mailer_adapter ya que el bundle funcionara con Swiftmailer por defecto.

En fin, hay alguna manera de enviar un servicio dentro de un parámetro y que este tenga un valor por defecto (esto he visto como se hace, pero pasa lo mismo que si hago lo de arriba, que manda la cadena de texto y no el servicio)

Saludos.


Respuestas

#1

Buenas,

Generalmente para eso se usan "compiladores del contenedor" (compiler passes), pero también lo puedes hacer fácilmente con el lenguajes de expresiones implementado desde Symfony 2.4 con algo como:

parameters:
    mailer_adapter: swift_mailer_adapter # Valor por defecto del adapter

services:
    prueba_mail:
        class: %prueba_mail.class%
        arguments:
            mailer.adapter: @=service(parameter('mailer_adapter'))

Más información acá:

Usando ExpresionLanguage en la definición de Servicios

Saludos!

@manuel_j555

28 enero 2015, 22:06
#2

@AlbertoVioque lo primero que me gustaría preguntarte es si realmente necesitas crear algo así. Por supuesto tu idea es muy correcta y lo que comentas es lo que se debe hacer en aplicaciones profesionales. Pero si las posibilidades reales de que en esta aplicación se utilice otro mailer distinto a SwiftMailer son nulas, entonces estarías trabajando de más sin motivo.

Al margen de este comentario, una de las posibles soluciones de este problema es la que te comenta @manuel_j555 sobre los compiler passes. Otra solución que quizás te interese investigar es usar una factoría para crear los servicios.

@javiereguiluz

29 enero 2015, 9:17
#3

Hola, gracias a los dos por la respuesta, investigaré las tres maneras que comentáis y ya os contaré.

Sobre si realmente necesito eso, la verdad es que no, no necesito esto, pero es que lo que estoy haciendo tampoco, es un proyecto personal que intento hacer todo lo bien posible con el único fin de aprender cosas, aprender más a fondo como programar, y la única manera que veo es haciendo algo complicado, que me haga pensar de otra manera a como programo actualmente.

La idea es hacer una especie de Mailchimp, en Symfony, y quiero intentar hacerlo "bien", pero sin compromisos jaja, si puedo lo hago sino tengo tiempo pues nada, mi objetivo es aprender.

Ya he visto que crear un Adapter es multiplicar el trabajo bastante, pero bueno, así veo otras cosas como el problema que indico.

@AlbertoVioque

29 enero 2015, 9:49
#4

Hola, al final he tirado por lo más sencillo, lo que dijo @manuel_j555 de lenguajes de expresiones, ya que he intentado crear con una factoría pero tenía el problema con que a mi mailer_adapter necesitaba pasarle el servicio de swiftmailer, y estaba en las mismas.

Saludos

@AlbertoVioque

29 enero 2015, 20:33