Php 使用子控制器的替代路由方法的缺点是什么?
我正在写一个PHP CMS,我对实现路由有一些疑问 加载页面控制器并“处理”它的系统 我见过许多其他人实施这样的路线:Php 使用子控制器的替代路由方法的缺点是什么?,php,dependency-injection,routes,controller,Php,Dependency Injection,Routes,Controller,我正在写一个PHP CMS,我对实现路由有一些疑问 加载页面控制器并“处理”它的系统 我见过许多其他人实施这样的路线: //these values are actually retrieved from a file return [ ['GET', '/', ['Controllers\Homepage', 'show']], ['GET', '/user/recover/{token}', ['Controllers\User\Recover', 'recover']],
//these values are actually retrieved from a file
return [
['GET', '/', ['Controllers\Homepage', 'show']],
['GET', '/user/recover/{token}', ['Controllers\User\Recover', 'recover']],
['GET', '/recover/{token}', ['Controllers\User\Recover', 'recover']],
['POST', '/user/login', ['Controllers\User\Login', 'login']],
['POST', '/login', ['Controllers\User\Login', 'login']],
['POST', '/user/register', ['Controllers\User\Register', 'register']],
['GET', '/foo/bar', ['Controllers\Idk', 'show']],
];
但我真的不喜欢它,原因如下:如果我调用
example.com/user/recover/{token}
和example.com/recover/{token}
控制器在处理请求时需要区分这两个URL,因为{token}
位于不同的位置,并且在控制器中有额外的步骤来加载路由。另外,我更喜欢一个特定的根与它自己的控制器相关 所以我想到了这个主意: 应用程序只检查url(
https://example.com/firstparameter/secondparameter/third/etc
)
并从数据库加载与第一个参数关联的控制器名称
# don't worry, this is actually optimized with db normalization
+----------------+---------------------+-------------------+--------+
| id | title | controller_name | active |
+----------------+---------------------+-------------------+--------+
| firstparameter | just the page title | mycontroller | (true) |
| user | user page | usercontroller | (true) |
| recover | recover | recovercontroller | (true) |
+----------------+---------------------+-------------------+--------+
由于大多数页面都有自己的标题、描述等,并且所有页面都有一个controller\u名称
,因此几乎总是需要通过路由方法独立进行此数据库调用。因此,当一切都可以“在一起”时,我不认为有必要使用存储路由的文件 所以如果我调用
example.com/user/recover/{token}
然后应用程序加载usercontroller
(使用其依赖项构造它),然后调用usercontroller->init()
(注意:在这里,出于简单性的考虑,我没有使用不同的/动态方法名称,因为这些名称只能由每个页面的控制器处理。无论如何,以后可以很容易地实现) 此控制器中的
init()
函数处理其整个页面根/user/*
,并相应地加载其子页面/子页面(如果有)
function init(){
if( secondparameter is user )
/* the second parameter becomes the first, so the
* recovercontroller doens't need to do magic to get the url token
* for the recovercontroller the request will be almost the same
* as calling example.com/recover/{token}
*/
currenturl = arrayshift(currenturl)
recover = new recovercontroller()
recovercontroller->init()
return
这看起来很复杂,但实际上比“传统”路由方法更具逻辑性和简单性。也许有人以前真的做过这件事。与传统方法相比,这种方法有哪些缺点?
他们或多或少做着同样的工作。如果有任何疑问、批评或其他,请发表评论!如果有任何疑问,批评或什么,请评论!