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

时间:2016-03-17 18:54:16

标签: php symfony symfony-routing

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

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

但是因为我们有这么多控制器,所以在动作中创建anotations将需要永远。因此,我试图想出一种方法,我的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: 无法解析控制器名称“默认”。

我的文件夹结构与symfony的默认值略有不同。我的Bundle在/root/app/mdBundle/内(< - 从这里它和Symfony一样)。任何人都知道为什么这不起作用。

或者可以用另一种方法来实现这一目标,而无需在我的98控制器中注释每一个动作?

1 个答案:

答案 0 :(得分:2)

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

这将从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]或{{1}时如果你正在使用Symfony> = 3]),或者通过手动创建它:在src /里面,创建新的dirs($ php bin/console generate:bundle,在MdBundle/Controller/YourController1.php内你可以创建其他目录,比如{ {1}},MdBundleCommand等)。看看这里:http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_bundle.html

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

Resources/config

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

<强> LE

是的,你也可以做到这一点:

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

如果你不想写动作方法之上的所有路线,你可以创建/hello/*,并在这里放置所有路线:

# 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 / config / routing.yml文件中定义上面的路由。