如何使用 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
中你可以创建其他目录,比如 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 操作方法。
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 文件中直接定义上面的路由。
我正在做一个项目,我有大约 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
中你可以创建其他目录,比如 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 操作方法。
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 文件中直接定义上面的路由。