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
中定义所有路由是笨拙的,而您应该将路由定义为控制器本身的指令。
我是 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
中定义所有路由是笨拙的,而您应该将路由定义为控制器本身的指令。