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

于 2016-05-04T16:39:44.357 に答える