【问题标题】:How to match all controllers and actions using routing.yml如何使用 routing.yml 匹配所有控制器和操作
【发布时间】:2016-03-17 18:54:16
【问题描述】:

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

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

但是,因为我们有这么多控制器,所以在动作中创建注释需要很长时间。因此,我试图想出一种方法,让我的 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/ 内(

或者还有什么其他方法可以在不必为我的 98 个控制器中的每一个操作添加注释的情况下完成此操作?

【问题讨论】:

  • 98 个控制器?不是很多。花 30 分钟将它们添加到您的路线文件中。否则,搜索动态路由。

标签: php symfony symfony-routing


【解决方案1】:

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

这将从 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 $ php bin/console generate:bundle,如果您是使用 Symfony >= 3] ),或者手动创建它:在 src/ 中,创建新目录(MdBundle/Controller/YourController1.php,在 MdBundle 中,您可以创建其他目录,例如 CommandResources/viewsResources/config , ETC)。看这里: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(){ ... }
}

如果你不想把所有的路由都写在action方法上面,你可以创建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 它将去 hello2 控制器(没有在 foo 操作中定义路由)。你明白了吗?
  • LE 是什么意思?对不起。
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 2014-05-12
  • 2019-04-14
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多