VichUploaderBundleでpathではなくURIを表示する

VichUploaderBundleでpathではなくURIを表示する

May 26, 2016,
tags: symfony php


このエントリーをはてなブックマークに追加

Symfonyのファイルアップロードで便利なサービスと言えばVichUploaderBundleですよね。 そんなVichUploaderBndleを使っている状況でog:imageの設定でハマってしまいました。

vich_uploader_assetはpathしか表示されない

Twigで画像のパスを取得するときvich_uploader_assetを使うと思います。 でassertの実装を見ると一見URIが返ってくるかのように錯覚してしまいます。

UploaderHelper.php

$this->storage->resolveUri($obj, $fieldName, $className);

こりゃ勘違いするでしょ。 resolveUriってURIを取得できるように思ってしまいますよね。

まあコメントみるとpathが返ってくると書いてありますが・・・w

@return string The public asset path.

どうやってtwigで画像のURIを表示するのか?

og:imageで画像を指定するときは当たり前ですが、pathではなくてuriを表示しなきゃいけないですよね。

方法としては2つあると思います。

  1. vich_uploader_assetの代わりのtwig関数を自作する
  2. twigのテンプレートの中で他の関数と組み合わせて何とかする

vich_uploader_assetの代わりのtwig関数を自作する

requestがscopeの制約があって、直接Injectできないとかあってめんどくさいんですが一応こんな感じに実装すれば、uri表示するTwig関数が作れます。

ちょっとめんどくさいですね。。

twigの他の関数と組み合わせて何とかする

Twigの関数用意するのとかだるいって人は、実はtwigの中で同じようなことが出来てしまいます。

<meta property="og:image" content="{{ app.request.getUriForPath(vich_uploader_asset(hoge,"imageFile")) }}" />

たったこれだけで出来てしまいます。 どちらが良いかは、そのチームやプロジェクトによるのではないでしょうか?

getUriForPathについて

結局両方のやり方もrequestオブジェクトのgetUriForPathを利用しているだけです。 getUirForPathの実装はすごく簡単なものです。 Request.php

最後に

ちょっとコードを読めばSymfonyの様々なことを理解出来ると思います。
特にRequest,Responseオブジェクトあたりはアプリケーションを実装するうえでよく使うクラスになります。
ぜひ一度コーヒー片手におしゃれな感じでコードを読んでみてはいかがでしょうか?

それからVichUploaderBundleの基本的な使い方に関してはVichUploaderBundleを使ってみた に詳しく載っているのでそちらを参考にするとすぐに使えるようになると思います。

comments powered by Disqus