Symfony 4 中多个控制器中的分组路由
Grouped routes in multiple controllers in Symfony 4
我正在将基于 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
的路由时,因为这些路由的语法很长而且仍然..如果我需要更改 _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
,我会在 class 上指定前缀并扩展 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');
}
}
但是当我导航到/en/
时,它无法匹配路线。
这可以在导入路由资源的主路由文件中完成。在 Symfony 4 中它位于 config/routes/annotations.yaml
。然后为导入的路由提供前缀 /{_locale}
使用 prefix
选项:
# config/routes/annotations.yaml
controllers:
resource: '../src/Controller/'
type: annotation
prefix: /{_locale}
从新路由资源加载的每条路由的路径现在将以占位符 /{_locale}
.
为前缀
我正在将基于 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
的路由时,因为这些路由的语法很长而且仍然..如果我需要更改 _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
,我会在 class 上指定前缀并扩展 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');
}
}
但是当我导航到/en/
时,它无法匹配路线。
这可以在导入路由资源的主路由文件中完成。在 Symfony 4 中它位于 config/routes/annotations.yaml
。然后为导入的路由提供前缀 /{_locale}
使用 prefix
选项:
# config/routes/annotations.yaml
controllers:
resource: '../src/Controller/'
type: annotation
prefix: /{_locale}
从新路由资源加载的每条路由的路径现在将以占位符 /{_locale}
.