Silex, el manual oficial

6.1. Proveedores de servicios

6.1.1. Cargando los proveedores

Para cargar un proveedor de servicio y así poder utilizarlo, debes registrarlo primero en la aplicación utilizando un código como el siguiente:

$app = new Silex\Application();

$app->register(new Acme\DatabaseServiceProvider());

También puedes pasar parámetros de configuración como segundo argumento del método register(). Estos parámetros se añaden después de registrar el servicio pero antes de que se inicie:

$app->register(new Acme\DatabaseServiceProvider(), array(
    'database.dsn'      => 'mysql:host=localhost;dbname=myapp',
    'database.user'     => 'root',
    'database.password' => 'secret_root_password',
));

6.1.2. Convenciones

Cuando trabajas con proveedores de servicios debes prestar atención al orden en el que haces determinadas cosas. Así que procura cumplir las siguientes reglas:

  • La modificación de los servicios existentes se debe realizar después de que el proveedor del servicio se haya registrado. La razón es que si un servicio ya existe, el proveedor lo machacará con el nuevo servicio.
  • Puedes añadir nuevos parámetros de configuración en cualquier momento, siempre que sea antes de utilizar el servicio.

Asegúrate de cumplir estas dos reglas cuando crees tus propios proveedores de servicios.

6.1.3. Proveedores predefinidos

Silex ya incluye varios proveedores útiles predefinidos. Todos se han creado bajo el namespace Silex\Provider:

  • DoctrineServiceProvider
  • MonologServiceProvider
  • SessionServiceProvider
  • SerializerServiceProvider
  • SwiftmailerServiceProvider
  • TwigServiceProvider
  • TranslationServiceProvider
  • UrlGeneratorServiceProvider
  • ValidatorServiceProvider
  • HttpCacheServiceProvider
  • FormServiceProvider
  • SecurityServiceProvider
  • RememberMeServiceProvider
  • ServiceControllerServiceProvider

6.1.4. Proveedores creados por terceros

La comunidad de usuarios de Silex también ha creado algunos proveedores de servicios útiles. Los más interesantes se listan en el wiki del repositorio de Silex.

Te animamos a que tu también compartas los proveedores que crees.

6.1.5. Creando un proveedor

Los proveedores de servicios siempre deben implementar la interfaz Silex\ServiceProviderInterface:

interface ServiceProviderInterface
{
    function register(Application $app);

    function boot(Application $app);
}

El método register() sirve para crear los servicios del proveedor y registrarlos en la aplicación. El método boot() sirve para configurar la aplicación antes de que empiece a procesar las peticiones del usuario.

El siguiente código muestra un ejemplo de un proveedor de servicios:

namespace Acme;

use Silex\Application;
use Silex\ServiceProviderInterface;

class HelloServiceProvider implements ServiceProviderInterface
{
    public function register(Application $app)
    {
        $app['hello'] = $app->protect(function ($name) use ($app) {
            $default = $app['hello.default_name'] ? $app['hello.default_name'] : '';
            $name = $name ?: $default;

            return 'Hello '.$app->escape($name);
        });
    }

    public function boot(Application $app)
    {
    }
}

Esta clase proporciona un servicio llamado hello en forma de closure protegido (por eso se utiliza el método protect()). A su vez este servicio utiliza un argumento llamado name. Si no se indica este argumento, utiliza un valor por defecto llamado hello.default_name o una cadena de texto vacía.

Para utilizar este nuevo proveedor de servicios, utiliza un código como el siguiente:

$app = new Silex\Application();

$app->register(new Acme\HelloServiceProvider(), array(
    'hello.default_name' => 'Igor',
));

$app->get('/hello', function () use ($app) {
    $name = $app['request']->get('name');

    return $app['hello']($name);
});

Este código obtiene el valor del parámetro name a partir de la propia query string de la página, así que una URL válida para probarlo sería por ejemplo /hello?name=Fabien.