【问题标题】:Defining default routing for controller/action in symfony 2在 symfony 2 中为控制器/动作定义默认路由
【发布时间】:2013-10-08 12:45:59
【问题描述】:

如果我想让每个 url 调用除了我在 /ExplicitControllerName/ExplicitActionToRun 之后定义的调用之外......路由会是什么样子。

例如一些伪代码:

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 / routing / use parameters as Controller or Action name

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

P.S 我真的很喜欢 C#.NET MVC 4.0 路由,它允许您为典型设置设置路由,即使至少用于开发

【问题讨论】:

    标签: php url symfony controller routing


    【解决方案1】:

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

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

    1)您有很多某种 CMS 页面,例如您的 about 示例,这些页面没有太多逻辑,只是呈现一些视图,在这种情况下,您会像这样:

    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 实现。查看native implementation 了解从哪里开始。它可以让你定义一个后备。

    【讨论】:

    • 这是一个很好的解决方案,但您还需要保持对蠕虫的控制,因为当您拥有一个捕获所有控制器时,基本上不可能发生 404 异常,除非您的控制器是非常精确。
    • Flosculus,没错,但我认为 OP 知道这种行为,顺便说一下,我们可以想象一个路由器匹配数据库中的页面,如果没有找到匹配项,则返回 404。
    【解决方案2】:

    这可以通过在类和方法级别过度使用 SensioFrameworkExtraBundle 的 @Route 注释来实现...

    ... 或者使用 FOSRestBundle 的 automatic route generation 和隐式资源名称,使用更少的注释更优雅。也许您需要使用一些 FOSRestBundle 的manual route definition annotations 来更正一些生成的路由。

    这两种方法最初仍然需要将路由资源显式添加到您的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
    

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

    • 引入custom annotation(类级别)
    • 创建一个compiler passcustom route loader,您可以在其中...
    • 使用Finder 查找具有该注释的所有捆绑包中的所有控制器类
    • 最后将所有这些作为带有类型注释/休息的资源添加到那里的路由集合中

    如果您不打算使用数百个控制器,并且对编译器通道、自定义注释等没有太多经验,那么在路由配置中注册资源肯定会更快。

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 2016-07-03
      • 2019-09-13
      • 2017-07-02
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多