2017-05-09 7 views
0

私はREST APIを持っていて、フィールドにAvatarというフィールドを持つUserというエンティティを持っていますが、DB Iの名前XXXX.jpgを保存しますが、アバター、例えばwww.mylink.com/XXXX.jpgsymfonyのパラメータをシリアル化するときのサブスクリプションハンドラインターフェイスの使用

サービスを試していますが、SubscribingHandlerInterfaceを実装していますが、どのように使用できるか分かりません。

私は、このサービスでは、この方法があります:

class UrlManager implements SubscribingHandlerInterface 
{ 

public static function getSubscribingMethods() 
{ 
    return array(
      array(
       'direction' => GraphNavigator::DIRECTION_SERIALIZATION, 
       'format' => 'json', 
       'type' => 'AppBundle/Entity/User', 
       'method' => 'serializeUrlAvatar', 
      ), 
     ); 

} 

    public function serializeUrlAvatar(User $user) 
{ 
    $url = 'www.mylink.com'; 
    return array(
     "avatar" => $url . $user->getAvatar() 
    ); 
} 
} 

が、どのように私は私がシリアライズ時にURLを変更するには、このサービスを呼び出すことができます。私はこのように、この関数を呼び出す私のコントローラで 更新

app.url_converter_service: 
    class: AppBundle\Service\UrlManager 
    tags: 
     - { name: jms_serializer.subscribing_handler } 

 $result = $this->get('app.url_converter_service')->serializeUrlAvatar($user); 
     $json = $this->get('jms_serializer')->serialize($result, $_format); 
     return new Response($json, 200, ['Content-Type' => 'application/' . $_format]); 

だから私の質問が存在し、あるservice.yml

$_format = 'json'; 
$json = $this->get('jms_serializer')->serialize($user, $_format); 
     return new Response($json, 200, ['Content-Type' => 'application/' . $_format]); 

: は、今私はこれを行います最初の行を削除し、私がシリアル化するとき(URLを追加)正しくシリアル化する方法?

+0

あなたは 'serializeUrlAvatar'の実装が不足しているようです - どこですか?単にデータ配列を変更して返すので、完了しました – LBA

+0

ああ、はい!申し訳ありませんが、質問を編集します。 – ximo12

+0

あなたの '$ json'の結果は何ですか? – LBA

答えて

0

このようなサービスを登録しましたか?

# app/config/services.yml 
avatar_url_handler: 
    class: YourBundle\Serializer\Handler\AvatarUrlHandler 
    tags: 
     - { name: jms_serializer.subscribing_handler } 
+0

はい、私はservice.yml' 'を持っている app.url_converter_service: クラス:AppBundle \サービス\ UrlManager タグ: - {名:jms_serializer.subscribing_handler} – ximo12

0

解決策が見つかりました。

user_uploads: 'https://myUrl.com' 

そして、私はシリアライズ任意のコントローラーで:私はこのようなparameters.ymluser_uploadsを持って

app.serializer_user_service: 
    class: AppBundle\Service\UserSerializeHandler 
    arguments: ['%user_uploads%'] 
    tags: 
     - { name: jms_serializer.event_subscriber } 

service.yml

class UserSerializeHandler implements EventSubscriberInterface 
{ 

private $user_uploads; 

public function __construct($user_uploads){ 
$this->user_uploads = $user_uploads; 
} 

public static function getSubscribedEvents() 
    { 
     return array(
      array(
       'event' => 'serializer.pre_serialize', 
       'class' => User::class, 
       'method' => 'onPreSerializeUser' 
      )); 

} 

public function onPreSerializeUser(PreSerializeEvent $event) 
    { 
     /** @var User $user */ 
     $user = $event->getObject(); 

     $avatar = $user->getAvatar(); 
     $user->setAvatar($this->user_uploads . "/" . $avatar); 
} 


} 

:私はこのようなEventSubscriberInterfaceを実装するサービスを作成しますユーザー、私はアバターのパラメターにURLを追加します。

$json = $this->get('jms_serializer')->serialize($user, $_format); 
return new Response($json, 200, ['Content-Type' => 'application/' . $_format]); 
関連する問題