簡體   English   中英

奏鳴曲管理員編輯表單(而不是實體)的ValueObject

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

當前,對於編輯實體,我們將純Entity類傳遞給Symfony Form,例如:

<?php
declare(strict_types=1);

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

這種情況很糟糕,因為我們暫時使實體處於無效狀態。

有什么方法可以將數據表單傳遞給ValueObject並在驗證之后將數據傳遞給Entity? 我不想實體中的每個字段都可以為空。

獲取器創建新記錄的情況相同。

我們使用可以與dto一起使用的自定義模型管理器,您可以在這里找到它https://gitlab.com/symfony-bro/sonata-things/blob/master/Admin/ModelManager/AbstractDtoManager.php不幸的是,我們在內部項目,因此沒有文檔。 這是一個簡短的示例如何使用:

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

您應該將此定義為服務(例如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' }

這是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