当我保存表单时,我可以使用inputfilter自动格式化该值。当我为表格水合以编辑物体时,这也可以吗?
所以我有一个Doctrine对象。在这个对象中,我有一个类似" 5.95"的货币价值。但我想在文本输入中显示为" 5,95"
答案 0 :(得分:0)
我可以给你一个代码示例(警告;我没有测试过它!),假设ORM\Entity\SomeTable
是你的Doctrine实体,Hydrator将如何工作。为了这个例子,我们也假设所有实体都实现了ORM\Entity\EntityInterface
。
您首先想要做的是创建一个名为ORM\Hydrator\HydratorInterface
的新界面,该界面将用于保湿实体。然后该接口将被任何其他保湿器使用,以确保它们完全相同并且可以更容易地识别。
<?php
namespace ORM\Hydrator;
/**
* HydratorInterface provides a template to functionality which
* every hydrator needs to implement.
*/
interface HydratorInterface
{
/**
* Inflates an entity with the given array.
*
* @param \ArrayAccess $data
* @return \ORM\Entity\EntityInterface
*/
public static function inflate(array $data, \ORM\Entity\EntityInterface $entity = null);
/**
* Deflates an entity and returns an array of data.
*
* @param \ORM\Entity\EntityInterface $entity
* @return array
*/
public static function deflate(\ORM\Entity\EntityInterface $entity);
}
在界面中,我们定义了inflate()
方法,需要数据为您提供一个Doctrine对象。这里的deflate()
方法将从您的实体检索属性并返回一个普通数组。这是您的问题将得到解答的地方。
为了这个例子,我们现在将跳过inflate()
方法,因为这与你的问题相反,但是我非常乐意详细说明这个问题。
现在我们将创建水槽对象,它将实现界面,以及所有魔法发生的地方。
<?php
namespace ORM\Hydrator;
use HydratorInterface;
class SomeTable implements HydratorInterface
{
/**
* @inheritdoc
*/
public static function inflate(array $data, \ORM\Entity\EntityInterface $entity = null)
{
// We'll leave this method for now.
}
/**
* @inheritdoc
*/
public static function deflate(\ORM\Entity\EntityInterface $entity)
{
// First you'll want to check if the entity provided, is also the
// one we expect it to be
if (!($entity instanceof \ORM\Entity\SomeTable)) {
// Unfortunately not, let's get it out
throw new Exception\InvalidArgumentException(sprintf(
"Expected instance of %s, received %s.",
'ORM\Entity\SomeTable',
get_class($entity)
));
}
// And now, the simple deflation begins
return array(
// Format the currency to Dutch decimal points
'myAmount' => number_format($entity->getMyAmount(), 2, ',', '.')
);
}
}
现在使用它只需执行以下操作:
// Assuming $entity is your entity
$deflatedEntity = \ORM\Hydrator\SomeTable::deflate($entity);
正如您所看到的,这种实现非常简单,但它可以为您的代码节省大量复杂性。这个例子显然不是很完美,但这是一个好的开始。