Nette z Githubu: Jak se pracuje s modely?
- patriksima
- Člen | 58
Ahoj,
zkouším na starším projektu novou verzi Nette z Githubu a zjišťuji, že
se tam s modely pracuje trochu jinak. Konstruktor Table\Selection teď chce
navíc IReflection. Co s tím? Definuje se to nějak navíc v config.neon
nebo jinde?
Teď mám.
<?php
class NejakyModel extends Selection
{
public function __construct(\Nette\Database\Connection $connection)
{
parent::__construct($connection, 'nazev tabulky');
}
}
?>
<?php
common:
factories:
NejakyModel: NejakyModel
?>
Díky
- patriksima
- Člen | 58
Marek Šneberger napsal(a):
V dokumentaci je to popsáno celkem pěkně ;)
Nechci starý projekt celý překopávat na Model-Entity-Repository. Nejde to jinak? Znamená to, že staré Factories v configu již nefungují?
- ViPEr*CZ*
- Člen | 818
Marek Šneberger napsal(a):
V dokumentaci je to popsáno celkem pěkně ;)
Ten návod je psaný pro: „Návod je psán pro Nette Framework 2.0.5 a PHP
5.3 nebo novější. Ověřte si, zda máte správnou verzi.“
Počítám, že jste stáhl vývojovou verzi. Tam těch BC breaků bude daleko
více než jen jiný konstruktor NDB Selection. Každopádně dědit Selection
není úplně dobrý nápad. Instanci iReflection obsahuje samotné connection a
dá se vytáhnout přes getDatabaseReflection().
- patriksima
- Člen | 58
ViPErCZ napsal(a):
Marek Šneberger napsal(a):
V dokumentaci je to popsáno celkem pěkně ;)
Ten návod je psaný pro: „Návod je psán pro Nette Framework 2.0.5 a PHP 5.3 nebo novější. Ověřte si, zda máte správnou verzi.“
Já s tím návodem nepřišel. Je vcelku jasné, že tam nebude návod pro devel verzi.
Počítám, že jste stáhl vývojovou verzi.
Ano, píšu to i v titulku
Tam těch BC breaků bude daleko více než jen jiný konstruktor NDB Selection.
Asi ano, ale mě teď zrovna zajímá Table\Selection a modely(factories)
Každopádně dědit Selection není úplně dobrý nápad.
Tuhle diskuzi vynecháme. IT je dynamické odvětví, ale to neznamená, že to co se dělalo včera je dnes automaticky blbě a musí se hned předělat.
Instanci iReflection obsahuje samotné connection a dá se vytáhnout přes getDatabaseReflection().
Díky moc, snad to pomůže.
Editoval patriksima (21. 5. 2013 21:42)
- David Matějka
- Moderator | 6445
ViPErCZ: reflection se z connection uz nenecha dostat
patriksima: jak pise viper, dedit selection neni dobre. ted se vytvareni selection resi pres selection factory, ktere u sebe drzi i reflection. pokud se ti to nechce prepisovat nejak drasticky, tak me napada nasledujici reseni: podedit Nette\Database\SelectionFactory a prepsat metodu table, aby pro kazdy nazev tabulky vratilo instanci spravne tridy, tu selection factory potom predat connection a v configu pouzit neco jako:
factories:
nejakejModel: @connection::table('nejaka_tabulka')
- patriksima
- Člen | 58
matej21 napsal(a):
ViPErCZ: reflection se z connection uz nenecha dostat
patriksima: jak pise viper, dedit selection neni dobre. ted se vytvareni selection resi pres selection factory, ktere u sebe drzi i reflection. pokud se ti to nechce prepisovat nejak drasticky, tak me napada nasledujici reseni: podedit Nette\Database\SelectionFactory a prepsat metodu table, aby pro kazdy nazev tabulky vratilo instanci spravne tridy, tu selection factory potom predat connection a v configu pouzit neco jako:
factories: nejakejModel: @connection::table('nejaka_tabulka')
Já to klidně přepíšu i do těch repository. Jen kdyby to šlo nějak automatizovaně. Mám těch modelů docela dost.
- enzo
- Backer | 15
ViPErCZ napsal(a):
matej21 napsal(a):
ViPErCZ: reflection se z connection uz nenecha dostat
Jo jo stejná chyba… koukal jsem se na svojí lokální API pro 2.0.10 a zřejmě ani toto jak píšeš nezůstalo na stejném místě a v dev verzi to je jináč. ;-)
stačí mrknout do commits na https://github.com/…mmits/master, NDB teď tak trochu žije svým vlastním životem :-) chce to počkat až vyjde 2.1 a bude fixnuté API
- ViPEr*CZ*
- Člen | 818
enzo napsal(a):
ViPErCZ napsal(a):
matej21 napsal(a):
ViPErCZ: reflection se z connection uz nenecha dostat
Jo jo stejná chyba… koukal jsem se na svojí lokální API pro 2.0.10 a zřejmě ani toto jak píšeš nezůstalo na stejném místě a v dev verzi to je jináč. ;-)
stačí mrknout do commits na https://github.com/…mmits/master, NDB teď tak trochu žije svým vlastním životem :-) chce to počkat až vyjde 2.1 a bude fixnuté API
:-D to by mě faakt nenapadlo :-D
- ZZromanZZ
- Člen | 87
EDIT: Tento kod ignorujte – viz. dalsi prispevky
Používám verzi 2.1-dev a řeším to pomocí metody getSelectionFactory() takto:
class ArticleService extends \Nette\Object {
const TABLE = "article";
/** @var \Nette\Database\Connection */
private $database;
public function __construct(\Nette\Database\Connection $database) {
$this->database = $database;
}
public function getArticles() {
return $this->database->getSelectionFactory()->table(self::TABLE);
}
}
common:
services:
articleService: \ArticleService
Editoval ZZromanZZ (29. 5. 2013 14:49)
- David Matějka
- Moderator | 6445
@ZZromanZZ: pres selectionFactory je to zbytecne,
$this->database->table(self::TABLE)
udela to same ;)
- ZZromanZZ
- Člen | 87
Lepší bude asi toto:
class ArticleRepository extends \Nette\Object {
const TABLE = "article";
/** @var \Nette\Database\SelectionFactory */
private $selectionFactory;
public function __construct(SelectionFactory $selectionFactory) {
$this->selectionFactory = $selectionFactory;
}
public function getArticles() {
return $this->selectionFactory->table(self::TABLE);
}
}
A autowiring se postará sám:
services:
articleRepostitory: \articleRepository
Ale to jenom to, co funguje mi, nevím co doporučí „nette guruové“ :)
- David Matějka
- Moderator | 6445
ZZromanZZ: ajo, mas pravdu. ja koukal do api pro 2.1, ktery ale asi neni uplne aktualni :)
a to tvoje reseni s injectnutim selection factory bude asi jedine mozne a tudiz i spravne :)
- PetrHH
- Člen | 49
Dobrý den,
byl jsem u Davida na školení, tam doporučoval použít komposer s –stability=dev. Udělal jsem update a celá app v pr.. . To ten výše uvedený kód budu muset mít v každém modelu? Co je špatného např. na
$row = $this->database->table('users')->where('username', $username)->fetch();
?
Je to hned jasné a funkční. Tedy spíše bylo. Na co proboha další nějakou selectionFactory?
Editoval PetrHH (28. 5. 2013 21:57)
- thunderbuff
- Člen | 164
PetrHH napsal(a):
Je to hned jasné a funkční. Tedy spíše bylo. Na co proboha další nějakou selectionFactory?
Tohle je docela nepraktické ve chvíli, kdy potřebuji pracovat s transakcemi. Do repozitáře musím injektovat SelectionFactory na výběry z tabulek – ale Connection se kvůli transakčním metodám nezbavím. Jen to docela nesympaticky rozdrobené.
Editoval thunderbuff (28. 5. 2013 23:43)
- PetrHH
- Člen | 49
thunderbuff napsal(a):
Tohle je docela nepraktické ve chvíli, kdy potřebuji pracovat s transakcemi. Do repozitáře musím injektovat SelectionFactory na výběry z tabulek – ale Connection se kvůli transakčním metodám nezbavím. Jen to docela nesympaticky rozdrobené.
To asi ano, ale tou změnou se, s prominutím, rozdrbe úplně všechno. Nefunguje mi naprosto nic. Začal jsem si podle příkladu ze školení dělat menší appku a teď je vše v prd… a abych začal nějak odznovu. Mám několik modelů a $this->db->table mám použito tolikrát, až to není pěkné. Ach jo.
- chemix
- Nette Core | 1310
Take jsem na to narazil kdyz jsem jel podle QuickStart-u a reseni bylo proste. Nahradil jsem v konstruktoru Connection za SelectionFactory a doufam ze je to spravne ;-) obslehnul jsem to z /app/model/UserManager.php ze Sandboxu.
<?php
class Stories extends Nette\Object
{
/** @var Nette\Database\SelectionFactory */
protected $database;
public function __construct(Nette\Database\SelectionFactory $database)
{
$this->database = $database;
}
/**
* Vrací objekt reprezentující databázovou tabulku.
* @return Nette\Database\Table\Selection
*/
protected function getTable()
{
return $this->database->table('stories');
}
/**
* Vrací všechny řádky z tabulky.
* @return Nette\Database\Table\Selection
*/
public function findAll()
{
return $this->getTable();
}
...
}
?>
Editoval chemix (1. 10. 2013 18:18)