如何使用 routing.yml 匹配所有控制器和动作

How to match all controllers and actions using routing.yml

我正在做一个项目,我有大约 98 个控制器。我们决定将这个项目迁移到 Symfony。我已经能够创建一个名为 "mdBundle".

的自定义 Bundle

如果我在 routing.yml 文件中使用 type: annotation,它会被注册并且我可以毫无问题地访问控制器。

但是,因为我们有太多的控制器,所以需要很长时间才能在动作中创建注释。因此,我试图想出一种方法,让我的 routing.yml 可以处理任何请求并执行请求的控制器。

现在我的 routing.yml 看起来像这样:

mdRoute:
    path: /{_controller}/{_action}/
    defaults: { _controller: mdBundle:_controller:_action }

我的Controller(DefaultController.php)是这样的:

namespace mdBundle\Controller;

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

class DefaultController extends Controller
{

public function indexAction(Request $request)
{
    return new Response('foo');

}

public function testingAction(Request $request)
{
    return new Response('Bar');

}
}

当我 运行 它时,我得到以下错误: ControllerResolver.php 第 69 行中的 LogicException: 无法解析控制器名称 "Default"。

我的文件夹结构与 symfony 的默认结构有点不同。我的 Bundle 位于 /root/app/mdBundle/ 内(<-- 从这里开始与 Symfony 相同)。任何人都知道为什么这不起作用。

或者有什么方法可以实现这一点而不必在我的 98 个控制器中注释每个动作?

您可以导入特定控制器或整个控制器目录的所有路由。

这将从 MdBundle 导入所有控制器内定义的所有路由。

#app/config/routing.yml
app_mdbundle:
    resource: "@MdBundle/Controller"

这将导入 MdBundle 内特定控制器内定义的所有路由:

#app/config/routing.yml
app_md_bundle:
    resource: "@MdBundle/Controller/YourController"
    type:     annotation

看这里:http://symfony.com/doc/current/book/routing.html

你真的应该在 src/ 目录中定义你的包。为此,您有两个选择:让机器人为您完成工作(使用:php app/console generate:bundle,当您在根目录中时 [并且如果您使用的是 Symfony < v3],或 $ php bin/console generate:bundle如果你使用的是 Symfony >= 3] ),或者通过手动创建它:在 src/ 中,创建新的目录(MdBundle/Controller/YourController1.php,在 MdBundle 中你可以创建其他目录,比如 CommandResources/viewsResources/config 等)。看这里:http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_bundle.html

并且不要使用 _controller 作为该路线的参数。 http://symfony.com/doc/current/book/controller.html 规则很简单:

mdRoute:
    path: /hello/{name}
    defaults: { _controller: mdBundle:Default:yourAction }

这将匹配所有路由,如 /hello/*,并且它将在 mdBundle 内的 DefaultController 内执行 yourAction 操作方法。

LE:

是的,你也可以做到:

# src/MdBundle/Controller/HelloController.php
class HelloController{
    /**
      * @Route("/hello/foo", name="whatever1")
      */
    public function fooAction(){ ... }
}

# src/MdBundle/Controller/Hello2Controller.php
class Hello2Controller{
    /**
      * @Route("/hello2/foo", name="whatever2")
      */
    public function fooAction(){ ... }
}

如果你不想把所有的路由都写在动作方法上面,你可以创建MdBundle/Resources/config/routing.yml,把你所有的路由放在这里:

app_hello:
    path: /hello/foo
    defaults: { _controller: MdBundle:Hello:foo }

app_hello2:
    path: /hello2/foo
    defaults: { _controller: MdBundle:Hello2:foo }

然后在主配置文件中导入所有路由:

# app/config/routing.yml
MdBundle:
    resource: "@MdBundle/Resources/config/routing.yml"

或者在主 app/config/routing.yml 文件中直接定义上面的路由。