php - 奏鸣曲管理员编辑表单而不是实体的 ValueObject
问题描述
目前对于编辑实体,我们将纯 Entity 类传递给 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 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;
}
}
推荐阅读
- android - 在 Room 的 where 子句中使用 List
- payment-request-api - 在支付请求 API 中更改产品数量
- php - 使用 phpSpreadSheet 在 excel 中合并
- typescript - 使用 FilterPredicate 和另一个函数过滤数据
- docker - 远程标记 docker 镜像
- pdf - 在 MediaWiki 中打开 PDF
- regex - 用于解析字符串的 Python 正则表达式
- javascript - 过滤数组以仅保留每个 ID 具有最新日期的元素
- rest - 使用球衣在飞行前请求后解析请求时出现异常
- spring-boot - Spring Boot gradle kotlin 构建