リソース コントローラーを宣言する
データは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またはembeddedという名前のtargets_actionを追加できます。コールバックでは、単純にファイルのmime-typeのヘッダーを送信し、次に fpassthru()またはecho file_get_contents()を使用してファイルの内容をレンダリングします。