Diskuze: Nette PHP

PHP Nette Framework Nette framework Nette PHP

Avatar
joker.a
Redaktor
Avatar
joker.a:

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
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na joker.a
Drahomír Hanák:

$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
Redaktor
Avatar
joker.a:

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
Redaktor
Avatar
Odpovídá na Drahomír Hanák
joker.a:

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
Redaktor
Avatar
Odpovídá na joker.a
Kit:

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
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na joker.a
Drahomír Hanák:

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.