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

Servicios, configuración y acceso a constructor en tiempo de ejecución

7 de julio de 2015

Hola:

Hoy vengo con una pregunta algo compleja, os cuento. Tengo una clase dado, su idea es, como es obvio, hacer tiradas de dados. Lo que hace es lo siguiente:

  • 1d6 --> lanza un dado de seis
  • 2d12 --> lanza dos dados de doce y suma sus resultados.

La clase que tengo ahora, ya se que tengo que configurar bien los gets y sets, es esta:

class DadosService
{
    public $caras, $veces;
 
    public function setDice($dado)
    {
        $dado = strtolower($dado);
        $dado = explode('d',$dado);
 
        $this->veces = $dado[0];
        $this->caras = $dado[1];
 
        return $this;
 
    }
 
    public function rolDice()
    {
        $total = 0;
        for ($i=1;$i <= $this->veces; $i++)
        {
            $total =+ rand(1,$this->caras);
 
        }
 
        return $total;
    }
 
}

Y me funciona de manera cojonuda:

$this->get('dados')->setDice('2d100')->rolDice();

Mis dudas son:

  • ¿Puedo acceder al constructor en tiempo de ejecución del servicio o bien tengo que configurarlo obligatoriamente cuando lo configuro?

  • En el caso que quiera pesarle los datos, de la base de datos, aparte del "entity manager", hay alguna manera de pasarle directamente una query con los datos o bien habria que hacerla en el propio servicio (No se si me ha quedado claro y me imagino la respuesta esta preguna, la consulta dentro del servicio).

  • Como puedo pasarle los datos de configuración del archivo config.yml (o similar)

Espero haber sido claro en mis preguntas, si necesitais que concrete más, simplemente pedidlo.

Saludos


Respuestas

#1

No me han quedado del todo claras tus preguntas, pero allá van algunas respuestas:

1) ¿Puedo pasarle la consulta? Lo que te aconsejo es que en vez de pasar todo el entity manager y después hacer la consulta, le pases solo el repositorio de la entidad relacionada con este servicio. Como le pasas el repositorio, la consulta no tienes que hacerla explícitamente, sino que basta con invocar el método adecuado del repositorio propio.

Para definir el servicio que representa a un repositorio de Doctrine:

# app/config/services.yml
services:
    app.dice_repository:
        class:     Doctrine\ORM\EntityRepository
        factory:   ["@doctrine.orm.entity_manager", getRepository]
        arguments: [AppBundle\Entity\Dice]

Y luego lo inyectas como cualquier otro servicio:

# app/config/services.yml
services:
    app.mi_servicio:
        class: ...
        arguments: [@app.dice_repository, ...]

2) ¿Cómo le paso la configuración de config.yml? Inyectando los parámetros que quieras pasar:

# app/config/services.yml
services:
    app.mi_servicio:
        class: ...
        arguments: ["%framework.secret%", "%doctrine.dbal.dbname%", ...]

@javiereguiluz

7 julio 2015, 22:48
#2

Entiendo, muchas gracias. Voy a hacer las pruebas y a ver qué sale. Muchas gracias.

Edit: Me has respondido justo lo que quería, muchas gracias en ocasiones es un poco complejo expresarse bien para fuera de mi cabeza suene coherente.

Saludos

@TsubasaAkai

7 julio 2015, 23:24