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
+
0
-

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
+
0
-

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
+
0
-

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');
		}
	}
erikbalog
Člen | 27
+
0
-

Ďakujem Vám ale nemyslel som ten prevod entít, nemám nijak zložité formuláre tak entitu si vyplním aj ručne ale chcel som sa spýtať či mam vytvárať entitu vo formulári alebo len predať $values a vo facade si tu entitu vytvoriť a flush()

Jan Endel
Člen | 1016
+
+3
-

Z čistě pragmatického hlediska by formulář měl pouze předat dál data do modelové vrstvy a ta by se o to měla dál starat. Takže b) je správně. Co kdyby přišel časem požadavek, že danou entitu je třeba vytvářet i přes REST API? :-)

erikbalog
Člen | 27
+
0
-

@JanEndel vďaka to ma nenapadlo :)