0

我目前正在编写自己的HTTP 请求类,但遇到了一个小问题。您可能知道,PHP 中有许多请求方法,例如OPTIONSGETPOSTPUTHEAD等,但您不能在一个请求中混合使用两个或多个。这就是我的问题开始的地方。

我有 HTTPRequest 类,它有两个静态方法,创建它的实例 - create(),创建自定义 HTTP 请求和createFromGlobals(),创建服务器收到的当前请求的实例。

所以有什么问题?问题是,我想找到一些方法来分离依赖于方法的请求附加函数(例如,当请求方法是 PUT 或 POST 时,我不希望有 getQueryString() 函数)并且我希望类这样做为了我。另外,我想保持类依赖松散,所以整个系统将保持灵活。

您是否知道任何可以解决像我这样的问题的设计模式,或者有什么方法可以做到这一点?

4

3 回答 3

0

我可能会实现您想要实现的目标,类似于此(但请记住我关于查询字符串对 POST 请求有效的评论。至少,据我所知):

abstract class HTTPRequest
{
    public static function createFromGlobals()
    {
        $method = $_SERVER[ 'REQUEST_METHOD' ];

        /* initialize additional arguments from globals */

        return self::create( $method /*, additional arguments */ );
    }

    public static function create()
    {
        $arguments = func_get_args();
        $method = array_shift( $arguments );
        $method = ucfirst( strtolower( $method ) );

        $className = __CLASS__ . $method;
        if( !class_exists( $className ) )
        {
            throw new Exception( 'Implementation for method ' . $method . ' not found' );
        }

        $reflector = new ReflectionClass( $className );

        return $reflector->newInstanceArgs( $arguments );
    }

    /* implement common functionality */
}

class HTTPRequestGet
    extends HTTPRequest
{
    /* implement additional GET functionality */
}

class HTTPRequestPost
    extends HTTPRequest
{
    /* implement additional POST functionality */
}

/* etc... */

用法:

$requestFromGlobals = HTTPRequest::createFromGlobals();
$customRequest = HTTPRequest::create( 'post', array( 'additional', 'arguments' ) );
于 2013-02-04T08:13:45.603 回答
0

我正在考虑这样的事情:

<?php

class HTTPRequest
{
    protected $method;
    public $parameters
    // ...

    public static function create(/* ... */)
    {
        // ...
        switch ($this->method)
        {
            case 'GET':
                $this->parameters = new Parameters($_GET);
                break;
            case 'POST':
                $this->parameters = array(
                    'post' => new Parameters($_POST),
                    'files' => new Parameters($_FILES)
                );
                break;
            // ...
        }
        // ...
    }
}

你怎么看待这件事?

于 2013-02-05T08:58:02.653 回答
0

查看 Symfony 组件,它有一个非常好的 Request 类(以及许多其他东西),所以你不必重新发明轮子。

http://api.symfony.com/2.0/Symfony/Component/HttpFoundation/Request.html

于 2013-02-04T07:41:17.433 回答