Сделал так:
в app/config/routing.yml
# It must be the last
category:
path: "/{alias}"
defaults: { _controller: "AppBundle:Default:category" }
requirements:
alias: "[a-z_-]+(\/[a-z_-]+)*"
в DefaultController:
/**
* @ParamConverter("category", class="AppBundle:Category")
*/
public function categoryAction(Category $category, Request $request)
{
$id = $request->query->getInt('id');
if (null == $id) {
return $this->run('index', $category, $request); // indexAction
} else {
return $this->run('details', $category, $id); // detailsAction
}
}
private function run($actionName, $category)
{
$params = func_get_args();
array_shift($params);
$namespace = "\\AppBundle\\Controller\\". $category->getController() . 'Controller';
$actionName .= 'Action';
/** @var Controller $controller */
$controller = new $namespace();
$controller->setContainer($this->container);
return call_user_func_array(array($controller, $actionName), $params);
}
В БД указываю только имя контроллера.
$category->getController()
как раз его возвращает.