Symfony 一个控制器的两个路由或一组操作的两个路由

Symfony 一个控制器的两个路由或一组操作的两个路由,symfony,routing,Symfony,Routing,以下是所需URL的方案: /service/getBalance should map to CustomerController::getBalance /service/addBalance should map to CustomerController::addBalance /customer/getBalance should map to CustomerController::getBalance /customer/addBalance should

以下是所需URL的方案:

/service/getBalance    should map to CustomerController::getBalance
/service/addBalance    should map to CustomerController::addBalance

/customer/getBalance    should map to CustomerController::getBalance
/customer/addBalance    should map to CustomerController::addBalance
这是一个简单的控制器

<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class CustomerController extends Controller {

    /**
     * @Route("/getBalance")
     */
    public function getBalanceAction(Request $request) {

    }

    /**
     * @Route("/addBalance")
     */
    public function addBalanceAction(Request $request) {

    }

} // class CustomerController
加载具有不同前缀的同一资源时,始终会覆盖上一个事件(最后一个事件有效)。以下内容也不适用于相同的原因和行为

# rounting.yml
v1:
    resource: "@AppBundle/Resources/config/routing_customer.yml"
    prefix:   /service

v2:
    resource: "@AppBundle/Resources/config/routing_customer.yml"
    prefix:   /customer


# routing_customer.yml
getBalance:
    path: /getBalance
    defaults : { _controller: "AppBundle:Customer:getBalance" }

addBalance:
    path: /addBalance
    defaults : { _controller: "AppBundle:Customer:addBalance" }
第三个不工作选项:

# rounting.yml
v1:
    resource: "@AppBundle/Resources/config/routing_v1.yml"
    prefix:   /     # evenr putting /service here instead of inside

v2:
    resource: "@AppBundle/Resources/config/routing_v2.yml"
    prefix:   /     # evenr putting /customer here instead of inside

# routing_v1.yml
getBalance:
    path: /service/getBalance
    defaults : { _controller: "AppBundle:Customer:getBalance" }

addBalance:
    path: /service/addBalance
    defaults : { _controller: "AppBundle:Customer:addBalance" }

# routing_v2.yml
getBalance:
    path: /customer/getBalance
    defaults : { _controller: "AppBundle:Customer:getBalance" }

addBalance:
    path: /customer/addBalance
    defaults : { _controller: "AppBundle:Customer:addBalance" }
我实际上需要将
/
/customer
路由到同一个控制器:
/getBalance
/customer/getBalance

我想为一组方法提供两个前缀。如何在Symfony中实现这一点?

我的试验结论、@goto的回答和@Cerad的评论:

如果我使用不同的路由名称,上面的最后一个示例可能会起作用。管线名称在整个项目中都是唯一的(不仅仅在文件中是唯一的)
v1\u getBalance
v2\u getBalance


另一种解决方案是使用所述的@goto。

您可以这样做:

     @Route(
          "/{subject}/getBalance",
          requirements={
              "subject": "customer|service"
          }
      )
在yml中:

subject_getbalance:
  path:     /{subject}/getBalance
  requirements:
      subject:  customer|service
该要求比没有更安全:它允许您在另一个控制器上路由另一条路径,如
foo/getBalance
(因为它与要求不匹配)

编辑:对于您的特殊情况,由于您也需要/getBalance映射到您的路线,您可以执行以下操作:

subject_getbalance:
      path:     /{subject}/getBalance
      default: { _controller: YourBundle:Controller }
      requirements:
          subject:  customer|service
default_getbalance:
      path:     /getBalance
      default: { _controller: YourBundle:Controller, subject: customer }
编辑:最后一个想法是(但我从未尝试过):

这将允许您生成3条路线:

default_getBalance: /getBalance
customer_getBalance: /customer/getBalance
service_getBalance: /service/getBalance

我尝试过这样做,但我的真实案例要求/和/客户去控制器/getBalance/customer/getBalance,我无法满足这些要求。如果你能告诉我怎么做,这就是我想要避免的。我将不得不重复每种方法两次!见我的最后一个例子。。我认为它和你的一样,但遗憾的是它不起作用。我的最后一个想法是:使用/自定义路由加载程序。您的上一个示例与我的示例不同,因为您将有5条路由用于4个不同的前缀,而我的只有2条。在Symfony 4.1中,您可以为导入的路由名称添加前缀:使用此选项,您可以创建一个路由文件,但是使用不同的名称前缀导入了两次,以避免任何路由名称被覆盖使用注释的第一种方法将不起作用,因为您没有注释,并且注释严格来说每个方法只有一条路由。第二种方法失败,因为每个路由名称只能有一个路由,所以第二种方法会覆盖第一种方法。保持简单。制作一个routing_customer.yml和一个routing_service.yml,并将它们都加载。可悲的是,如果试图让一个方法处理两个不同的请求,您可能会遇到其他问题。我怀疑最终会出现两个代码略有不同的控制器。方法可以有两条通过注释的路径。我试图找到一种更好的方法来分组它们,而不是在两个文件中重复它们。我必须在每条路径前面写前缀@Cerad我尝试制作两个yml文件,但第二个文件也覆盖了第一个文件。在我看来,注释是为方法指定两条路径的唯一方法。您需要指定不同的路径名称,即customer\u get\u balance和service\u get\u balance。假设你是一个路由器,这可能更有意义。看起来路由名称在整个项目中是唯一的,所以我不能在两个文件中有相同的路由名称。
class ExtraLoader extends Loader
{
    public function load($resource, $type = null)
    {

       /* ... */

        $prefixes = [ 'default_' =>'','customer_' =>'/customer','service_' =>'/service']

        // prepare a new route
        $path = '/getbalance/{parameter}';
        $defaults = array(
            '_controller' => 'YourBundle:Actiona',
        );
        $requirements = array(
            'parameter' => '\d+',
        );
       foreach($prefixes as $prefixName => $prefixRoute) {
          $route = new Route($prefixRoute . $path, $defaults, $requirements);
          $routes->add($prefixName . 'getBalance', $route);
       }
default_getBalance: /getBalance
customer_getBalance: /customer/getBalance
service_getBalance: /service/getBalance