我正在将基于Silex的应用程序重写为Symfony 4,因为Silex将在一段时间后被弃用。到目前为止,一切都很好,但我有嵌套路线的问题。
我在Silex应用程序中有很多嵌套(子路由),并为它们分配了不同的控制器。
$app->match('/api', function (ControllerCollection $api) {
$api->get('/homepage', 'ControllerOne::index');
$api->get('/contact', 'ControllerTwo::index');
});
在Silex中这很容易,但现在在Symfony 4中,我正在使用注释来管理路线,似乎我找不到将这些路线分组的方法。
特别是当涉及到_locale
的路由时,这很烦人,因为这些路由的语法很长而且仍然...如果我需要更改{{1},这不是一个好的方法。有一天,前缀为_locale
。
/home/{_locale}/
更新
我有一个想法是创建某种ControllerOne extends Controller
{
/**
* @Route("/{_locale}/",
* name="root",
* methods="GET",
* requirements={"_locale": "en|fr"}
* )
*
* @return Response
*/
public function index(): Response
{
return $this->render('some.html.twig');
}
}
ControllerTwo extends Controller
{
/**
* @Route("/{_locale}/homepage",
* name="homepage",
* methods="GET",
* requirements={"_locale": "en|fr"}
* )
*
* @return Response
*/
public function index(): Response
{
return $this->render('some2.html.twig');
}
}
,我在其中指定了类的前缀和PrefixedController
而不是基本PrefixedController
的扩展名,但似乎不工作。
Controller
但是当我导航到/**
* @Route("/{_locale}", requirements={"_locale": "en|fr"})
*/
controller PrefixedController extends Controller
{
}
controller ControllerOne extends PrefixedController
{
/**
* @Route("/", methods="GET")
* @Return Response
*/
public function index(): Response
{
return $this->render('some.html.twig');
}
}
时,它与路线不匹配。
答案 0 :(得分:3)
这可以在导入路由资源的主路由文件中完成。在Symfony 4中,它位于config/routes/annotations.yaml
。然后,为导入的路由提供前缀/{_locale}
,使用prefix
选项:
# config/routes/annotations.yaml
controllers:
resource: '../src/Controller/'
type: annotation
prefix: /{_locale}
从新路由资源加载的每个路由的路径现在将以占位符/{_locale}
作为前缀。