Symfony 路由器 {_controller} 参数

Symfony router {_controller} param

我是 Symfony 的新手。我正在尝试创建动态通用路由,它将根据 url 的一部分选择所需的控制器。我在文档中发现有一个特殊的参数 {_controller} 可以在路由模式中使用,但找不到任何使用示例。

// config/routes.yaml
api:
    path: /api/{_controller}

因此,例如对于路由 /api/product,我希望启动 ProductController。 但结果我得到错误“URI“/api/product”的控制器不可调用:控制器“产品”既不作为服务也不作为class存在。

有人可以帮助我了解 {_controller] 参数的工作原理吗?或者也许有更好的方法来指定通用路由,可以动态选择控制器而无需在 routes.yaml.

中列出控制器名称

提前致谢

这并不是执行我认为您正在尝试执行的操作的最简洁方法。如果我假设您想 /api/product/ 指向产品控制器中的方法是正确的,那么像这样的东西更“symfonyish”

// src/Controller/ProductController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
 * @Route("/api/product", name="product_")
 */
class ProductController extends AbstractController
{
    /**
     * @Route("/", name="index")
     * --Resolves to /api/product/
     */
    public function index(): Response
    {
        // ...
    }

    /**
     * @Route("/list", name="list")
     * --Resolves to /api/product/list
     */        
    public function list(): Response
    {
        // ...
    }

    /**
     * @Route("/{productID}", name="get")
     * --Resolves to /api/product/{productID}
     */        
    public function get(string $productID): Response
    {
        // $productID contains the string from the url
        // ...
    }
}

请注意,这实际上只是触及了 Symfony 路由的表面。您还可以在路由指令中指定 methods={"POST"} 之类的内容;所以你可以让相同的路径根据请求的类型做不同的事情(例如,你可以有一条路线/product/{productID}GET根据该请求更新产品,但根据[=15=更新产品] 请求。

无论如何,这里的要点是在 routes.yml 中定义所有路由是笨拙的,而您应该将路由定义为控制器本身的指令。