Reputation: 153
Curently for edit entity, we pass pure Entity class to Symfony Form for example:
<?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? I don't want to have nullable every field in entity.
The same situation for getters for create new record.
Upvotes: 2
Views: 630
Reputation: 158
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. 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.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
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;
}
}
Upvotes: 3