Nette z Githubu: Jak se pracuje s modely?

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

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

Marek Šneberger
Člen | 130
+
0
-

dokumentaci je to popsáno celkem pěkně ;)

patriksima
Člen | 58
+
0
-

Marek Šneberger napsal(a):

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
+
0
-

Marek Šneberger napsal(a):

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
+
0
-

ViPErCZ napsal(a):

Marek Šneberger napsal(a):

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
+
0
-

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
+
0
-

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.

ViPEr*CZ*
Člen | 818
+
0
-

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áč. ;-)

enzo
Backer | 15
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@ZZromanZZ: pres selectionFactory je to zbytecne, $this->database->table(self::TABLE) udela to same ;)

ZZromanZZ
Člen | 87
+
0
-

@matej21, bavíme se tady o Nette 2.1-dev, kde je je metoda table() nad Connection deprecated.

ZZromanZZ
Člen | 87
+
0
-

Ale pravděpodobně ani tohle nebude doporučený postup, jak se tak dívám na poslední commity

ZZromanZZ
Člen | 87
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)