Symfony3:在Twig上翻译Status属性的最佳实践?

时间:2017-06-28 12:57:09

标签: php symfony twig translation

假设一个简单的Symfony Product Entity是这样的:

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;

}

状态将作为整数存储在DataBase中,每个整数将与人类可读的值对应:

0 =>删除了 1 =>积极的 2 =>禁用
...

当我在Twig上显示产品时,我需要显示这个人类可读的状态字符串,我应该能够将其翻译成其他语言。

这个问题的最佳解决方法是什么? 我正在考虑实体上的StatusToString()方法,但我不知道如何使用Twig访问实体方法。

1 个答案:

答案 0 :(得分:2)

您有2个合理的选择。

1。 在您的产品实体中,您可以拥有

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

然后在你的模板中你只需要打电话

{{ 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作为退役。

使用表来存储所有内容,也意味着您可以为每个可能具有状态的实体重用相同的表。