Silex, el manual oficial

6.2. Proveedores de controladores

6.2.1. Cargando los proveedores

Antes de poder utilizar un proveedor de controladores debes importar o "montar" los controladores bajo una determinada ruta:

$app = new Silex\Application();

$app->mount('/blog', new Acme\BlogControllerProvider());

Ahora todos los controladores definidos por el proveedor están disponibles bajo la ruta /blog.

6.2.2. Creando un proveedor

Los proveedores de controladores deben implementar la interfaz Silex\ControllerProviderInterface:

interface ControllerProviderInterface
{
    function connect(Application $app);
}

El siguiente código muestra un ejemplo de este tipo de proveedor:

namespace Acme;

use Silex\Application;
use Silex\ControllerProviderInterface;

class HelloControllerProvider implements ControllerProviderInterface
{
    public function connect(Application $app)
    {
        // crea un controlador basado en la clase Route por defecto
        $controllers = $app['controllers_factory'];

        $controllers->get('/', function (Application $app) {
            return $app->redirect('/hello');
        });

        return $controllers;
    }
}

El método connect() debe devolver una instancia de la clase ControllerCollection. Esta es la clase donde se definen todos los métodos relacionados con los controladores (como get(), post(), match(), etc.)

Ahora ya puedes utilizar este proveedor de la siguiente manera:

$app = new Silex\Application();

$app->mount('/blog', new Acme\HelloControllerProvider());

En este ejemplo, la ruta /blog/ ahora hace referencia al controlador definido dentro del proveedor.

Truco También es posible crear un proveedor que implemente tanto la interfaz de los servicios como la de los controladores. En otras palabras, puedes agrupar en una única clase tanto los controladores como los servicios que utilizan esos controladores para funcionar.