简体   繁体   English

奏鸣曲管理员编辑表单(而不是实体)的ValueObject

[英]ValueObject for sonata admin edit form instead of entity

Curently for edit entity, we pass pure Entity class to Symfony Form for example: 当前,对于编辑实体,我们将纯Entity类传递给Symfony Form,例如:

<?php
declare(strict_types=1);

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

this situation is bad because for a moment we have entity in invalid state. 这种情况很糟糕,因为我们暂时使实体处于无效状态。

Is any way to pass data form to ValueObject and after validation pass data into Entity? 有什么方法可以将数据表单传递给ValueObject并在验证之后将数据传递给Entity? I don't want to have nullable every field in entity. 我不想实体中的每个字段都可以为空。

The same situation for getters for create new record. 获取器创建新记录的情况相同。

We use custom model manager, that can works with dto, you can find it here https://gitlab.com/symfony-bro/sonata-things/blob/master/Admin/ModelManager/AbstractDtoManager.php Unfortunately we are using it in internaly projects, so no documentation. 我们使用可以与dto一起使用的自定义模型管理器,您可以在这里找到它https://gitlab.com/symfony-bro/sonata-things/blob/master/Admin/ModelManager/AbstractDtoManager.php不幸的是,我们在内部项目,因此没有文档。 This is short example how to use: 这是一个简短的示例如何使用:

use SymfonyBro\SonataThings\Admin\ModelManager\AbstractDtoManager;

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;
    }
}

You should define this as service (for example app_inventory.sonata_admin.catalog_model_manager ) and update admin config 您应该将此定义为服务(例如app_inventory.sonata_admin.catalog_model_manager )并更新admin配置

    app_inventory.admin.catalog:
        class: 'App\InventoryBundle\Admin\CatalogAdmin'
        arguments: [~, 'App\InventoryBundle\Entity\Catalog', 'SonataAdminBundle:CRUD']
        calls:
            - ['setModelManager', ['@app_inventory.sonata_admin.catalog_model_manager']]
        tags:
            - { name: 'sonata.admin', manager_type: 'orm', group: 'Equipment', label: 'Equipment type' }

and this is dto 这是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;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM