Silex, el manual oficial

8.3. La clase ControllerCollection

Como la clase RouteCollection está disponible en la aplicación, los proveedores pueden modificar sus contenidos. El problema es que en realidad las rutas no conocen sus propios nombres, ya que el nombre solo tiene sentido en el contexto de la clase RouteCollection y no se puede cambiar.

Para resolver este problema se ha creado una zona intermedia para las rutas. La clase ControllerCollection almacena los controladores hasta que se ejecuta el método flush(). En ese mismo momento, las rutas se añaden al RouteCollection y los controladores ya no se pueden modificar. Por tanto, si tratas de modificar un controlador después de este punto, Silex lanzará una excepción.

Desafortunadamente no existe una forma de hacer el flush implícitamente, por lo que ahora siempre se realiza explícitamente. Si quieres acceder al objeto ControllerCollection antes de la petición, el flush debes realizarlo tu mismo. La clase Application incluye un atajo en forma del método flush().

Truco En vez de crear una instancia de RouteCollection a mano, es mejor utilizar la factoría disponible en $app['controllers_factory'].