我目前正在开发一个开源的RMR框架。目前,资源表示是在资源本身中加载和解析的,就像下面的例子一样(这是抽象级别的,为了缩短本文的篇幅,有些部分被删除了):
/**
* Processes a given request and returns a response. Makes use of a
* data source for data retrieval and an array of parameters
* (usually passed in from the route).
*
* @param Request $request
* @param mixed $dataSource
* @param array $parameters
* @return Response
*/
public function processRequest(Request $request, $dataSource, array $parameters)
{
$method = strtolower($request->getMethod());
$this->dataSource = $dataSource;
$this->parameters = $parameters;
$this->request = $request;
if(method_exists($this, $method))
{
// Something like get, post, head in resources
$data = $this->$method();
$response = new Response(StatusCode::HTTP_OK);
if(empty($data))
{
// Do some stuff, return 200 ok no message-body etc.
}
// Find preferred media type in request accept
$mediaType = $request->getMediaType();
// .. loop through find representation ..
// Representation is reponsible for adding its own headers and body to
// response, does this make sense to you?
$representation->parse($response, $data);
return $response;
}
else
{
return new Response(StatusCode::HTTP_METHOD_NOT_ALLOWED);
}
}
所以我的问题真的是让资源处理加载自己的表示,然后设置响应头和正文的表示有意义吗?
你推荐的方法是什么?
留给操作请求、响应和资源的RepresentationResolver
。保持类的小而明显。
interface RepresentationResolver
{
/**
* @return Representation
*/
public function resolve();
}
class DataRepresentationResolver implements RepresentationResolver
{
public function __construct(your arguments)
{
}
public function resolve()
{
...
$representation = $this->getRepresentation($this->data);
}
}
当你编译响应时:
$resolver = new DataRepresentationResolver(your arguments);
$representation = $resolver->resolve();
$representation->parse($response, $data);
您可以对任何类型或RepresentationResolver
进行编码,您认为合适,甚至是这样的家族,例如使用特定的请求类型或您指定的特定类型的媒体类型(例如通过mime-type)。