Существует один подход, который решает этот сценарий использования из другого POV, а именно, что значения аргумента запроса без идентификатора автоматически помещаются в свежие объекты, которые затем могут быть сохранены. Это в основном клонирует оригинальные объекты. Вот что вам нужно сделать:
- Добавьте представление, которое имеет поля для всех свойств вашего объекта, скрытые поля тоже подойдут. Это может быть, например, представление
edit
с отдельной кнопкой отправки для вызова действия clone
.
- Добавьте
initializeCloneAction()
и получите необработанные аргументы запроса через $this->request->getArguments()
.
- Теперь выполните
unset($arguments[<argumentName>]['__identity']);
, сделайте то же самое для каждого отношения, которое имеет ваш объект, если вы хотите копировать вместо общих ссылок.
- Сохраните необработанные аргументы запроса снова через
$this->request->setArguments($arguments)
.
- Наконец, разрешите создание новых объектов в конфигурации сопоставления свойств вашего аргумента и, возможно, всех свойств отношений.
Вот как может выглядеть полный initializeCloneAction()
:
public function initializeCloneAction()
{
$arguments = $this->request->getArguments();
unset(
$arguments['campaign']['__identity'],
$arguments['campaign']['singleRelation']['__identity'],
);
foreach (array_keys($arguments['campaign']['multiRelation']) as $i) {
unset($arguments['campaign']['multiRelation'][$i]['__identity']);
}
$this->request->setArguments($arguments);
// Allow object creation now that we have new objects
$this->arguments->getArgument('campaign')->getPropertyMappingConfiguration()
->setTypeConverterOption(PersistentObjectConverter::class, PersistentObjectConverter::CONFIGURATION_CREATION_ALLOWED, true)
->allowCreationForSubProperty('singleRelation')
->getConfigurationFor('multiRelation')
->allowCreationForSubProperty('*');
}
Теперь, если вы отправите форму, используя действие clone
, ваше действие clone
получит полностью заполненный, но новый объект, который вы можете хранить в своем хранилище как обычно. Ваш cloneAction()
будет очень простым:
public function cloneAction(Campaign $campaign)
{
$this->campaignRepository->add($campaign);
$this->addFlashMessage('Campaign was copied successfully!');
$this->redirect('list');
}