0

我正在使用 Drupal服务services_entity模块来构建 Web 服务。问题是,当使用字段等将文件附加到实体时,服务端点将文件显示为资源引用,如下所示:

array (
    resource: file,
    id: xx,
    uri: /entity_file/xx.json
)

问题是,每次您希望显示一个文件时,您都必须提出 2 个或更多请求:

  • 一、获取文件实体URI
  • 其次,通过 id 检索文件实体的详细信息以获取文件的直接url(可以嵌入到应用程序中,也可以用作 img 标签的 src="xx"。

问题是,如何直接获取文件 URL 而无需发出额外的请求。因此,首选的响应是:

array (
    resource: file,
    id: xx,
    uri: /entity_file/xx.json,
    url: http://.../sites/.../files/foo/bar/b-reft.jpg
)

我找了几个小时但没有找到答案,所以我想我会分享我找到的解决方案。我相信它会帮助很多人(我也希望我可以分享我的模块以支持services_entity模块的复杂索引查询参数)。

4

1 回答 1

0

声明资源控制器

由于数据由ServicesEntityResourceController返回,我决定使用hook_services_entity_resource_info()声明我自己的资源控制器。

/**
 * Implements hook_entity_resource_info()
 */
function c11n_services_entity_resource_info() {

    $output = array();

    $output['c11n'] = array (
        'title' => 'Clean Entity Processor - Customized',
        'description' => 'An entity wrapper based on the "Clean Entity Wrapper" wrapper with certain fixes and improvements.',
        'class' => 'ServicesEntityResourceControllerC11n',
    );

    return $output;

}

声明控制器类

在此之后,我声明了控制器类:

ServicesEntityResourceControllerC11n extends ServicesEntityResourceControllerClean

覆盖 get_resource_reference() 方法

最后一步(toque final)是添加文件 URL。我决定处理父类的输出并添加文件的 URL。实际数据由ServicesEntityResourceController::get_resource_reference()方法返回。所以,我像这样覆盖它并完成了。

protected function get_resource_reference($resource, $id) {

    $output = parent::get_resource_reference($resource, $id);

    switch ($resource):
        case 'file':
            $file = file_load($id);
            if ($file)
                $output['url'] = file_create_url($file->uri);
            break;
        case 'taxonomy_term':
            // Do something for taxonomy terms
            break;
    endswitch;

    return $output;

}

它解决了这个问题。但是,我并不认为它是最好的解决方案,但有一些解决方案总比没有好。

替代解决方案

您可以更改entity_file资源并添加名为downloadembed的targets_action。在回调中,只需发送文件mime-type的标头,然后使用fpasshru()echo file_get_contents()呈现文件内容。

于 2016-05-04T16:39:44.357 回答