Kam s pripojenim k DB? :)
- wdolek
- Člen | 331
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).
- do index.php / bootrsap.php a ulozit tuto instanci do nejakeho globalniho registru
- 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… ? :)
- Tomik
- Nette Evangelist | 485
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.
- Ondřej Mirtes
- Člen | 1536
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
Akorát snad, že se možná zbytečně připojuješ do db, když třeba žádný connect nepotřebujes? :)
- Ondřej Mirtes
- Člen | 1536
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 ;)
- Ondřej Brejla
- Člen | 746
LastHunter napsal(a):
Nepřipojuju, v nastavení je lazy = TRUE ;)
Pak je vše v nejlepším pořádku :-)
- sodae
- Nette Evangelist | 250
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
- Honza Marek
- Člen | 1664
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é.
- Ondřej Mirtes
- Člen | 1536
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)
- PetrP
- Člen | 587
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 ;]