Symfony 3:获得 Status 属性 在 Twig 上翻译的最佳实践?

Symfony3: Best Pratice to get Status property translated on Twig?

假设一个简单的 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;

}

状态将以整数形式存储在数据库中,每个整数将对应一个人类可读的值:

0 => 已删除
1 => 活动
2 => 禁用
...

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

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

您有 2 个合理的选择。

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

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

然后在您的模板中,您只需调用

{{ product.statusName }}

2。 您可以考虑通过添加包含所有可能状态及其名称的状态 table 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 表示退休。

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