Diskuze: Nette PHP
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
$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(@connection), 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
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..
jinak fakt dekuju za snahu mi to vysvetlit.. nikoho ve svem okoli nemam kdo
by tomu rozumel a byl ochotny pomoct.. a tak se treba zaseknu.. a sedim
pul dne a googlim kde je problem..
tak jsem obcas fakt na prasky z toho
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\Database\Connection a Registrace) a předá jim závislosti. Presenter si pak metodou injectCokoli(Registrace $registrace) {} řekne o službu Registrace, která už existuje (DI kontejner jí sám předá Nette\Database\Connection). Výhody tohoto přístupu jsou podle mě celkem zřejmé:
BTW. dostat model Nette\Database\Connection do presenteru je možné (dokonce velice jednoduše), ale není to potřeba.
Zobrazeno 6 zpráv z 6.