Změna API Nette\Database\Table\Selection?
- veselda7
- Člen | 7
Ahoj,
byl jsem zvyklý používat pro práci s databází factories (teď servicies), které dědily od Nette\Database\Table\Selection. Nicméně jsem narazil na problém při tvorbě nového projektu pod Nette 2.1., kde Nette\Database\Table\Selection __construct() metoda má jiné rozhraní. Dříve stačilo v konstrukoru předat pouze $conncetion a název tabulky. Nyní je zapotřebí i implementace Nette\Database\IReflection. Kde tuto implementaci seženu, abych své tabulky zprovoznil? Popřípadě jaká je vaše best practice na práci s databází?
Pro větší přehlednost přidávám kód třídy users, která v nižších verzích nette fungovala a nyní již ne.
use Nette\Database\Table\Selection;
/**
*
* @author veselda7
*/
class Users extends Selection {
const
TABLE_NAME = 'users',
COLUMN_ID = 'id',
COLUMN_NAME = 'email',
COLUMN_PASSWORD = 'password',
COLUMN_ACTIVATED = 'activated',
COLUMN_ACTIVATION_CODE = 'activation_code',
PASSWORD_MAX_LENGTH = 4096;
public function __construct(\Nette\Database\Connection $connection) {
parent::__construct('users', $connection);
}
}
- veselda7
- Člen | 7
jenicek napsal(a):
A jaké je přesně prosím použití? To ted místo dědění ze Selection mám dědit z Context? To když jsem udělal, tak jsem získal z laděnky hlášku:
Multiple services of type Nette\Database\Context found: nette.database.default.context.
Když jsem zkusil získat Nette\Database\Context pomocí inject metody, vždy zůstala NULL a tudíž volání metody table() končí s chybou.
- ViPEr*CZ*
- Člen | 818
Obecně se Nette\Database\Table\Selection nedoporučovalo dědit? Nebo mi
něco uniklo a ta třída Users samotnou Selection o něco rozšiřuje? Typnu
si že ne. Btw. když už existuje konstanta TABLE_NAME, tak bych ji použil
i v konstruktoru :-)
Pokud by jste psal modely správně, pak by Vám stačilo namísto
\Nette\Database\Connection v konstruktoru modelu přepsat jen na
\Nette\Database\Context a bylo by hotovo.
- veselda7
- Člen | 7
ViPErCZ napsal(a):
Obecně se Nette\Database\Table\Selection nedoporučovalo dědit? Nebo mi něco uniklo a ta třída Users samotnou Selection o něco rozšiřuje? Typnu si že ne. Btw. když už existuje konstanta TABLE_NAME, tak bych ji použil i v konstruktoru :-)
Pokud by jste psal modely správně, pak by Vám stačilo namísto \Nette\Database\Connection v konstruktoru modelu přepsat jen na \Nette\Database\Context a bylo by hotovo.
Omlouvám se, ale celkově nemám velké zkušenosti a říci, že mám psát
modely správně mi moc nepomůže. :-D
Mohl bych se tedy prosím zeptat, jak je psát správně? V dokumentaci je
pouze popsáno, jako používat Table Selection API. Je vůbec správně dědit
od třídy Selection? Mohl bych si někde přečíst ukázkovy příklad
s jednou tabulkou? Omlouvám se pokud jsem něco přehlédl.
Editoval veselda7 (16. 2. 2014 12:05)
- Mariocz
- Člen | 52
Ukázka použití je třeba tady:
https://github.com/…pository.php
v configu nastavíš databázi, objekt pro přístup k DB (repository) jako službu. tomu objektu v construktoru injectneš Nette\Database\Context
nakonec v presenteru získáš jen tu službu a o předání contextu se nestaráš
- bazo
- Člen | 620
veselda7 napsal(a):
Omlouvám se, ale celkově nemám velké zkušenosti a říci, že mám psát modely správně mi moc nepomůže. :-D
Mohl bych se tedy prosím zeptat, jak je psát správně? V dokumentaci je pouze popsáno, jako používat Table Selection API. Je vůbec správně dědit od třídy Selection? Mohl bych si někde přečíst ukázkovy příklad s jednou tabulkou? Omlouvám se pokud jsem něco přehlédl.
nie je spravne dedit od selection. neviem, kde na toto ludia chodia. spravne je vytvorit modelovu triedu, ktora zavisi na Context alebo teda aj Selection ak sa inak neda