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

Php 如何使用routing.yml匹配所有控制器和操作,php,symfony,symfony-routing,Php,Symfony,Symfony Routing,我正在做一个项目,我有大约98个控制器。我们已决定将此项目迁移到Symfony。我已经能够创建一个名为“mdBundle”的定制包 如果在routing.yml文件中使用type:annotation,它将被注册,并且我能够访问控制器而不会出现任何问题 然而,因为我们有如此多的控制器,它将永远需要在动作中创建膏体。因此,我试图找到一种方法,使我的routing.yml能够处理任何请求并执行所请求的控制器 现在,我的routing.yml如下所示: mdRoute: path: /{_co

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

如果在routing.yml文件中使用type:annotation,它将被注册,并且我能够访问控制器而不会出现任何问题

然而,因为我们有如此多的控制器,它将永远需要在动作中创建膏体。因此,我试图找到一种方法,使我的routing.yml能够处理任何请求并执行所请求的控制器

现在,我的routing.yml如下所示:

mdRoute:
    path: /{_controller}/{_action}/
    defaults: { _controller: mdBundle:_controller:_action }
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');

}
}
我的
控制器(DefaultController.php)
如下所示:

mdRoute:
    path: /{_controller}/{_action}/
    defaults: { _controller: mdBundle:_controller:_action }
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的默认结构略有不同。我的捆绑包位于
/root/app/mdBundle/
(您可以导入特定控制器或整个控制器目录的所有路由

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

#app/config/routing.yml
app_mdbundle:
    resource: "@MdBundle/Controller"
这将导入MdBundle中特定控制器内定义的所有路由:

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

你真的应该在
src/
目录中定义你的bundle。为此,你有两个选择:当你在根目录中[如果你在使用Symfonyphp-app/console-generate:bundle),或
$php-bin/console-generate:bundle
如果您使用的是Symfony>=3]),或通过手动创建:在src/内部创建新目录(
MdBundle/Controller/YourController1.php
,在
MdBundle
内部,您可以创建其他目录,如
命令
资源/视图
资源/配置
,等等)。请看这里:

不要使用
\u控制器
作为该路线的参数。
规则很简单:

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文件中定义上面的路由。

如果我没有使用默认控制器,该怎么办。我试图避免的是在操作中定义所有路由。换句话说,控制器将动态更改。例如,如果我转到/hello/foo,它将转到hello cotroller,如果我有/hello2/foo it将转到hello2控制器(未在foo操作中定义路由)。您明白了吗?您所说的LE是什么意思?抱歉。98控制器?不太多。花30分钟时间将它们添加到您的路由文件中。否则,请搜索动态路由。