【问题标题】:Symfony2 Routing within a bundle捆绑包内的 Symfony2 路由
【发布时间】:2016-02-09 21:30:22
【问题描述】:

我有一个 symfony 项目,我将我的代码分成两个不同的包,比如说 HomeBundle 和 AppBundle,但是路由通常可以在两个包中访问。

eg:- HomeBundle 中定义的/home 也可以从AppBundle 访问

AppBundle中定义的/App也可以从HomeBundle访问

我想要的是仅从 HomeBundle 访问 /home 和仅从 AppBundle 访问 /App 我正在寻找“结构化”我的代码的方式,我不必编写任何逻辑来实现这一点,而是利用 symfony 框架结构为我执行此操作,类似于将路由限制为仅在包内,或者在错误的包内时路由定义“超出范围”的某种方式

我使用注解进行路由,并在 app/config/routing.yml 中定义

编辑:应用程序需要 subomain 分区,所以我也使用 this host/default 和占位符

任何帮助将不胜感激 :) 谢谢

【问题讨论】:

    标签: php symfony directory-structure


    【解决方案1】:

    我假设 bundle 中的业务逻辑是隔离的,并且不会“知道”其他 bundle 中定义的路由,结果路由对所有 bundle 全局可用,我想使用 symfony 的框架来实现我所要求的,它发生了,所以没有办法做到这一点。我可能应该使用监听器或过滤器等来实现这一点。 John Noel 回答了这个问题。

    对我来说幸运的是,这些捆绑包碰巧在不同的域上运行(一个在主域上,另一个在子域上)我在与 @John Noel 聊天后注意到这一点,他建议匹配基于主机/域的路由。我以前有这个,再看一遍我发现我必须 - 基于域将所有(除了路由白名单)路由重定向到引发 404 异常的控制器。这就是我的意思。

    Home_restrict:
        path:     /{slug}
        host:     "{domain}"
        defaults:
            _controller: HomeBundle:Home:notfound
        requirements:
           domain: example.com|www.example.com
           slug: ^(?!.*(admin|login)$).*
    

    出现在页面列表顶部的路由优先,所以应该适当放置

    【讨论】:

      【解决方案2】:

      不幸的是,这是不可能的,主要是因为 Symfony 包的架构。虽然从认知的角度来看,将代码分成包是好的,但 Symfony 没有“在”包中的概念。运行什么代码(特别是您的控制器操作)通常由路由处理,并且必须从所有捆绑包一起编译路由以确保可以成功路由请求。

      您必须编写额外的代码来完成您的要求 - 我最初的想法是您自己的 Controller 类(可能从 FrameworkBundle\Controller\Controller 扩展)在请求之前运行一些代码(参见 documentation可以实现这一点)。

      从根本上说,这对你来说是一个架构决策,我的问题是 - 为什么你不想能够从 AppBundle 访问 /home?安全/角色设置是否也能正常工作,还是您正在尝试对代码进行沙箱处理?

      EDIT 经过进一步的详细说明,事实证明,要求是针对同一 URL 路径(例如 /home)但在不同域上的两个不同操作,例如www.example.com/homesubdomain.example.com/home。在这种情况下,它不是关于代码共享,而是 URL,因此 Symfony 的 host/domain based routing 解决方案奏效了。

      【讨论】:

      • 您好,感谢您的回答!我这样做是因为我有类似“ www.example.com ”的东西,它是产品的主页(位于 HomeBundle 中),您可以在其中注册我们的网络服务,我们也有“ subdomain.example.com ”(位于AppBundle),这是客户端注册的实际 Web 服务。当前设置允许一个人访问“subdomain.example.com/home”,但情况并非如此。应该只允许“example.com/home”
      • 作为最后的手段,我可​​以在 routing.yml 中使用路由前缀选项来获得我想要的(几乎):P
      • 何时“允许”用户访问 subdomain.example.com/access?您可以为路由提供域/主机参数 (documentation),或者如果有更多安全问题,可以查看 security voters?
      • 嘿,它与“用于路由的域/主机参数”位一起工作,多亏了你,我再看了一遍,它点击了。稍后我将自己在这里发布详细的正确答案,您可能需要编辑您的答案以包含该 sn-p,因为我们毕竟需要一个可接受的答案;)
      • 我已经在上面的编辑部分弹出了详细信息,很高兴它有效并找到了问题的根源!
      【解决方案3】:

      您可以为每个捆绑包添加一个routing.yml,并将它们包含在您的“全局”路由中:

      # src/HomeBundle/Resources/config/routing.yml
      home:
          resource: "@HomeBundle/Controller/HomeController.php"
          type:     annotation
      

      # src/AppBundle/Resources/config/routing.yml
      home:
          resource: "@AppBundle/Controller/AppController.php"
          type:     annotation
      

      然后将它们导入app/config/routing.yml,甚至可以在那儿加上前缀?

      # app/config/routing.yml
      app:
          resource: "@AppBundle/Resources/config/routing.yml"
          prefix:   /app
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多