Jak na modely a databáze v nette 2
- joseff
- Člen | 233
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?
- studna
- Člen | 181
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
Je to naprosto v pořádku. NotORM a Nette\Database mají totiž jinou filosofii.
- gawan
- Člen | 110
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)