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