Model a připojení k DB

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

Ahoj,

rád bych se zeptal, jak řešíte připojení k databázi, pokud je zapouzdřena v modelu (tzn. důsledně oddělena od presenteru)?

<?php
class MyModel {
  $db;
  getData() { return caryMary(podKocary($db->getTable())); }
}

class Presenter {
  $model;
  startup() { $model = new MyModel(); }
}
?>

Doplněno: Asi se ptám hloupě… :) Pokud mám model jenom jeden, připojím se samozřejmě v konstruktoru. Vlastně mi jde přesně o to, jestli ho mít jenom jeden nebo případně model pro každý presenter, model pro každou komponentu…

Editoval pheidrich (1. 2. 2009 11:49)

Jakub Šulák
Člen | 222
+
0
-

K databázi bych se nepřipojoval v modelu, ale již v bootstrap.php (samozřejmě za předpokladu, že aplikace ve valné většině stránek využije DB). Pokud by jsi trval na připojení v modelu, můžeš řešit třídou v jejímž konstruktoru bude připojení k DB a další třídy pak již budou potomky této třídy.

Co se týče dělení modelů. Model by jsi měl dělit podle logiky aplikace. Model by neměl tedy kopírovat ani komponenty, ani presentery. Zapouzdřuješ vlastně metody a vlastnosti systému do objektů. Co se dělení týče, nastuduj si třeba UML – diagramy třid.

David Grudl
Nette Core | 8218
+
+1
-

Zjednodušeně:

  • model nemá vědět o tom, že nějaké pohledy/presentery existují
  • view o modelu vědět také nemusí (pasivní view), nebo naopak může data tahat přímo z něj, dle zvolené koncepce
  • presenter seznámí view s modelem (ne naopak) a realizuje uživatelské akce. Ty patří do tří kategorií
    • změna view (nejčastější)
    • zmena stavu (interakce v rámci aktuálního view)
    • příkaz pro model

Model ve většině případů bude tvořit více tříd. Jedna z nich se může starat právě o zapouzdření připojení k DB, které využijí jiné třídy modelu. Ale z pohledu celé aplikace je to chápáno jako jeden celek, jeden model.

Z pohledu jednotlivých vizuálních komponent i tyto mohou mít svůj vlastní malý model. Dal by se nazývat třeba komponentový model. Propojení těchto modelů s hlavním modelem pak opět zajistí presenter. Z pohledu celé aplikace se tyto modely budou spíš považovat za součást prezentační logiky, než součást modelu.

phx
Člen | 651
+
0
-

Osobne mam zavedeny Datovy Model, ktery reprezentuje data (misto asociovaneho pole dat mam Datovy Model). Mozna David mysli to same po pojmem „maly model“ :))

Jod
Člen | 701
+
0
-

Mám to takto:

<?php
class BaseModel extends Object
{
	protected static $db = null;

	public function __construct()
	{
		if(null === self::$db) {
			self::$db = new DibiConnection(Environment::getConfig('database'));
		}
	}

	function getDb()
	{
		return self::$db;
	}
}
?>

Potom už len volám $this->db->query, $this->db->dataSource, $this->db->select…

To by malo zaručiť, že pripojenie sa bude vytvárať len raz.
Jakub Šulák: ja by som model k databáze pripojoval, len on by s ňou mal pracovať.

Editoval Jod (9. 2. 2009 13:23)

David Grudl
Nette Core | 8218
+
0
-

Ještě lze připojování k db dát do bootstrapu:

Model:

class BaseModel extends Object
{
        public static function initialize()
        {
                self::$db = new DibiConnection(Environment::getConfig('database'));
        }
	...
}

bootstrap.php:

...
$application = Environment::getApplication();
$application->onStartup[] = 'BaseModel::initialize';
...