php - 用于奏鸣曲管理编辑表单的 ValueObject 而不是实体

标签 php symfony sonata-admin

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

<?php
declare(strict_types=1);

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

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

有什么方法可以将数据形式传递给 ValueObject 并在验证后将数据传递给实体吗?我不想让实体中的每个字段都可以为空。

创建新记录的 setter/getter 的情况相同。

最佳答案

我们使用自定义模型管理器,可以与 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)并更新管理配置

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

关于php - 用于奏鸣曲管理编辑表单的 ValueObject 而不是实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55491527/

相关文章:

php - Twig - 如何随机化数组中的项目并循环它们?

php - 如何在数据库中存储多语言网站信息?

symfony - 使用 Sonata Admin 更新以编程方式创建的对象的 ACL

php - 扩展 Doctrine2 形式 EntityType

forms - Symfony2 - 在包外使用奏鸣曲字段类型

php - 在查询中包含变量($ lecno)时,SQL查询出错

php - 从 WP_Query 中排除没有评论的 WooCommerce 产品

php - 如何在 php symfony2 doctrine2 的 DateTime 字段中添加年份

php - 软件架构: Service Dependency - Inject Container or concret class

php - symfony2以管理员用户身份访问私有(private)文件