覆盖 Symfony 控制器方法不能正常工作
Overriding Symfony Controller Methods doesn't work properly
我正在尝试在覆盖的控制器中创建一个新的控制器函数 class,但它没有按预期工作。
我有一个公共捆绑包,供许多客户使用。有时当客户端需要特定功能时,我会为客户端包中的公共控制器创建一个覆盖。
这是我的通用包控制器代码。
class FrontController extends Controller
{
// This is the controller in my common bundle
/**
* @Route("/foo/{id}", name="front_view")
*/
public function viewAction(
string $id,
Request $request
){
// My Controller code
}
}
这是我为客户端包覆盖的控制器代码。
class ClientFrontController extends FrontController
{
// I have 2 controller methods in this class
// First method overrides the FrontController's viewAction method
// This works fine
/**
* @Route("/foo/{id}", name="front_view")
*/
public function viewAction(
string $id,
Request $request
){
// My Controller code
}
//Second method
//This is the problem
/**
* @Route("/foo/bar", name="foo_bar")
*/
public function fooBarAction(
Request $request
){
// My Controller code
}
}
我面临的问题是,当我导航到 /foo/bar
路线时,它会转到 /foo/{id}
ClientFrontController
中的覆盖方法。
为什么会这样?我怎样才能使这两条路线都有效?
路线顺序是相关的。
/foo/bar
包含在 /foo/{id}
中。在评估请求时,/foo/bar
匹配 /foo/{id}
(id
为 bar
)并且由于它早于 declared/read,因此 front_view
处理请求。
如果您使用的是 Symfony < 5.1,请尝试移动路由(以便 foo_bar
早于 front_view
)。甚至更改路线,以免重叠。
如果您使用的是 Symfony 5.1+,您现在可以在路由 annotations/attributes 上使用 priority
。阅读 the announcement here, and the docs here.
class ClientFrontController extends FrontController
{
/**
* @Route("/foo/{id}", name="front_view")
*/
public function viewAction(string $id, Request $request)
{
// My Controller code
}
/**
* @Route("/foo/bar", priority=10, name="foo_bar")
*/
public function fooBarAction(Request $request)
{
// My Controller code
}
}
我正在尝试在覆盖的控制器中创建一个新的控制器函数 class,但它没有按预期工作。
我有一个公共捆绑包,供许多客户使用。有时当客户端需要特定功能时,我会为客户端包中的公共控制器创建一个覆盖。
这是我的通用包控制器代码。
class FrontController extends Controller
{
// This is the controller in my common bundle
/**
* @Route("/foo/{id}", name="front_view")
*/
public function viewAction(
string $id,
Request $request
){
// My Controller code
}
}
这是我为客户端包覆盖的控制器代码。
class ClientFrontController extends FrontController
{
// I have 2 controller methods in this class
// First method overrides the FrontController's viewAction method
// This works fine
/**
* @Route("/foo/{id}", name="front_view")
*/
public function viewAction(
string $id,
Request $request
){
// My Controller code
}
//Second method
//This is the problem
/**
* @Route("/foo/bar", name="foo_bar")
*/
public function fooBarAction(
Request $request
){
// My Controller code
}
}
我面临的问题是,当我导航到 /foo/bar
路线时,它会转到 /foo/{id}
ClientFrontController
中的覆盖方法。
为什么会这样?我怎样才能使这两条路线都有效?
路线顺序是相关的。
/foo/bar
包含在 /foo/{id}
中。在评估请求时,/foo/bar
匹配 /foo/{id}
(id
为 bar
)并且由于它早于 declared/read,因此 front_view
处理请求。
如果您使用的是 Symfony < 5.1,请尝试移动路由(以便 foo_bar
早于 front_view
)。甚至更改路线,以免重叠。
如果您使用的是 Symfony 5.1+,您现在可以在路由 annotations/attributes 上使用 priority
。阅读 the announcement here, and the docs here.
class ClientFrontController extends FrontController
{
/**
* @Route("/foo/{id}", name="front_view")
*/
public function viewAction(string $id, Request $request)
{
// My Controller code
}
/**
* @Route("/foo/bar", priority=10, name="foo_bar")
*/
public function fooBarAction(Request $request)
{
// My Controller code
}
}