Kam s pripojenim k DB ? :)

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

tak se nejak rozkoukavam v Nette :) a premyslim o tom, kam vlastne umistit obycejne pripojeni k databazi (tj nejaky konektor – instanci neceho – treba Dibi connection).

  1. do index.php / bootrsap.php a ulozit tuto instanci do nejakeho globalniho registru
  2. do nejakeho OmniBaseController do metody startup( )

k bodu 1) – vzhledem k objektovemu pojeti frameworku a celkove prace mi toto nepride uplne koser :) ale zas bych mel 1 instanci pro celou aplikaci. pripojeni bych pak tridam modelu predaval z controlleru (ten by k tomu mel pristup pres nejaky registr) pres konstruktory modelovych trid…

a nebo k bodu 2) by kazdy controller vytvarel pri startu pripojeni s db. samozrejme ve vetsine pripadu bude jeden pozadavek roven jednomu controlleru – ale co pak nejake presmerovavani a tak?

a :) mozna jsem vedle jak ta jedle, mozna nad tim moc hloubam. budu vdecny za jakoukoliv praktickou radu.

PS v podstate podobna otazka me napada v pripade, ze pouzivam nejake role, ktere jsou v DB – v jaky moment (kde) je ziskat, kam vytvorit instance… ? :)

o5
Člen | 416
+
0
-

koukni do akrabat.forms v nette 0.9 se to jmenuje CD-collection

..tedy v modelech

Editoval o5 (21. 6. 2009 22:01)

Tomik
Nette Evangelist | 485
+
0
-

Také doporučuju si projít příklady, nějaké informace jsou i zde.

Takhle může např. vypadat BaseModel, od kterého budeš dědit další

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

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

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

Co a jak se dozvíš z příkladů v distribuci.

xzajic
Člen | 19
+
0
-

Také bych to logicky cpal do modelu. Nicméně tazatele chápu, v ofiko příkladech to je k vidění i v prezenteru (asi pro zjednodušení), takže ta otázka vzniknout mohla ;-)

Ondřej Mirtes
Člen | 1536
+
0
-

Já mám tedy připojení k DB ve statické metodě ConnectModel::connect() a odpojení v ConnectModel::disconnect() a tyto dvě metody volám v události:

$application->onStartup[] = 'ConnectionModel::connect';
$application->onShutdown[] = 'ConnectionModel::disconnect';

Je na tom něco špatného? :)

Ondřej Brejla
Člen | 746
+
0
-

Akorát snad, že se možná zbytečně připojuješ do db, když třeba žádný connect nepotřebujes? :)

_Martin_
Generous Backer | 679
+
0
-

Warden napsal(a):

Akorát snad, že se možná zbytečně připojuješ do db, když třeba žádný connect nepotřebujes? :)

To už záleží na té aplikaci – jestli potřebuje DB při každém požadavku, pak jde o velmi elegantní řešení.

Ondřej Mirtes
Člen | 1536
+
0
-

Warden napsal(a):

Akorát snad, že se možná zbytečně připojuješ do db, když třeba žádný connect nepotřebujes? :)

Nepřipojuju, v nastavení je lazy = TRUE ;)

Jod
Člen | 701
+
0
-

LastHunter, nooo, to sa mi velmi lúbi, toto čo si vymyslel. Môj model si to robí cez statické $db

Ondřej Brejla
Člen | 746
+
0
-

LastHunter napsal(a):
Nepřipojuju, v nastavení je lazy = TRUE ;)

Pak je vše v nejlepším pořádku :-)

sodae
Nette Evangelist | 250
+
0
-

Tomik: mno dobře není to špatný řešení ale předpokládám, že je to absraktní třída už podle přívlastku Base a jestli to tak co takhle když načtem více modelů pro jednu a tu samou DB, nebude až moc těch spojení s db ? ja to řeším statupem viz. LastHunter (bez close) a pak statika (dibi::), jinak jestli je to jinak jak to říkám tak když tak mi to vysvětli dík

Jod
Člen | 701
+
0
-

sodae: prečo myslíš, že je to $db statické? Aby všetky rozšírenia BaseModel zdielali jedno pripojenie a pristupovali k nemu ako keby bolo inštančná premenná, teda $this->db :)

Ondřej Brejla
Člen | 746
+
0
-

Je to takový pseudo singleton :D

Jod
Člen | 701
+
0
-

JJ, „samooblbovací“ maskovaný singleton :)

Tomik
Nette Evangelist | 485
+
0
-

Jod napsal(a):

JJ, „samooblbovací“ maskovaný singleton :)

:)

Honza Marek
Člen | 1664
+
0
-

Tak já se teda taky pochlubim.

<?php
/**
 * Model
 *
 * @author Honza
 *
 * @property-read UsersModel $users
 * @property-read PagesModel $pages
 * @property-read EventsModel $events
 * @property-read ConnectionsModel $connections
 * @property-read CommentsModel $comments
 * @property-read LanguagesModel $languages
 * @property-read NewsModel $news
 */
class Model extends Object {

	private $models = array();

	public function  __construct() {
		$db = new DibiConnection(Environment::getConfig("database"));

		$models = Environment::getConfig("models");

		foreach ($models as $name => $class) {
			$this->models[$name] = new $class($db);
		}
	}

	public function &__get($name) {
		if (isset($this->models[$name])) {
			return $this->models[$name];
		}

		return parent::__get($name);
	}
}
?>

Jednotliví modelové jsou potomci BaseModelu.

<?php
/**
 * Base model
 *
 * @author Honza
 */
abstract class BaseModel extends Object {

	/** @var DibiConnection */
	protected $db;

	public function __construct(DibiConnection $db) {
		$this->db = $db;
	}

}
?>

Config.ini – model je služba, tudíž singleton.

# services
service.Model = Model

# models
models.comments = CommentsModel
models.connections = ConnectionsModel
models.events = EventsModel
models.languages = LanguagesModel
models.pages = PagesModel
models.users = UsersModel
models.news = NewsModel

Výhra je v tom, že se v configu daj zapínat jen potřebný modelové.

R2D2
Člen | 22
+
0
-

to ale vytváříš instanci všech modelů i když je potřeba třeba jen jeden, šlo by to víc zlínit – vytvářet modely až v __get :)

Ondřej Mirtes
Člen | 1536
+
0
-

Nic proti, ale přijde mi to tak propracované a složité, až to není hezké :) Já dědím BaseModel od Component a beru je přes lazy továrničky na komponenty (rada od _Martin_a :))

A vůbec, měli bychom založit nějaké místo, nějaký thread nebo stránku na wiki, kam budem postovat, jak každý řešíme základní věci, vzájemně si pomoci a řešení těchto základních věcí vzájemně vylepšit :)

Editoval LastHunter (22. 6. 2009 20:22)

romansklenar
Člen | 655
+
0
-

To je dobrý nápad ;)

PetrP
Člen | 587
+
0
-

LastHunter napsal(a):

A vůbec, měli bychom založit nějaké místo, nějaký thread nebo stránku na wiki, kam budem postovat, jak každý řešíme základní věci, vzájemně si pomoci a řešení těchto základních věcí vzájemně vylepšit :)

Na to by se možná dal použít koutek od Inzi https://nette.org/cs/vyvoj/design, aspoň říkal že si tam můžem dělat co chceme ;]