Jak na modely a databáze v nette 2

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

Zdravím, vím že toto téma se tu již řešilo, ale stále nechápu pár věcí. Všude okolo MVC jsou vypsána tyto pravidla, které by měl model splňovat:

  • když změním názvy sloupců v databázové tabulce, bude nutné editovat kód controlleru či view?
  • když změním HTML rozhraní za Flashové, bude nutné editovat kód modelu?
  • když přehodím rozložení prvku na stránce, bude nutné editovat controller nebo model?

Tyto pravidla by tedy měl správný model splňovat, ale poslední dobou (např. Nette\Database, NotOrm atd)
Se ptají databáze v presenteru, nebo někdy dokonce až ve View (např přes metody ->where(..) atd..). Zdá se mi to nebo je tím porušeno první pravidlo (při změně názvu tabulek musím editovat view!)? Měl jsem dojem, že přímí přístup k tabulce databáze by něměl být vůbec možný mimo model, ale poslední dobou to je spíše naopak. Vysvětlí mi to někdo?

nanuqcz
Člen | 822
+
0
-

Připojuji se k dotazu, tohle by mě taky zajímalo. Např. při použití Nette\Database je někdy nutné v šabloně použít ...->related(..)-> – takové volání metod podle mě nemá v šabloně co dělat.

srigi
Nette Blogger | 558
+
0
-

MVC paradox a jak jej rešit. Citajte hlavne dskusiu.

studna
Člen | 181
+
0
-

Nette\Database (NotORM) je vlastně takový model sám o sobě. Víc snad poví příklad (psáno z hlavy).

BaseService.php

<?php
abstract class BaseService
{
	protected $db;

	function setDb( Nette\Database\Connection $db )
	{
		$this->db = $db;
	}
	function table()
	{
		throw new ErrorException('..');
	}
}
?>

ProductService.php

<?php
class ProductService extends BaseService
{
	function table()
	{
		return $this->db->table('product');
	}

	function findById( $id )
	{
		return $this->table()->where('id', $id);
	}
}
?>

Presenter.php

<?php
	function renderProduct( $id )
	{

		//$this->template->product = $this->context->productService->findById( $id );
		$this->template->products = $this->context->productService->table();

	}
?>

Template.latte

<ul>
{cache products}
	<li n:foreach="$products as $product">
		{$product->name}
	</li>
{/cache}
</ul>
Filip Procházka
Moderator | 4668
+
0
-

Je to naprosto v pořádku. NotORM a Nette\Database mají totiž jinou filosofii.

gawan
Člen | 110
+
0
-

joseff napsal(a):

  • když změním názvy sloupců v databázové tabulce, bude nutné editovat kód controlleru či view?

Predstavy si, že chceš zmeniť stĺpec foo na stĺpec bar a máš v modely funkciu:

<?php
function getFoo() {
  return $this->foo;
}
?>

samozrejme stačí zmeniť $this->foo na $this->bar na všetko bude fungovať, ale po pár takýchto zmenách sa tvoj kód stane dokonale nečitateľný. Preto vždy musíš zmeniť všetky výskyty vo všetkých controlleroch a viewsoch, aj keby si používal 10-vrstvové modely! Preto tento argument je ilúzia, úplne nezmyselný, lebo či používaš modely alebo notorm, vždy musíš zmeniť všetko. Howgh.

Editoval gawan (2. 8. 2011 21:44)