přístup k proměnným globálně
- pkristian
- Člen | 29
Ahoj, už pár hodin se tu rozčiluju, řvu, googlím, nadávám na DI a tak
obecně… řeším problém:
Jak můžu v nette se GLOBÁLNĚ dostat k datům z neon resp
k databázi?
v proceduálním řešení jsme jednoduše měl globální proměnnou a vše
bylo fajn, jak se k tomu ale v nette dostat?
presentery mám pořešený:
<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Database\Context */
public $db;
public $dii;
public function __construct(\Nette\DI\Container $container, Nette\Database\Context $database)
{
$this->dii = $container->getParameters();
$this->dii = $this->dii['ladydii'];
$this->db = $database;
}
}
?>
předal jsem to i router factory tím že dědí z:
<?php
class Basic
{
/** @var Nette\Database\Context */
public $db;
public $dii;
public function __construct(Nette\DI\Container $container, Nette\Database\Context $database)
{
$this->dii = $container->getParameters();
$this->dii = $this->dii['ladydii'];
$this->db = $database;
\Tracy\Debugger::barDump($this->dii, 'Basic');
}
}
?>
ovšem potřebuji to dostat i do
<?php
class DatabaseRoute extends Route
?>
a při představě, že v každé třídě budu muset dělat to samé připojení a kopírovat to se mi ježí chlupy na…
mohl bych Vás požádat o navedení na nějakou použitelnou cestu, jak se k těmto věcem dostat globálněji?
Velice děkuji
- Jan Tvrdík
- Nette guru | 2595
Globální přístup je zlo, pokud na něm trváš, tak koukni na třídu
Environment
.
Správné řešení je předávat konkrétním službám konkrétní parametry, které potřebují.
- pkristian
- Člen | 29
Jan Tvrdík napsal(a):
Globální přístup je zlo, pokud na něm trváš, tak koukni na třídu
Environment
.Správné řešení je předávat konkrétním službám konkrétní parametry, které potřebují.
Jo to jsme četl, že je to zlo… ovšem když chci získat jednu nudnou
proměnnou dbpx (dapabase (table) prefix), tak to vnímám jako sympatické
zlo.
Koukám, že Environment je deprecated… :/
To předávání parametrů… tedy tak to mám napsané?
- h4kuna
- Backer | 740
Já bych na to šel přes 2.2.0/Nette\Database\Reflection\ConventionalReflection, kterou si podědíš doplníš si prefix který načteš z configu a pak máš tuto reflection dostupnou přes Context.
EDIT
Hm… jak tak na to koukám tak je to asi moc abstraktně popsaný? Bude to
chtít více detailů?
Editoval h4kuna (29. 5. 2014 16:47)
- Jan Suchánek
- Člen | 404
@pkristian: A proč si prostě nepředáš základní parametry do nějaké service, kterou jen injectneš a můžeš používat kdekoliv (Presentrech, komponentách nebo dalších službách)? Co je na tom složitého?
- Jan Tvrdík
- Nette guru | 2595
@pkristian: Konstruktor slouží pro předání závislostí. Jestli ho používáš na něco jiného, tak to děláš špatně. Co vlastně myslíš tím, že konstruktor je obsazený?
- Jan Tvrdík
- Nette guru | 2595
@pkristian: Můžeš si poděděné třídy přidat
další parametr do konstruktoru – nebo, což bude dost možná lepší, se
dědění od Route
vyhni a použij RouteFactory
+
filtry pro parametry (viz https://doc.nette.org/…tion/routing#…).
- Mesiah
- Člen | 240
jenicek napsal(a):
@pkristian: A proč si prostě nepředáš základní parametry do nějaké service, kterou jen injectneš a můžeš používat kdekoliv (Presentrech, komponentách nebo dalších službách)? Co je na tom složitého?
Možná jsem problém, který řeší Kristian nepochopil dobře, ale tohle také není zcela správná cesta – sám jsem se o to zajímal, viz. tohle vlákno.
- pkristian
- Člen | 29
Tak pánové, děkuji za pomoc
Vytvořil jsem si statickou ‚zpravodajskou‘ třídu co dědí \Nette\Environment a přidal jsem do ní metodu table() co upraví string na prefixovanou verzičku :)
Db routa mi už jede… Nějak mně inspirovalo video z posoboty o routování (Jan Smitka) a nakonec jsem použil Route::FILTER_IN pánové to je magie :D
Takže defacto mám vyřešenio.. i když poněkud prasácky, ale časem to můžu zeslušnit. :)
- Jan Suchánek
- Člen | 404
@Mesiah: a kde se lisis? De o to nepredavat parametry ci cokoliv staticky. Pokud chci pracovat nekde s parametry, predam je service v neonu a pouziji a vysledeky predam sablone v presenteru. Co je na tom spatne? K cemu je vubec potrebuju v Presenteru?
- pkristian
- Člen | 29
…jinak myslím si, že když je fce, která vždycky na stejné konfiguraci vrátí to samé, a ví se odkud, tak není zlem, ne?
Globální přístup je prý zlo, ale dle mého je vyšší zlo předávat závislost na statické hodnoty složitě a zdlouhavě přes construktory. celé jsme to vlastně řešil, protože jsme chtěl vybrat z databáze a potřeboval jsem z neonu vytáhnout prefix tabulek… a 5 hodin života v pr… :D
Ale pánové, každopádně děkuji za rozšíření obzorů a obzvláště Jan Tvrdík za zmínění třídy Environment, i když je zastaralá.(což je i dibi a jak to lidi furt používaj, žejo :))
- Jan Tvrdík
- Nette guru | 2595
@pkristian: dibi není zastaralá, dibi je hotová, to je dost zásadní rozdíl =)
- pkristian
- Člen | 29
Jan Tvrdík napsal(a):
@pkristian: dibi není zastaralá, dibi je hotová, to je dost zásadní rozdíl =)
Ahá, tak jsme se nechal zmást článkem od The Davídka, který psal že Nette/Database je lepší…
Kdyby jsi měl zítra čas a případně mně poučil, tak bych byl šťastný jako blecha :)
- Mesiah
- Člen | 240
jenicek napsal(a):
@Mesiah: a kde se lisis? De o to nepredavat parametry ci cokoliv staticky. Pokud chci pracovat nekde s parametry, predam je service v neonu a pouziji a vysledeky predam sablone v presenteru. Co je na tom spatne? K cemu je vubec potrebuju v Presenteru?
šlo o rekaci na tohle
jenicek napsal(a):
@pkristian: A proč si prostě nepředáš základní parametry do nějaké service, kterou jen injectneš a můžeš používat kdekoliv (Presentrech, komponentách nebo dalších službách)? Co je na tom složitého?
Jak jsem pochopil reakce na svůj dotaz, tak psát službu, která bude dělat jen to, že zpřístupní parametry pro použití kdekoli (presenter, komponenty, …) není úplně košér a na to jsem chtěl poukázat.
Editoval Mesiah (30. 5. 2014 12:33)
- Jan Suchánek
- Člen | 404
@Mesiah: a co třeba servise předat z neonu limity [20, 50, 100, 500, 1000] a ty následně delegovat latte šablonce komponenty pro výběr počtu řádek stránkování, co je na tom špatně?
Editoval jenicek (30. 5. 2014 12:44)
- Mesiah
- Člen | 240
Minimálně samotná service, která udělá jen to, že zpřístupní
parametry je zbytečná.
Stránkování máš řešeno komponentou, která má nějakou logiku? Pokud
ano, pak bys měl třídě, která řeší logiku stránkování předat jako
argumenty tyto rozsahy, což může být řešeno servisou (myslím tu logiku
stránkování, ne předávání prametrů)…
Editoval Mesiah (30. 5. 2014 12:47)