在 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();
我有一个自定义 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();