ZF2原则中的货币格式输入值

时间:2014-06-06 08:55:17

标签: php doctrine-orm zend-framework2

当我保存表单时,我可以使用inputfilter自动格式化该值。当我为表格水合以编辑物体时,这也可以吗?

所以我有一个Doctrine对象。在这个对象中,我有一个类似" 5.95"的货币价值。但我想在文本输入中显示为" 5,95"

1 个答案:

答案 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);

正如您所看到的,这种实现非常简单,但它可以为您的代码节省大量复杂性。这个例子显然不是很完美,但这是一个好的开始。