2017-06-28 10 views
0

は、このような単純なsymfonyのProduct Entityと仮定する:Symfony3:StatusプロパティをTwigで翻訳するのに最適なPratice?

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="product") 
*/ 
class Product 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    private $name; 

    /** 
    * @ORM\Column(type="integer") 
    */ 
    private $status; 

} 

ステータスを整数としてデータベースに保存され、各整数は、人間が読み取り可能な値に対応するであろう:

0 =>削除さ
1 =>アクティブ
2 =>無効
...

私は小枝で製品を表示すると、私はこの人間が読めるSTATUを表示する必要があります私はそれを他の言語に翻訳できるはずです。

この問題の最善の回避策は何ですか? 私はEntityのStatusToString()メソッドについて考えていましたが、Twigを使用してEntitiesメソッドにアクセスする方法はわかりません。

+0

メソッドgetStatusAsString()を作成し、Twigテンプレートで使用することができます: 'entity.getStatusAsString()'または 'entity.statusAsString' – user3429660

+0

ステータステーブルm-1を追加することで、すべての可能なステータス 'とその名前を含んでいます。次に、product.status.nameを呼び出すだけで済みます(または、__toStringを追加してthis-> nameを追加し、twigだけでproduct.statusで足りる場合は、doctrine/translatableを使用して翻訳を提供できます)。 – Doug

答えて

2

2つの合理的なオプションがあります。あなたは

public function getStatusName(){ 
     switch($this->getStatus()){ 
      case 0: 
       return "Deleted"; 
      case 1: 
       return "Active"; 
      case 2: 
       return "Disabled"; 
     } 
} 

を持つことができ、あなたのProductエンティティ内

1. 次に、あなたのテンプレートの中、あなたは単にあなたが将来のことで生活がより簡単に開発することを検討でき

{{ product.statusName }} 

2. を呼び出す必要がありますすべての可能なステータス 'とその名前を含むステータステーブルm-1を追加します。

//Product.php 
/** 
* @ORM\ManyToOne(targetEntity="Status", inversedBy="products") 
*/ 
private $status 


//Status.php 
/** 
* @ORM\Column(type="name") 
*/ 
private $name; 

/** 
* @ORM\OneToMany(targetEntity="product") 
*/ 
private $products;  

次にあなたが呼び出すために、単に必要があります:

{{ product.status.name }} 

あなたはさらに一歩進み、追加することができます:

public function __toString(){ 
    return (string) $this->getName(); 
} 

次に、あなたのテンプレート内あなたは、単に呼び出すことができます。

{{ product.status }} 

へのトランジションの追加これはここで提供されるガイドに従うだけで簡単になります。http://atlantic18.github.io/DoctrineExtensions/doc/translatable.html

個人的には、オプション2を使用して、将来の証明に役立ちます。

ランダムなINTをコードに散らばっているレガシーコードで何度も処理する必要がありました。いくつかの人々は、コードの他の部分が引退のために1を使用するアクティブなレコードに1を使用しています。

テーブルをすべて使用して保存すると、ステータスを持つ可能性のあるすべてのエンティティに対して同じテーブルを再利用できます。

+0

私はあなたの第二の選択肢が本当に好きです!ありがとう! –

+0

ありがとうございました。それを使用している場合は、あなたのエンティティの残りの部分、例えばprivate $ idなどを設定する必要があることを覚えておいてください:) – Doug

関連する問題