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