získání repository v jiném místě než presenteru

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

::Nováček::
Ahoj, chtěl bych mezi presenter a databázi vložit ještě jednu třídu, která by se starala o nějakou logiku věci. Chtěl bych docílit toho že z presenteru si zavolám nějakou třídu a její metodu která mi vrátí řádek z databáze a zároveň bude ošetřovat různé věci a stavy které mohou nastat.
No a já nevím jak donutit tu třídu aby se dostala k repository, pač mimo presenter nevím jak se dostat ke kontextu, ze kterého si ten repozitář tahám.

Děkuji za radu.

ViPEr*CZ*
Člen | 818
+
0
-

Ahoj, podívejte se na quickstart. Tam je vidět jak se dělá repozitář (model).
Nebo to už máte a potřebujete (chcete si vyzkoušet) mezi repozitář a Presenter dát ještě jeden objekt?
Pak si objekt zaregistrujte jako službu v konfigu (podobně jako samotný repozitář) a přes konstruktor si předejte ten repozitář (stejně jako si předáváte připojení na databázi v samotném repozitáři).

Cup napsal(a):

::Nováček::
Ahoj, chtěl bych mezi presenter a databázi vložit ještě jednu třídu, která by se starala o nějakou logiku věci. Chtěl bych docílit toho že z presenteru si zavolám nějakou třídu a její metodu která mi vrátí řádek z databáze a zároveň bude ošetřovat různé věci a stavy které mohou nastat.
No a já nevím jak donutit tu třídu aby se dostala k repository, pač mimo presenter nevím jak se dostat ke kontextu, ze kterého si ten repozitář tahám.

Děkuji za radu.

Cup
Člen | 38
+
0
-

Ano, model a celou quickstart aplikaci mam jiz hotovou. Chci vlozit objekt mezi presenter a repozitar. Zkusim to tedy nejak tak, jak jste napsal.

Jen otazka: ja se tedy nevyhnu inicializaci objektu, v kazdem presenteru, kde budu chtit ten „mezi“ objekt pouzit.

Tedy, ze bych repozitar nepredaval parametrem konstruktoru, ale proste jej ziskal nejak jinak v tom „mezi“ objektu. A v presenteru, ktery „mezi“ objekt pouziva volal pouze jeho metody.

kuzma88
Člen | 15
+
0
-

Cup napsal(a):

Ano, model a celou quickstart aplikaci mam jiz hotovou. Chci vlozit objekt mezi presenter a repozitar. Zkusim to tedy nejak tak, jak jste napsal.

Jen otazka: ja se tedy nevyhnu inicializaci objektu, v kazdem presenteru, kde budu chtit ten „mezi“ objekt pouzit.

Tedy, ze bych repozitar nepredaval parametrem konstruktoru, ale proste jej ziskal nejak jinak v tom „mezi“ objektu. A v presenteru, ktery „mezi“ objekt pouziva volal pouze jeho metody.

asi bych chtel vedet to „ziskal nejak jinak“… repozitar muzes vytvorit naprimo v tom objektu, ale to je proti principu DI a v „mezi“ objektu skryjes zavislost na repozitar… a to neni ta spravna cesta… spravne je to injectout pres konstruktor. Co je spatne na te inicializaci objektu v presenterech?

Oli
Člen | 1215
+
0
-

Spravně by jsi neměl ukrývat závislosti a repository má závislost na connection proto by jsi ji měl nechat probublat. Implementace by teda mohla vypadat takhle:

// confg
services:
    database: @Nette\Database\Connection
    authenticator: Authenticator
    somePadding: SomePadding (@repository1)
    repositry1: Repository1
    repositry2: Repository2
    ...

// Presenter
function __construct(\SomePadding $somePadding)
{
	$this->somePadding= $somePadding; ...
}

function actionDefault($id)
{
	$padding = $this->somePadding;
	$padding->getSomething($id);
}

// SomePadding
function __construct(\Repositry1 $repository)
{
	$this->repository = $repository;
}

public function getSomething($id)
{
	// some magic
	return $this->repository->getRow($id);
}

// Repository1
function __construct(\Nette\Database\Connection $db)
{
	$this->db = $db
}

public function getRow($id)
{
	return $this->db->table('some_table')->wherePrimary($id)->fetch();
}
Cup
Člen | 38
+
0
-

Děkuji moc. Už mi to díky vašim radám jede, tak jak jsem si přál.