在现代框架中使用路由文件的背后原因是什么?

塞尔吉·乌瓦洛夫(Serge Uvarov)

在现代Web框架(Laravel,Symfony,Silex等)中,似乎存在一种使用routes.php文件或类似方法将URI附加到控制器的模式。Laravel提供了使用PHP注释的选项,使操作变得更加容易。

但是对我来说,所有这些感觉都有点像代码重复,并且在创建/修改控制器逻辑时,必须始终保持路由文件在手。有趣的是,在几个旧框架中有一种更简单的方法,我以前也曾在我的旧项目中使用过这种方法:


控制器。src/controllers文件夹中的所有类(旧方法)或YourApp\Controllers名称空间中的所有类都通过向其添加“ Controller”而自动映射到URL的第一部分。示例:/auth映射到AuthController/product/...—到ProductController/—到default IndexController

行动。Action是URL的第二部分,它被映射到方法名称。因此,/auth/login将调用AuthController::loginAction()方法。如果没有提供第二部分,我们尝试indexAction()不想让人们访问某些内部方法吗?不要公开。

参数。URL的下一部分将被映射到方法的参数。如果参数列表中Application和/或Request类型提示,则将其跳过,以便可以正确地注入它们;我们可以通过Request照常访问GET / POST变量。

这是完整的示例,将所有这些功能结合在一起使用:

URL: https://example.com/shop/category/computers?country=US&sort=brand

namespace MyApp\Controllers;

class ShopController extends BaseController {
    public function categoryAction(Application $app, Request $req, $category, $subcategory = null) {
        echo $category; // computers
        echo $subcategory; // null, it's optional here
        echo $req->get('country'); // US
        echo $req->get('sort'); // brand
    }
}

我确信一开始似乎缺少一些熟悉的功能,但是我可以想到的所有功能都可以在需要时轻松添加-使用可附加的提供程序,连接中间件,将控制器分支到子控制器,指定HTTP方法,甚至执行一些操作预验证参数。非常灵活。


这种方法确实可以加快路由的创建和管理。因此,除了将所有路由都放在一个文件中(考虑到各种提供程序,在Silex中使用-> mount()或在Symfony中使用bundles,这也不总是正确的),现代框架似乎更喜欢这种方式进行MVC路由的原因是什么?在我描述的更简单的方式上?我想念什么?

钛合金

我将从Symfony / Silex的角度讲一下:

  1. 去耦。 routes.php提供URL映射和控制器的分离。您是否需要添加或更改URL?你直接去routes.php如果您想更改很多内容,非常方便。
  2. 灵活性。通常,这routes.php是一种更灵活的方法。SEO可能会发疯,并可能要求您使用类似的路线/shop_{shopName}/{categoryName}/someStaticKeyword/{anotherVar}这样routes.php您就可以轻松地将其映射到您的代码,但是如果您的路由直接映射到该代码,则可能会成为问题。甚至,您可以拥有唯一的控制器,而无需为每个斜杠部分编写控制器。您甚至可以让不同的控制器使用不同的可变部分来处理相同的URL,例如,/blog/[\d]+或者/blog/[a-z-]+由不同的控制器来处理(一个控制器可能会重定向到另一个控制器)。您可能永远不需要做这样的事情,但这只是这种方法灵活性的展示-一切皆有可能。
  3. 验证。要考虑的另一件事是routes.php通过->assert方法提供简单的验证方法。也就是说,routes.php不仅将URL映射到控制器方法,而且还确保这些URL符合特定要求,并且您不必在代码中执行此操作(在大多数情况下,这需要花费更多的代码来编写)。此外,您可以创建默认声称对一些变量,例如,你可以确保{page}{userId}总是\d+在单行routes.php,将采取所有用途的护理{page}{userId}
  4. URL生成。routes.php网址生成是网址的另一个功能您可以为任何路由分配任何名称(通过->bind()方法),然后根据该名称生成URL,并为部分URL更改提供变量。一旦有了这个系统并在整个代码中使用URL生成器,我们就可以随意更改URL,但是除了,我们不需要进行任何编辑routes.php再说一遍-这些都是灵活的名称,一旦URL更改并且您不受限制地选择名称,您就不必在整个项目中的任何地方进行更改。它可能比URL短得多,或者更冗长一些。
  5. 可维护性。说,您可能想要更改一些URL(如上例-从/blog/[\d+]/blog/[a-z-]+。此外,您可能希望将它们都保留一段时间,然后将旧的重定向到新的URL )。随着routes.php您只需添加一个新行,并添加一个待办事项备忘录,以在一段时间内将其删除,如果你想在以后将其删除。

当然,所有这些方法都可以通过任何方式实现。难道这就是这种简单,灵活,透明和紧凑的方法吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

此输出背后的原因是什么?

来自分类Dev

在Haskell中使用模式匹配时,两种函数定义样式背后的原因是什么?

来自分类Dev

在c#中使用#line指令更改错误或警告的默认行号的背后原因是什么?

来自分类Dev

在ISO BMFF或MP4文件中使用“免费”框的原因是什么?

来自分类Dev

HDFS上存储的文件不平衡背后的可能原因是什么?

来自分类Dev

HDFS上存储的文件不平衡背后的可能原因是什么?

来自分类Dev

在REST中使用异步功能的原因是什么?

来自分类Dev

在哈希码方法中使用^的原因是什么?

来自分类Dev

两步破坏对象背后的原因是什么?

来自分类Dev

AngularJS-指令-以下语法背后的原因是什么?

来自分类Dev

openshift错误无效ImageStreamTag背后的原因是什么?

来自分类Dev

该代码的“ False”输出背后的原因是什么?

来自分类Dev

该代码结果背后的原因是什么?

来自分类Dev

Tumblr主题中{block:Title}背后的原因是什么?

来自分类Dev

char 到 int 转换输出背后的原因是什么?

来自分类Dev

使用$(“ form”)。removeData(“ validator”)&$(“ form”)。removeData(“ unobtrusiveValidation”)的背后原因是什么?内部局部视图

来自分类Dev

在对CORS请求执行POST之前使用OPTION请求的背后原因是什么?

来自分类Dev

使用travelport Universal api时下面提到的错误/异常背后的原因是什么?

来自分类Dev

使用通配符导入的原因是什么?

来自分类Dev

为什么不能在类中使用静态方法/变量的原因是什么

来自分类Dev

什么是方法引用表达式求值null检查背后的原因是什么?

来自分类Dev

什么是期望值(数学)以及在quickSort中其背后的原因是什么?

来自分类Dev

在lambda函数中使用自动self(shared_from_this())变量的原因是什么?

来自分类Dev

有些人在目标C中使用GOTO语句的原因是什么?

来自分类Dev

在tsql存储过程中使用OPENQUERY的原因是什么?

来自分类Dev

在这些代码中使用这些匿名块调用超类方法的原因是什么?

来自分类Dev

在元素的类名中使用方括号的原因是什么?

来自分类Dev

在iOS音频通话APP中使用循环缓冲区的原因是什么?

来自分类Dev

人们在get中使用属性的原因是什么?组; 而不是田地?

Related 相关文章

  1. 1

    此输出背后的原因是什么?

  2. 2

    在Haskell中使用模式匹配时,两种函数定义样式背后的原因是什么?

  3. 3

    在c#中使用#line指令更改错误或警告的默认行号的背后原因是什么?

  4. 4

    在ISO BMFF或MP4文件中使用“免费”框的原因是什么?

  5. 5

    HDFS上存储的文件不平衡背后的可能原因是什么?

  6. 6

    HDFS上存储的文件不平衡背后的可能原因是什么?

  7. 7

    在REST中使用异步功能的原因是什么?

  8. 8

    在哈希码方法中使用^的原因是什么?

  9. 9

    两步破坏对象背后的原因是什么?

  10. 10

    AngularJS-指令-以下语法背后的原因是什么?

  11. 11

    openshift错误无效ImageStreamTag背后的原因是什么?

  12. 12

    该代码的“ False”输出背后的原因是什么?

  13. 13

    该代码结果背后的原因是什么?

  14. 14

    Tumblr主题中{block:Title}背后的原因是什么?

  15. 15

    char 到 int 转换输出背后的原因是什么?

  16. 16

    使用$(“ form”)。removeData(“ validator”)&$(“ form”)。removeData(“ unobtrusiveValidation”)的背后原因是什么?内部局部视图

  17. 17

    在对CORS请求执行POST之前使用OPTION请求的背后原因是什么?

  18. 18

    使用travelport Universal api时下面提到的错误/异常背后的原因是什么?

  19. 19

    使用通配符导入的原因是什么?

  20. 20

    为什么不能在类中使用静态方法/变量的原因是什么

  21. 21

    什么是方法引用表达式求值null检查背后的原因是什么?

  22. 22

    什么是期望值(数学)以及在quickSort中其背后的原因是什么?

  23. 23

    在lambda函数中使用自动self(shared_from_this())变量的原因是什么?

  24. 24

    有些人在目标C中使用GOTO语句的原因是什么?

  25. 25

    在tsql存储过程中使用OPENQUERY的原因是什么?

  26. 26

    在这些代码中使用这些匿名块调用超类方法的原因是什么?

  27. 27

    在元素的类名中使用方括号的原因是什么?

  28. 28

    在iOS音频通话APP中使用循环缓冲区的原因是什么?

  29. 29

    人们在get中使用属性的原因是什么?组; 而不是田地?

热门标签

归档