Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.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中处理POST请求的最佳实践_Php_Post - Fatal编程技术网

在PHP中处理POST请求的最佳实践

在PHP中处理POST请求的最佳实践,php,post,Php,Post,我正在从事一个PHP项目,其中有许多页面调用POST请求,如登录、注册、评论等 我尝试在一个名为POST.php的文件中处理所有POST请求,每个请求都包含'formtype'参数,如下所示 $formtype = $_POST['formtype']; if ($formtype == "register") { register_function_here(); } else if ($formtype == 'login') { login_function_here();

我正在从事一个PHP项目,其中有许多页面调用POST请求,如登录、注册、评论等

我尝试在一个名为POST.php的文件中处理所有POST请求,每个请求都包含'formtype'参数,如下所示

$formtype = $_POST['formtype'];
if ($formtype == "register") {
    register_function_here();
} else if ($formtype == 'login') {
    login_function_here();
} else {
    die("Error: No FORMTYPE");
}
我还尝试过为单独的函数创建单独的文件,比如login.php、register.php、comment.php等等

哪种方法更适合处理POST请求? 像我所做的那样,在一个文件中处理所有POST请求有什么缺点吗


提前谢谢

我强烈推荐面向对象编程,使用类,每个类一个源文件。

我想你的意思是你不想:

GET index.php
POST user/register.php
POST user/login.php

index.php
user/
    register.php
    login.php
404.php
@ArtisticPhoenix关于MVC模型、视图和控制器的内容实际上就是您所尝试的。嗯,对于控制器部分,我是说。 您尝试创建路由器

你可以这么做。如果你是新的编码,你有时间,我甚至会说:做它。 如果你没有时间,需要一个解决方案,那么我建议搜索一个框架——至少是路由

要开始,请执行以下操作:

首先我发现的是:

如果您想更进一步,那么应该开始使用OOP。 然后,类是控制器,方法是动作。 有些人认为每一个动作都是一个类,就像zend表达框架一样

例如:

创建路由配置

// file: config/routes.php
return [
    'routes' => [
        [
            'path'            => "/login",
            'class'           => LoginController::class,
            'method'          => 'loginAction',
            'allowed_methods' => ['POST'],
        ],
        [
            'path'            => "/logout",
            'class'           => LoginController::class,
            'method'          => 'logoutAction',
            'allowed_methods' => ['GET', 'POST'],
        ],
        // ...
    ],
];
创建控制器

// file: Controller/LoginController.php
namespace Controller;
class LoginController
{
    public function loginAction()
    {
        // ...
    }

    public function logoutAction()
    {
        // ...
    }
}
现在使用请求的路径并将其路由到控制器

如果未找到路由,则返回HTTP 404 Not found响应

// file: index.php
// load routing config
$routes = require 'config/routes.php';
// ...
// ... this now is up to you. 
// you should search in the config if the requested path exists
// and if the request is in the allowed_methods
// and then create a new controller and call the method.

我喜欢用带有独立控制器方法的MVC来完成这篇文章,但如果不使用框架MVC模式,就很难做到这一点,或者更好,CQRS模式应该适合您的需要,至少如果您想继续学习您的知识的话。你可以在互联网上找到大量关于这些模式的文档。你尝试在一个脚本中压缩的代码越多,它可能会变得越令人头痛,分离关注点会有帮助。拥有一个config/routes文件夹对我来说似乎是一件痛苦的事,任何时候你想重命名,添加或删除一个方法或添加一个控制器,您需要记住也要更新路由器。我更喜欢使用routefinder类检查控制器是否存在,然后让控制器决定methodrequest是否有效,如果无效,则设置回退。这样,任何更改或新类都独立于routefinder,反之亦然。您还可以在请求的顶层返回到一个通用错误,默认值都是invalid@jameson2012你是说像一个动态路由器/foo/bar到FooController::barAction(如果存在)?当然,有些人会这样做。但这可能会造成问题。F.e.实际上应该禁用的控制器。或者有一天/controller/method模式不再适合您的需要。或者你只需要快速禁用一个控制器。配置驱动的路由具有更大的优势|控制。但ofc取决于……是的,这确实是课程的马匹和架构师的偏好——在你的两个例子中,虽然我总是可以在控制器构造中返回一个false,所以我总是只有一个地方可以查看——这更可能是对我缺乏记忆/倾向的评论!无论哪种方式,有选择都很好!: