覆盖 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}idbar)并且由于它早于 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
   }
}