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

Chequear si un servicio fue arrancado en Pimple

27 de octubre de 2015

Hola!

Estoy tratando de ver cómo evaluar si un servicio fue arrancado por Pimple, SIN arrancarlo. He buscado, y probado muchas cosas como

if (isset($container->raw['database']) )
if (isset($pimple->keys['database']) )

Sin que funcione...

El caso real es de un proveedor de servicio de base de datos en el que quiero desconectar de la base de datos sólo si el servicio fue invocado (método shutdown).

A continuación, el código de la clase con el proveedor de servicio de base de datos (de producción propia)

class DatabaseServiceProvider implements ServiceProviderInterface
{
    public function register(Container $pimple)
    {
        // Conexión con la base de datos y el driver especificado
        $pimple['database'] = function($pimple) {
            $server = ""; $database = ""; $user = ""; $password = "";
            $driver = "";
            if ( $pimple['db.server'] ) $server = $pimple['db.server'];
            if ( $pimple['db.dbname'] ) $database = $pimple['db.dbname'];
            if ( $pimple['db.user'] ) $user = $pimple['db.user'];
            if ( $pimple['db.password'] ) $password = $pimple['db.password'];
            if ( $pimple['db.driver'] ) $driver = $pimple['db.driver'];
 
            $class = "Acme\\Database" . ucfirst($driver);
            $database = new $class($server, $user, $password);
            $database->selectDatabase($database);
            return $database;
        };
 
    }
 
    public function shutdown(Container $pimple) 
    {
                // Si el servicio de base de datos está ARRANCADO => lo paramos
                // ** AQUI es dónde necesito saber evaluar si el servicio fue arrancado o invocado. **
        if ( isset($pimple->keys['database']) ) {
            $pimple['database']->disconnect();
            echo('<p><h2>DDBB SERVICE -> Detenido</h2>');
        }
    }
 
}

Sé que podría añadir una propiedad 'private $arrancado' a la clase Proveedor que se seteara a 'true' al arrancar para posteriormente evaluarlo, pero me gustaría saber cómo se hace como estoy preguntando.

Si alguien tiene una idea... Muchas gracias!


Respuestas

#1

La respuesta la puedes encontrar en el propio código fuente de Silex. En concreto, fíjate en SwiftmailerServiceProvider.

Primero declara una propiedad initialized:

$app['mailer.initialized'] = false;

Luego la pone a true cuando se crea el servicio:

$app['mailer'] = $app->share(function ($app) {
    $app['mailer.initialized'] = true;
    // ...
 
    return new \Swift_Mailer($transport);
});

Por último, en el método boot() se comprueba el valor de esta variable para decidir si se hacen cosas o no, que es justo tu mismo caso:

public function boot(Application $app)
{
    $app->finish(function () use ($app) {
        // To speed things up (by avoiding Swift Mailer initialization), flush
        // messages only if our mailer has been created (potentially used)
        if ($app['mailer.initialized'] && $app['swiftmailer.use_spool'] && $app['swiftmailer.spooltransport'] instanceof \Swift_Transport_SpoolTransport) {
            $app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']);
        }
    });
}

@javiereguiluz

27 octubre 2015, 19:55
#2

Gracias Javier

Es cierto, muchas veces la respuesta está 'ahí mismo' en código ya funcionando y que solemos tener cerca. Pensaba que podía evaluarse sin añadir variables o parámetros... bueno tomaré del ejemplo la manera para incorporarlo a mi caso.

Muchas gracias, como siempre por tu ayuda.

@mabuitragor

27 octubre 2015, 20:47