0

私は現在、独自のHTTP Requestクラスを作成していますが、小さな問題が発生しました。ご存じのとおり、PHP にはOPTIONSGETPOSTPUTHEADなどの多くのリクエスト メソッドがありますが、1 つのリクエストにそれらの 2 つ以上を混在させることはできません。そして、これが私の問題の始まりです。

サーバーによって受信された現在のリクエストのインスタンスを作成するためのcreate()カスタム HTTP リクエストとcreateFromGlobals()を作成する 2 つの静的メソッドを持つ HTTPRequest クラスがあります。

だから問題は何ですか?問題は、メソッドに依存するリクエストの追加機能を分離する方法を見つけたい(たとえば、リクエスト メソッドが 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

Symfony Components をチェックしてください。非常に優れた Request クラス (他の多くのものの中でも) があるため、車輪を再発明する必要はありません。

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

于 2013-02-04T07:41:17.433 に答える
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 に答える