在HTTP Request类中实现不同的请求方法

时间:2013-02-04 07:39:28

标签: php oop http httprequest

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

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

那么,问题是什么?问题是,我想找到一些方法来分离请求依赖于方法 的附加函数(例如,我不希望有getQueryString()函数,当请求方法是PUT或POST时) 我想让班级为我做。此外,我希望保持类依赖性松散,因此整个系统将保持灵活性。

你知道任何解决像我这样的问题的设计模式,或者任何方法吗?

3 个答案:

答案 0 :(得分:0)

查看Symfony Components,它有一个非常好的Request类(在许多其他方面),所以你不必重新发明轮子。

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

答案 1 :(得分: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' ) );

答案 2 :(得分: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;
            // ...
        }
        // ...
    }
}

你怎么看?