ValueObject для формы редактирования администратора сонаты вместо сущности - PullRequest
0 голосов
/ 03 апреля 2019

В настоящее время для редактирования сущности мы передаем чистый класс сущности в форму Symfony, например:

<?php
declare(strict_types=1);

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

эта ситуация плохая, потому что на мгновение мы имеем сущность в недопустимом состоянии.

любой способ передать форму данных в ValueObject и после проверки передать данные в Entity?Я не хочу обнулять каждое поле в сущности.

Та же самая ситуация для получателей для создания новой записи.

1 Ответ

1 голос
/ 03 апреля 2019

Мы используем специальный менеджер моделей, который может работать с 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;
    }
}
...