声明资源控制器
由于数据由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资源并添加名为download或embed的targets_action。在回调中,只需发送文件mime-type的标头,然后使用fpasshru()或echo file_get_contents()呈现文件内容。