我正在开发一个项目,我有大约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控制器中注释每一个动作?
答案 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}},MdBundle
,Command
等)。看看这里: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文件中定义上面的路由。