IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
joker.a
Tvůrce
Avatar
joker.a:1.10.2013 17:39

cus mam dalsi problem nejak mi nejde propojeni s databazi.

Model:

class Registrace
{
        private $database;
         function __construct(Nette\Database\Connection $connection)
        {
                $this->database = $connection;
        }

a v kontroleru volam:

$registrace = new Registrace($connection);

ctu uz nekolik hodin problematiku toho ze mi to nejde.. a nic jsem nenasel.. v cele domumentaci se rika ze je to spravne.. a ze proste to vubec nemusime resit.. proste rekneme ze predavame promennou $connection.. ktera je nekde globalne definovana v nette.. a nemusi nas zajimat co a jak... :X NO JO JENZE KDYZ ZAVOLAM ..

new Registrace(a sem nacpu tu promennou) tak mi to napise ze neni definovana ze jo.. tak proboha jak na to?

 
Odpovědět
1.10.2013 17:39
Avatar
Odpovídá na joker.a
Drahomír Hanák:1.10.2013 17:51

$connection nikde globálně není (pokud si ji sám někde globálně nedefinuješ). Použij DI kontejner. V config.neon si zaregistruj službu "registrace":

registrace: Registrace

Pokud má argument v konstruktoru třídy Registrace explicitně uvedený typ (v tvém případě má), DI injector pozná, jakou službu tam má předat (btw. můžeš tam ale klidně napsat Registrace(@con­nection), kde @connection je odkaz na službu připojení k databázi)

V presenteru si předáš službu registrace takhle:

private $registrace;

public function injectRegistrace(Registrace $registrace) {
   $this->registrace = $registrace;
}

Pak můžeš použít v presenteru $this->registrace

 
Nahoru Odpovědět
1.10.2013 17:51
Avatar
joker.a
Tvůrce
Avatar
joker.a:1.10.2013 19:33

vubec nechapu proc mam pridavat dalsi metodu.. jediny co potrebuju je pri vytvoreni nejak deklarovat promenou $connection

nepotrebuju udelat nic jineho..

 class Registrace
{
        private $databaze;

         function __construct(Nette\Database\Connection $connection)
        {
                $this->database = $connection;
        }

    function pridatZaznam($jmeno,$heslo,$email) {
        $this->databaze->exec("INSERT INTO uzivatel (jmeno,heslo,email) VALUES (?,?,?)",$jmeno,$heslo,$email);
    }
}

a controler:

public function registraceUzivatele() {

        $registrace = new Registrace($db);

        $registrace->pridatZaznam("jmeno", "heslo", "email");
        $this->redirect("Sign:sing");

     }

jediny kde mi to rve. je v controleru $registrace = new Registrace($db);
protoze tu promenou kterou predavam.. radoby (databazi) nemam ji nikde deklarovanou... jediny co chci vedet je kde ji deklarovat. a jak.. aby proste pri vytvoreni instance tridy REGISTRACE.. se predala v parametru databaze.. nad kterou pak muzu delat exes a tak... aneb.. jediny co chci.. je AZ VYTVORIM NOVOU INSTANCI REGISTRACE.. tak aby pri zavolani jedne z metod v ni.. byla nejaka promenna reprezentujici databazi..

 
Nahoru Odpovědět
1.10.2013 19:33
Avatar
joker.a
Tvůrce
Avatar
Odpovídá na Drahomír Hanák
joker.a:1.10.2013 19:40

jinak fakt dekuju za snahu mi to vysvetlit.. nikoho ve svem okoli nemam kdo by tomu rozumel a byl ochotny pomoct.. :D a tak se treba zaseknu.. a sedim pul dne a googlim kde je problem.. :X tak jsem obcas fakt na prasky z toho :D

 
Nahoru Odpovědět
1.10.2013 19:40
Avatar
Kit
Tvůrce
Avatar
Odpovídá na joker.a
Kit:1.10.2013 20:06

Na diskuzním fóru Nette o tom nic není?

Nahoru Odpovědět
1.10.2013 20:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na joker.a
Drahomír Hanák:1.10.2013 20:25

Proč přidat novou metodu, která dostane instanci Registrace do presenteru?
Protože používáme Dependency Injection (http://www.itnetwork.cz/…avrhovy-vzor). Otázka by tak spíš měla být, proč používat nějaké Dependency Injection (DI) a ne radši instancovat přímo třídu Registrace a k čemu vlastně DI je?

Máš tedy presenter, který se stará o registrování uživatel. Presenter zná veřejné rozhraní Registrace a tak je schopný ho použít a vytvořit nový účet. Problém je, že nemá připojení k databázi. Proč by ho taky měl mít? On nepotřebuje připojení k databázi. Potřebuje model Registrace. Ten model si pak může uživatele ukládat třeba do textového souboru.

Problém tedy je, jak vytvořit službu Registrace a předat ji všechny závislosti (DB Connection)? O to se postará DI kontejner což není nic jiného, než objekt, který se stará jen o vytváření a předávání ostatních modelů. DI kontejner tak vytvoří instanci všech modelů (služeb), které budou potřeba (Nette\Databa­se\Connection a Registrace) a předá jim závislosti. Presenter si pak metodou injectCokoli(Re­gistrace $registrace) {} řekne o službu Registrace, která už existuje (DI kontejner jí sám předá Nette\Database\Con­nection). Výhody tohoto přístupu jsou podle mě celkem zřejmé:

  • presenter (a všechny komponenty, co používají model Registrace) se nestará o to, jak model vytvořit nebo odkud ho vzít
  • při změně (např. uložiště) nebo při přidání nových závislostí třídy Registrace není potřeba měnit kód všude, kde je Registrace použitá
  • je jasné na první pohled, na čem závisí model Registrace (DB Connection) a na čem závisí presenter (Registrace)

BTW. dostat model Nette\Database\Con­nection do presenteru je možné (dokonce velice jednoduše), ale není to potřeba.

 
Nahoru Odpovědět
1.10.2013 20:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.