在 Silex 中使用 RouteCollectionProvider

Using a RouteCollectionProvider in Silex

我有一个自定义 Silex\RouteCollection 我想注册...

class RouteCollectionProvider extends RouteCollection
{
    public function __construct() {
        $this->add(
            'Index',
            new Route('/', array(
                'method' => 'get',
                'controller' => 'index',
                'action' => 'index'
            )
        ));
    }
}

...在 bootstrapping 期间:

$app = new Silex\Application();
/**  here  **/
$app->run();

我可以使用:

$app = new Silex\Application();
$routes = new RouteCollectionProvider();
foreach ($routes->getIterator() as $route) {
     $defaults = $route->getDefaults();
     $pattern  = $route->getPath();
     $callback = 'Controller\'
         . ucfirst($defaults['controller'])
         . 'Controller::'
         . $defaults['action']
         . 'Action';
     $app->get($pattern, $callback);
}
$app->run();

我不喜欢在那里初始化那些路由。 您知道 Silex 中哪个位置更适合这个吗?

我无法使用 $app->register(),因为它被调用的太晚了,路由不会在那里 active

也许有一个活动我可以使用

$app->on('beforeCompileRoutesOrSomething', function() use ($app) {
    // initialize routes
}

或者 Dispatcher 中的钩子?

我的目标是不要在其中收集大量 $app->get()$app->post()。我也知道我可以 ->mount() 一个 controller 但是我的所有 get 定义仍然在我的 bootstrap 中而不是在提供者中。

这个post解决了问题:Scaling Silex pt. 2

$app = new Application;

$app->extend('routes', function (RouteCollection $routes, Application $app) {
    $routes->addCollection(new MyCustomRouteCollection);
     return $routes;
});

$app->run();