Jak používáte metody modelu pro ukládání dat

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Michal III
Člen | 83
+
0
-

Omlouvám se za případné duplikování tématu, nicméně nic podobného jsem nenašel či neobdržel uspokojující odpověď. V současnosti jsem se pozastavil nad tím, zda-li používám model správně. Mrzí mě, že ani v příkladech Nette aplikací nenacházím příklady správného použití – většinou se dokonce model vynechává a nahrazuje za repozitář.

K věci

Mějme třídu modelu, která má na starosti např. správu zaměstnanců a zabývejme se konkrétně metodou, která bude přidávat nového zaměstnance. Jak byste takovou metodu napsali?

Když jsem s modelem začínal, nejprve jsem tyto metody začal psát následovně:

<?php

public function addUser($firstName, $lastName, $personalNumber, DateTime $birthDate, DateTime $startDate, $street, $city /*...*/)
{
	//...
	//table->
	insert(array(
		'first_name' => $firstName,
		'last_name' => $lastName,
		'personal_number' => $personalNumber,
		'birth_date' => $birthDate,
		'start_date' => $startDate,
		'street' => $street,
		'city' => $city,
	));
}

?>

Není to moc argumentů? Dejme tomu, že v presenteru nejprve sestavím formulář s těmito prvky a při onSuccess[] je z proměnné $values rozdistribuju do argumentů oné metody modelu, kde je opět zase připravím do nějakého pole a použiju nějakou databázovou vrstvu, která hodnoty uloží. (Případně bych použil nějaké ORM, vytvořil entitu a tu poté persistoval do repozitáře.)

Zdálo se mi to nešikovné a později jsem začal psát tyto metody následujícím způsobem:

<?php

public function addUser($data)
{
	//table->
	insert($data);
}
?>

Tímto způsobem je pak za jednotlivé hodnoty zodpovědný formulář, v podstatě té metodě jen předhodím data přímo z formuláře. Použití je jednodušší a univerzální, ale nyní mi přijde, že to není zrovna ten správný způsob.

Jakým způsobem to řešíte vy?

Oli
Člen | 1215
+
0
-

V podstatě stejně jako tvuj druhy zpusob. Akodat jsem si pro takove obecne dotazy napsal tridu, ze ktere potom vsechny tridy dedi. Takze pouziti potom vypada $this->userModel->editOrAdd($id, array(data));

Glottis
Člen | 129
+
0
-

podle me se neda rict co z toho je lepsi. lepsi nez oba dva je samozrejme pouzit pro prenos dat entitu (klidne i bez orm), tu nejak naplnit z pole co vraci form a to predat repo. kdyz entitu nemas, je sporne co je lepsi. pokud je ti jedno, co ukladas (aplikace je pro tebe a nechces to resit) je lepsi uspornejsi druhe reseni.

Michal III
Člen | 83
+
0
-

@Glottis

S entitou asi souhlasím. Když jsem psal tento příspěvek, přenášet entitu byla jedna možnost, která mě napadla, ale pak jsem také váhal nad její správností, jelikož to trochu vytváří závislost právě na ORM, nicméně ta závislost je zřejmě minimální a akceptovatelná.

Nyní se právě dostávám do stavu, kdy pro mě bude nutností začít používat ORM, takže si myslím, že tato cesta bude správná, děkuji.

kuzma88
Člen | 15
+
0
-

Michal III napsal(a):

@Glottis

S entitou asi souhlasím. Když jsem psal tento příspěvek, přenášet entitu byla jedna možnost, která mě napadla, ale pak jsem také váhal nad její správností, jelikož to trochu vytváří závislost právě na ORM, nicméně ta závislost je zřejmě minimální a akceptovatelná.

Nyní se právě dostávám do stavu, kdy pro mě bude nutností začít používat ORM, takže si myslím, že tato cesta bude správná, děkuji.

Souhlas, že entita je správná cesta, ale nesouhlas, že entita vytváří závislost na ORM. Nikdo ti neříká, že musíš používát ORM, ale můžeš použít entitu jako DTO objekt. Což je design pattern pro přenos dat mezi subsystémy.

Takže tvůj addUser může vzít entitu a vnitřně to předelegovat na službu, která data z entity někam přidá… nemusí to být databáze, může to být klidně záznam do souboru nebo cokoliv jiného a o ORM to vůbec nic neví.

Ukázka použítí:


/** IDatovyZdroj */
private $datovyZdroj;

public function addUser(UserEntity $user)
{
    //...
    $this->datovyZdroj->add($user->toArray()); // to array je jen pro ukazku, zalezi na implementaci entity
}

class DatabazovyZdroj implements IDatovyZdroj
{
    public function add($data)
    {
	    //table->
    		insert($data);
    }
}

class XmlZdroj implements IDatovyZdroj
{
    public function add($data)
    {
	    // pridani zaznamu do xml;
    }
}
Michal III
Člen | 83
+
0
-

@kuzma88

Pravda, souhlasím. Už předtím jsem tu závislost vnímal jako velice minimální, takhle je to ještě méně.