Typo3 поток сохраняются обновленные отношения
У меня есть проблема TYPO3 Flow, обновляющая мои отношения. Я не прав, что Flow должен обновлять измененные отношения автоматически, поэтому мне не нужно обновлять связанные сущности с соответствующим репозиторием?
Пример 1:
У меня есть модель "Project" с несколькими дочерними элементами "Job" по атрибуту "jobs". Если я сделаю:
$project->setJobs($collectionOfJobs);
$this->projectRepository->update($project);
тогда задания не обновляются правильно с новым идентификатором проекта.
Пример 2:
Я хотел реализовать двунаправленные отношения один-к-одному между моделями "Проект" и "Брифинг" и обнаружил, что в TYPO3 существует известная ошибка: Двунаправленные отношения один-к-одному в потоке
Поэтому я хотел исправить это, установив отношение на другой стороне вручную:
class Briefing {
/**
* @param \Some\Package\Domain\Model\Project $project
* @return void
*/
public function setProject($project) {
$this->project = $project;
$this->project->setBriefing($this);
$this->projectRepository->update($this->project); // FIXME: Bug? Flow should do this
}
но я должен был обновить связь с его хранилищем самостоятельно. Разве Flow не должен делать это автоматически?
Так действительно ли мне нужно обновлять каждого ребенка своим репозиторием самостоятельно или Flow должен сделать это для меня?
Среда:
- TYPO3 FLOW 2.3.3 (последняя стабильная версия)
- Доктрина 2.3.6
- PHP 5.4.39-0 + deb7u2
1 ответ
Из руководства Flow:
Когда вы добавляете или удаляете объект в или из репозитория, объект будет добавлен или удален из базовой персистентности, как и ожидалось от persistAll. Но как насчет изменений в уже сохраненных объектах? Как мы уже видели, эти изменения сохраняются только в том случае, если измененному объекту дано обновление в соответствующем хранилище.
Теперь, как сохраняются изменения для объектов, у которых нет соответствующего репозитория? Таким же образом вы извлекаете эти объекты от их родителей - путем обхода. TYPO3 Flow следует ссылкам из объектов, управляемых в хранилище (агрегатные корни), для всех операций персистентности, если только сам ссылочный объект не является агрегатным корнем.
Поэтому, если для вашей сущности есть хранилище, вы должны явно вызвать метод update. Первоначально это было иначе, но изменилось для Flow 1.0.
Возможно, вы думаете, что это должно работать, потому что оно работало в TYPO3 CMS Extbase < 6.2, пока его тоже там не изменили.