Ako uložiť doctrine entitu z formulára
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- erikbalog
- Člen | 27
Zdravím, mam formulár a v ňom:
<?php
public function articleFormSucceeded(Form $form, ArrayHash $values)
{
try {
if(!$this->article) {
$this->article = new Entity\Article();
$this->article->author = null; //TODO currentUser
}
$this->article->category = $this->articleFacade->getCategory($values->category);
$this->article->title = $values->title;
$this->article->description = $values->description;
$this->article->content = $values->content;
foreach($values->tags as $id) {
$tag = $this->articleFacade->getTag($id);
$this->article->addTag($tag);
}
$this->articleFacade->save($this->article);
$this->presenter->flashMessage('Article has been saved.', 'success');
$this->onSave($this->article);
} catch (\InvalidArgumentException $e) {
$this->presenter->flashMessage($e->getMessage(), 'danger');
} catch (Doctrine\DBAL\Exception\UniqueConstraintViolationException $ex) {
$this->presenter->flashMessage('Key arledy exists', 'danger');
}
}
?>
ale vôbec sa mi nepáči priehľadnosť kódu. Nepoznáte nejaký
best-practice na ukládanie entít ?
obsah metódy save vo facade je flush() a persist()
Ďakujem za pozornosť.
- enumag
- Člen | 2118
Z existujících knihoven můžeš zkusit:
Ani jedno z toho jsem nikdy nepoužíval takže výběr ti neusnadním. Já sám nějakou dobu používal přístup který se snažil prvky z pole values dát do entity pomocí symfony/property-access.
Aktuálně používám formuláře ze symfony (integrační balíček zde) které tohle řeší samy od sebe. Na druhou stranu musím varovat, že symfony/form je dost velký kanón a vyplatí se to jen u aplikací s dost složitými formuláři.
- Martk
- Člen | 661
Když použiješ výše zmiňovanou WebChemistry/forms-doctrine, tak to bude vypadat takhle:
public function articleFormSucceeded(Form $form, ArrayHash $values) {
try {
if(!$this->article) {
$this->article = new Entity\Article();
$this->article->author = null; //TODO currentUser
}
$settings = new \WebChemistry\Forms\Doctrine\Settings();
$settings->setFind([
'category', 'tags' // Používá find metodu z repository
]);
$this->helper->toEntity($this->article, $values, $settings);
$this->articleFacade->save($this->article);
$this->presenter->flashMessage('Article has been saved.', 'success');
$this->onSave($this->article);
} catch (\InvalidArgumentException $e) {
$this->presenter->flashMessage($e->getMessage(), 'danger');
} catch (Doctrine\DBAL\Exception\UniqueConstraintViolationException $ex) {
$this->presenter->flashMessage('Key arledy exists', 'danger');
}
}