Symfony 为什么Sonata Admin没有';不保存我的自定义原则字段?

Symfony 为什么Sonata Admin没有';不保存我的自定义原则字段?,symfony,doctrine-orm,doctrine,sonata-admin,symfony-sonata,Symfony,Doctrine Orm,Doctrine,Sonata Admin,Symfony Sonata,我写了有史以来最简单的货币类: class Money { private $amount; private $currency; // getters and setters here public function toArray() { return ['amount' => $this->amount, 'currency' => $this->currency]; } } 然后我创

我写了有史以来最简单的货币类:

class Money 
{
     private $amount;
     private $currency;

     // getters and setters here

     public function toArray() { 
          return ['amount' => $this->amount, 'currency' => $this->currency]; 
     }
}
然后我创建了Doctrine自定义类型,它扩展了Sonata的JsonType:

class MoneyType extends JsonType
{
    /**
     * @param Money $value
     * @param AbstractPlatform $platform
     * @return mixed|null|string
     */
    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return parent::convertToDatabaseValue($value->toArray(), $platform);
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return new Money(parent::convertToPHPValue($value, $platform));
    }

    public function getName()
    {
        return 'money';
    }
}
然后我将其添加到我的config.yml中:

doctrine:
    dbal:
        types:
            json: Sonata\Doctrine\Types\JsonType
            money: Enl\CurrencyBundle\Doctrine\Type\MoneyType
然后我为这个数据块添加了表单类型:

class MoneyType extends AbstractType
{
    // Some trivial getters and setters for dependencies here

    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName()
    {
        return 'enl_money';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults([
            'currencies' => $this->getPossibleCurrencies(),
            'data_class' => 'Enl\CurrencyBundle\Model\Money'
        ]);
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('currency', 'choice', ['choices' => $options['currencies'], 'required' => true])
            ->add('amount', 'number', ['required' => true]);
    }

    public function getParent()
    {
        return 'form';
    }
}
然后我将字段添加到我的模型中:

/**
 * @var Money
 * @ORM\Column(type="money", nullable=true)
 */
protected $price;
最后是我的奏鸣曲管理表:

    $form
        ->with('editor.dish', ['class' => 'col-md-8'])
            ->add('price', 'enl_money')
    // blah-blah-blah
问题是Sonata Admin没有保存表单值

我添加了var_dump($object);到Admin::update()方法-新值在对象中。 之后,我创建了简单测试:

    $dish = new Dish();
    $dish->setPrice(new Money(7000, "BYR"));

    $em = $this->getContainer()->get('doctrine.orm.entity_manager');
    $em->persist($dish);
    $em->flush();

它起作用了!我应该在Admin类中更改什么才能使其正常工作?

即使使用sonata,您也必须遵循symfony文档来创建和使用自定义类型。我确实遵循这个医生。我有自定义表单类型和自定义条令类型。一切看起来都正常(表单类型定义正确),并且在readok上工作(当我通过PhpMyAdmin将json粘贴到列中时,会填充表单小部件)。问题出在奏鸣曲结构的某个地方。或者,这是一个错误。