O barato do Silex é que ele é realmente muito simples de se iniciar uma aplicação. Mas conforme a mesma vai crescendo, e consecutivamente, o número de páginas e rotas vai aumentando, fica realmente um saco toda hora ter que alterar o código para adicionar ou remover rotas.
Como o Silex é baseado em componentes do Symfony, nada mais prático que utilizar o componente de rotas dele para facilitar nossa vida, não é mesmo?
Então, vamos direto ao ponto.
Começamos instalando as bibliotecas necessárias, adicionando as linhas no composer.json do projeto:
composer require symfony/yaml:~2.6 symfony/config:~2.6
Pronto, isso é tudo que precisamos para trabalhar com as rotas. Agora, vamos fazer a leitura dos arquivos com as nossas rotas definidas:
<?php
...
use Symfony\Component\Routing\Loader\YamlFileLoader as RoutingFileLoader;
use Symfony\Component\Routing\RouteCollection;
...
$routesPath = __DIR__ . DIRECTORY_SEPARATOR . 'routes';
$app['routes'] = $app->extend(
'routes',
function (RouteCollection $routes) use ($routesPath) {
$loader = new RoutingFileLoader(new FileLocator($routesPath));
$collection = $loader->load('routes.yml');
$routes->addCollection($collection);
return $routes;
}
);
...
O arquivo de rotas (routes/routes.yml)
# album route
album:
prefix: /album
resource: routes.album.yml
...
E um exemplo de rotas (routes/album.yml):
# album route
album.home:
path: /
defaults: { _controller: 'Application\Controller\Album::get' }
methods: [GET]
album.view:
path: /{id}
defaults: { _controller: 'Application\Controller\Album::view' }
methods: [GET]
requirements:
id: \d+
album.create:
path: /
defaults: { _controller: 'Application\Controller\Album::post' }
methods: [POST]
album.update:
path: /{id}
defaults: { _controller: 'Application\Controller\Album::put' }
methods: [PUT]
requirements:
id: \d+
album.delete:
path: /{id}
defaults: { _controller: 'Application\Controller\Album::delete' }
methods: [DELETE]
requirements:
id: \d+
E está feito, agora é só ir criando duas rotas direto no YAML respectivo. ;)