Skip to content

Latest commit

 

History

History
65 lines (49 loc) · 2.25 KB

cloner.md

File metadata and controls

65 lines (49 loc) · 2.25 KB

Cloner

Описание

Cloner - сервис клонирования сущностей.

Использование

1. Помечаем сущность как клонируемую, используя аннотацию "Darvin\Utils\Mapping\Annotation\Clonable\Clonable".

С помощью аргумента "copyingPolicy" можно выбрать одну из двух стратегий копирования свойств:

  • "NONE" (по умолчанию): копировать значения только тех свойств, которые помечены "Darvin\Utils\Mapping\Annotation\Clonable\Copy";
  • "ALL": копировать значения всех свойств, за исключением помеченных аннотацией "Darvin\Utils\Mapping\Annotation\Clonable\Skip".

Особенности:

  • идентификатор сущности не должен быть копируемым;
  • если значением свойства является сущность, она должна быть также клонируемой.

Пример клонируемой сущности:

use Darvin\Utils\Mapping\Annotation\Clonable as Clonable;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @Clonable\Clonable(copyingPolicy="ALL")
 */
class Page
{
    /**
     * @var int
     *
     * @ORM\Column(type="integer", unique=true)
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Id
     * @Clonable\Skip
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="text", nullable=true)
     */
    private $content;
}

2. Клонируем сущность с помощью сервиса "darvin_utils.cloner":

$page = new Page();
$page->setContent('Hello, world!');

$pageClone = $this->getContainer()->get('darvin_utils.cloner')->createClone($page);
echo $pageClone->getId();      // null
echo $pageClone->getContent(); // 'Hello, world!'

После клонирования сущности (непосредственного или сущности в свойстве) вызывается событие "Darvin\Utils\Event\ClonableEvents::CLONED" ("darvin_utils.clonable.cloned"). Класс события - "Darvin\Utils\Event\CloneEvent".