Dependency Injection – problém (možná jsem ho úplně nepochopil)

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

Ahoj,

udělal jsem si vlastní (nevím proč ale vyhovuje mi to víc), Logger a Authorizator na práva.
Vyhovuje mi totiž na mojí aplikaci schéma

  • create
  • edit
  • delete
  • access

a to nevím jak bych přes ten v Nette přesněji dělal.
Mám následující problém:

Můj presenter:

public function startup() {
    parent::startup();
    $this->db = $this->context->{'dibi.connection'};
    $user = self::getUser();
    $this->authorizator = new Authorizator($this->db, $user->id);
    $this->logger = new Logger($this->db);

Můj model Pro authorizátor má tento konstruktor:

class Authorizator extends Base {

    protected $userID = NULL;
    public function __construct(\DibiConnection $connection, $userID)
    {
        parent::__construct($connection);
        $this->userID = $userID;
    }

Otázka zní: Mám to správně vyřešené? Mě se nezdá to dotazování na context v presenteru a předávání do modelu. Doufám že mě za můj přístup nebudete Hejtovat, rád bych se něčemu přiučil :)

//edit

ještě mi napadlo že by to měla být asi komponenta a né model co?

Editoval Xchos (12. 6. 2015 21:57)

akadlec
Člen | 1326
+
+1
-

A proč si z toho autorizátoru neuděláš službu a přes konstruktor si tam nedostaneš dibi connection a \Nette\Security\User ?

Xchos
Člen | 40
+
0
-

No a to me nenapadlo. Děkuju za postrčení :) .. Zkusím to nějak (když přijdu na to jak vytvořit službu, ale to bude už asi v dokumentaci).

Oli
Člen | 1215
+
0
-

@Xchos tady máš jak si vytvoříš službu: Vlastní služby. a v získávání závislostí jak tu službu získáš v presenteru, komponentě, jiné službě, kdekoli…

Xchos
Člen | 40
+
0
-

Oli napsal(a):

@Xchos tady máš jak si vytvoříš službu: Vlastní služby. a v získávání závislostí jak tu službu získáš v presenteru, komponentě, jiné službě, kdekoli…

Moc děkuju za pomoc, službu jsem zvládl udělat správně bez pomoci, včetně získání závislostí – už jsem se s tím setkal u továrniček na formuláře. Do presenteru injectuji takto:

/** @inject @var \App\ServiceName */
    private $serviceName;

Vše funkční, problém vyřešen, děkuji za ochotu a popostrčení :)

Jan Mikeš
Člen | 771
+
+3
-

@Xchos to asi ne :-) @inject funguje (alespon co si pamatuji) pouze na public properties

Xchos
Člen | 40
+
0
-

Koukam na to, jen sem to blbe napsal. V aplikaci jsem psal samozřejmě public (podle videopřednášky Filipa Procházky)