我正在编写自己的 HTTP Request 类,我遇到了一个小问题。您可能知道,PHP中有许多请求方法,例如 OPTIONS , GET , POST , PUT , HEAD 等,但您不能在一个请求中混合使用其中的两个或多个。这就是我的问题开始的地方。
我有HTTPRequest类,它有两个静态方法,创建它的实例 - create(),创建自定义HTTP请求和 createFromGlobals(),以创建实例服务器收到的当前请求。
那么,问题是什么?问题是,我想找到一些方法来分离请求依赖于方法 的附加函数(例如,我不希望有getQueryString()函数,当请求方法是PUT或POST时) 我想让班级为我做。此外,我希望保持类依赖性松散,因此整个系统将保持灵活性。
你知道任何解决像我这样的问题的设计模式,或者任何方法吗?
答案 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;
// ...
}
// ...
}
}
你怎么看?