假设一个简单的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访问实体方法。
答案 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作为退役。
使用表来存储所有内容,也意味着您可以为每个可能具有状态的实体重用相同的表。