RMR架构——在这一点上加载表示和头文件是有意义的


RMR Architecture - At which point does it make sense to load the representation and headers?

我目前正在开发一个开源的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)。