在symfony 2中定义控制器/动作的默认路由


Defining default routing for controller/action in symfony 2

如果我想让它使除了我在 /ExplicitControllerName/ExplicitActionToRun 上操作后定义的 url 之外的每个 url 调用......路由可能是什么样子的。

例如一些伪代码:

default_pathing:
    pattern:  /{controller}/{action}
    defaults: { _controller: Bundle:Default:index }

所以如果我去www.example.com/Page/About

它会调用我的控制器

class Page extends Controller
{
    public AboutAction()
    {
        // Called by above URL
    }
}

这个问题没有回答:Symfony2/路由/使用参数作为控制器或操作名称

想象一下,我有 100 个页面,其中有很多子路由页面每次都执行几乎相同的路由。我想为所有这 100 个控制器执行 1 个路由。我们将如何做到这一点?

P.S我真的想要像 C#.NET MVC 4.0 路由这样的东西,它允许您为您可能拥有的典型设置设置路由,即使至少它用于开发

你的问题并不完全清楚,但这里有一些提示。

我可以想象您尝试解决的两个用例:

1(你有很多某种CMS页面,就像你的关于的例子,这些页面没有太多的逻辑,只是呈现一些视图,在这种情况下,你会像这样:

class CMSPageController
{
    public function renderPage($pageSlug)
    {
        $page = $this->cmsPageRepository->findBySlug($pageSlug);
        // your logic to render the view
    }
}

以及相应的路由配置:

<route id="cms_page_view" pattern="/cms/{pageSlug}">
  <default key="_controller">cms_page.controller.page:renderPage</default>
  <requirement key="_method">GET</requirement>
  <requirement key="slug">[0-9a-zA-Z'-'.'/]+</requirement>
</route>

2(你有更复杂的要求,和/或遵循特定的模式来命名你的控制器/动作,因此你需要编写一个自定义UrlMatcherInterface实现。查看本机实现以了解从哪里开始。它将允许您定义回退。

可以通过SensioFrameworkExtraBundle在类和方法级别上过度的@Route注释来实现。

。或者使用带有隐式资源名称的 FOSRestBundle 自动路由生成功能,使用更少的注释更优雅。也许您需要使用 FOSRestBundle 的一些手动路由定义注释来更正一些生成的路由。

这两种方法最初仍然不需要将路由资源显式添加到您的app/config/routing.yml中。

@Route导入示例

# import routes from a controller directory
blog:
    resource: "@SensioBlogBundle/Controller"
    type:     annotation

FOSRestBundle 的导入示例

users:
    type:     rest
    resource: Acme'HelloBundle'Controller'UsersController

您可以通过以下方式解决必须导入所有资源的问题:

  • 引入自定义批注(类级别(
  • 创建编译器传递或自定义路由加载程序,您可以在其中...
  • 使用 Finder 查找带有该注释的所有捆绑包中的所有控制器类
  • 最后将所有这些作为具有类型注释/REST的资源添加到那里的路由集合中

如果您不打算使用数百个控制器,并且在编译器传递、自定义注释方面没有太多经验......等等,只要在路由配置中注册资源,您肯定会更快。