-1

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

它已注册,如果我在 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/(<-- 从这里它与 Symfony 相同)。任何人都知道为什么这不起作用。

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

4

1 回答 1

2

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

这将从 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你可以创建其他目录,比如Command, Resources/views,Resources/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 操作方法。

乐:

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

# 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 主文件中定义上述路由。

于 2016-03-17T19:33:54.187 回答