Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用子控制器的替代路由方法的缺点是什么?_Php_Dependency Injection_Routes_Controller - Fatal编程技术网

Php 使用子控制器的替代路由方法的缺点是什么?

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']],

我正在写一个PHP CMS,我对实现路由有一些疑问 加载页面控制器并“处理”它的系统

我见过许多其他人实施这样的路线:

//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
这看起来很复杂,但实际上比“传统”路由方法更具逻辑性和简单性。也许有人以前真的做过这件事。
与传统方法相比,这种方法有哪些缺点?

他们或多或少做着同样的工作。

如果有任何疑问、批评或其他,请发表评论!如果有任何疑问,批评或什么,请评论!