索纳塔管理员编辑表单而不是实体的值对象



>对于编辑实体,我们将纯实体类传递给Symfony Form例如:

<?php
declare(strict_types=1);
class Foo 
{
    // private properties
    public function setFoo(?string $foo): void
    {
        $this->foo = $foo;
    }
    // more setters
}

这种情况很糟糕,因为目前我们的实体处于无效状态。

有没有办法将数据表单传递给 ValueObject 并在验证后将数据传递到实体?我不想在实体中的每个字段都为空。

创造

新记录的获取者也是如此。

我们使用自定义模型管理器,它可以与dto一起使用,你可以在这里找到它 https://gitlab.com/symfony-bro/sonata-things/blob/master/Admin/ModelManager/AbstractDtoManager.php不幸的是,我们在内部项目中使用它,所以没有文档。这是如何使用的简短示例:

use SymfonyBroSonataThingsAdminModelManagerAbstractDtoManager;
class CatalogModelManager extends AbstractDtoManager
{
    protected function doCreate($dto)
    {
        $result = new Catalog($dto->title, $dto->parent);
        $result->setDescription($dto->description);
        return $result;
    }
    protected function getModelClassName(): string
    {
        return CatalogDto::class;
    }
    protected function getSubjectClass(): string
    {
        return Catalog::class;
    }
}

您应该将其定义为服务(例如app_inventory.sonata_admin.catalog_model_manager(并更新管理员配置

    app_inventory.admin.catalog:
        class: 'AppInventoryBundleAdminCatalogAdmin'
        arguments: [~, 'AppInventoryBundleEntityCatalog', 'SonataAdminBundle:CRUD']
        calls:
            - ['setModelManager', ['@app_inventory.sonata_admin.catalog_model_manager']]
        tags:
            - { name: 'sonata.admin', manager_type: 'orm', group: 'Equipment', label: 'Equipment type' }

这是DTO

class CatalogDto
{
    public $id;
    public $title;
    public $description;
    public $parent;
    public $items;
    public function __construct()
    {
        $this->items = [];
    }
    public function getId()
    {
        return $this->id;
    }
    public function __toString()
    {
        return (string)$this->title;
    }
}

最新更新