přístup k proměnným globálně

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

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

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

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

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

@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?

pkristian
Člen | 29
+
0
-

@h4kuna je to trošku abstraktní ano, ale díky, zkusím se na to juknout

@jenicek zajímavý nápad… taky mně to napadlo, jen se mi nějak nepovedlo service zaregistrovat… větět tak v jakým namespace musí být apod… brr :D

@Jan Tvrdík a tobě pane díky za tim na Environment

Jan Suchánek
Člen | 404
+
0
-

Na tom nic neni model si zaregistrujes v neonu jako sluzbu a jedes…

pkristian
Člen | 29
+
0
-

@jenicek mno, tak třeba pak… :) už jsem to udělal pomocí statický třídy…

teď řeším závislý porblém, jak připojit k routě databázi, když konstruktor je již obsazený?

Jan Tvrdík
Nette guru | 2595
+
0
-

@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ý?

pkristian
Člen | 29
+
0
-

@Jan Tvrdík jo k předávání závislostí to používám, ovšem Nette\Application\Routers\Route již konstruktor má

Jan Tvrdík
Nette guru | 2595
+
0
-

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

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

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

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

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

@pkristian: dibi není zastaralá, dibi je hotová, to je dost zásadní rozdíl =)

Jan Suchánek
Člen | 404
+
0
-

@pkristian: jako dobrej příklad jak používat parametry je třeba Webloader.

pkristian
Člen | 29
+
0
-

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

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

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

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)