У меня есть обычай Silex\RouteCollection
который я хочу зарегистрировать …
class RouteCollectionProvider extends RouteCollection
{
public function __construct() {
$this->add(
'Index',
new Route('/', array(
'method' => 'get',
'controller' => 'index',
'action' => 'index'
)
));
}
}
…во время начальной загрузки:
$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()
потому что он вызывается слишком поздно, и маршруты не получат активный там.
Может быть, есть событие, которое я могу использовать с
$app->on('beforeCompileRoutesOrSomething', function() use ($app) {
// initialize routes
}
Или крючок в Диспетчере?
Моя цель — не иметь большую коллекцию $app->get()
или же $app->post()
там. Я также знаю, что могу ->mount()
controller
но тогда еще у меня есть все мои get
определения в моей начальной загрузке, а не в провайдере.
Этот пост решает проблему: Масштабирование Silex pt. 2.
$app = new Application;
$app->extend('routes', function (RouteCollection $routes, Application $app) {
$routes->addCollection(new MyCustomRouteCollection);
return $routes;
});
$app->run();
Других решений пока нет …