získání repository v jiném místě než presenteru
- Cup
- Člen | 38
::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
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
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
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
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();
}