Úplné začátky s nette, správné pochopení programování v nette

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

Vím že toho tu je hodně, ale již jsem v koncích.
Celou neděli jsem strávil nad tím, jak vůbec do nette dostat funkčně dibi. Nikdy jsem to nenašel. Všude jsou návody na starší verzi, ovšem nyní, jsem to rozjel a doufám že dobře.

Využívám verze 2.1.x (v sobotu staženo)

do config.local.neon jsem přidal

dibi:
	host: localhost
	username: login
	password: xxx
	database: db
	lazy: TRUE

a následně do složky /vendor/other jsem nahrál celé dibi

následně mi stačilo do konstruktoru presenteru přidat jako vstupní parametr \DibiConnection $database a bylo vše funkční.
Zde bych prosil o kontrolu popř. co jsem udělal zbytečně či špatně.

Tak, toto mi už krásně jede a vypisuji články, mažu, edituji a to samé s tématy. (zde bych prosil o přesnější radu jak to udělat správně z pohledu MVC abych v presenteru neměl SQL commandy – udělat model? nebo si napsat knihovnu pro práci s DB obsluhující články? – přijde mi to trochu zbytečné, jelikož by to byly metody zaobalující jen commandy [popř. jak tam dostanu connect?])
No a přišlo mi ejhle. Jak na přihlašování, registraci apod. vůči DB? Návod jsem bohužel již nenašel a ne a ne do toho proniknout.

Možná asi nechápu vůbec jak správně v nette programovat :( Budu moc rád, kdyby mi toto vše někdo osvětlil.

Moc děkuji předem a doufám, že se nějaký dobrák najde

Tirus91
Člen | 199
+
0
-

Tak jsem si zatím sám na něco odpověděl.
Abych pravdu řekl, tak topic https://forum.nette.org/…senterom-atd mi řekl víc než celý quickstart.

Pochopil jsem k čemu přesněji jsou modely (model mi obstará komunikaci s DB a následně výsledky či data navrátí skrze return do presenteru). Dále jsem pochopil jak daný modul zaregistrovat jako službu a skrze injection at skrze komentář nebo do konstruktoru dostat nějaké info

do modelů vždy dostávat služby a connect skrze konstruktor a do presenterů klidně skrze koment (zda si pamatuji dobře.)

Tak tudíž, tímto se dá říct, že je první problém vyřešen.
Jak tedy na tu službu pro přihlašování? Opět třídu, pro User management mám dát jako model?

BigCharlie
Člen | 283
+
0
-

do config.local.neon jsem přidal

to jsi přidal správně

a následně do složky /vendor/other jsem nahrál celé dibi

Zní to, jakože ručně. Nejjednodušší je to asi přes composer, stejně jako samotné nette. Podrobnosti si dohledej. Pokud jsi to dělal přes composer, tím líp.

následně mi stačilo do konstruktoru presenteru přidat jako vstupní parametr \DibiConnection $database a bylo vše funkční.

konstruktor presenteru není dobrá volba. Doporučovaný postup vypadá v presenteru třeba takto:

/** @var \DibiConnection @inject **/
public $database;

Tak, toto mi už krásně jede a vypisuji články, mažu, edituji a to samé s tématy. (zde bych prosil o přesnější radu jak to udělat správně z pohledu MVC abych v presenteru neměl SQL commandy – udělat model? nebo si napsat knihovnu pro práci s DB obsluhující články? – přijde mi to trochu zbytečné, jelikož by to byly metody zaobalující jen commandy [popř. jak tam dostanu connect?])

Nikdo tě nenutí vyčlenit to do modelu.

Co získáš tím, že to uděláš? Pokud budeš tu aplikaci spravovat či rozvíjet, bývá jednodušší všechny činnosti (business logiku aplikace) rozdělit do jednotlivých tříd. Nějaká třída (jedna nebo víc) pro práci s články, nějaká pro práci s uživatelem (jedna nebo víc). Proč to „jedna nebo víc“? Liší se to podle zvyklostí a znalostí programátora, složitosti aplikace atd.

Proč jednodušší? Předpokládám, že ty jednotlivé třídy asi budou o něco kratší, snad přehlednější. A ideálně budou splňovat spoustu dalších věcí – teorii si dohledej.

Řekněme, že tedy máš nějakou superprimitivní třídu pro práci s články. Ta si v konstruktoru (ano, u modelu je to obvykle správná volba) vyžádá DibiConnection:

class Articles {
	/** @var \DibiConnection **/
	private $database;

	public function __construct(\DibiConnection $db) {
		 $this->database = $db;
	}

	public function findArticle($id) {
		return $this->database->query('sql')->fetch();
	}
}

Tuhle třídu potřebuješ dostat do presenteru. Jak? Stejně jako jsme tam dostali dibi. Takže config.neon:

services:
	- Articles

a v presenteru třeba

/** @var \Articles @inject **/
public $articles;

DI container v Nette už zařídí, že dostaneš, co potřebuješ.

No a přišlo mi ejhle. Jak na přihlašování, registraci apod. vůči DB? Návod jsem bohužel již nenašel a ne a ne do toho proniknout.

Viz výše. V zásadě se to opakuje stále dokola. Takže třída(y) pro přihlášování, šup s ní do config.neon, vyžádat (injektnout/vstříknout, jak je libo) v presenteru, použít.

Zkus pročíst dokumentaci, projít quickstart. Když u toho budeš přemýšlet, dost věcí ti začne zapadat do sebe.

Všehno píšu z hlavy, takže jsou tam možná chyby. Třeba mě někdo doplní či opraví. Navíc všechno by mělo být k nalezení v dokumentaci, příkladech v nette či zde na fóru.

Tirus91
Člen | 199
+
0
-

jo, tak nyní to snad již vše i celkem chápu :)
Děkuji mnohokrát.
Jen jedna věc. Ta třída pro obsluhu user managmentu, defakto je to opět modul a dát jako službu, jen ale nechápu, proč je všude metoda autenticate()?

Mysteria
Člen | 797
+
0
-

authenticate() je metoda, která se zavolá, když někde v presenteru napíšeš $this->user->login(‚login‘, ‚password‘), tzn slouží pro přihlašování uživatelů.

Tirus91
Člen | 199
+
0
-

Takže má třída pro user managment musí obsahovat tuto metodu?

Mysteria
Člen | 797
+
0
-

Pokud chceš využívat to, co ti Nette nabízí, tak ano. Mrrni se sem, jak se s tím pracuje: https://doc.nette.org/…thentication#…

Editoval Mysteria (25. 2. 2014 0:01)

David Matějka
Moderator | 6445
+
0
-

pokud chces, aby se ti tato trida starala o autentifikaci, tak ano. + musi implementovat rozhrani Nette\Security\IAuthenticator (viz UserManager v sandboxu)

edit: tesne :))

Editoval matej21 (25. 2. 2014 0:01)

Tirus91
Člen | 199
+
0
-

Tak super :) již s tím válčím lépe :)

Jen nějak asi nechápu jak volat metodu pro registraci. Myslel jsem, že to bude něco jako

$this->getUser()->add(....);

ale ono prd.. To musím mít jako službu a skrze inject si tam dotáhnout ten model?

Mysteria
Člen | 797
+
0
-

Myslíš tu metodu add() co je v tom UserManageru?

$this->user->getAuthentificator()->add(...);
David Matějka
Moderator | 6445
+
0
-

@Tirus91: $this->getUser() vraci objekt typu Nette\Security\User, UserManager si budes muset injectnout. Nette\Security\User spolupracuje s tvym UserManager-em prave pouze pri autentizaci, jelikoz vidi, ze to implementuje Nette\Security\IAuthenticator

Tirus91
Člen | 199
+
0
-

@Mysteria:
Už jsem to vyřešil :), ale ano, toto jsem myslel
@matej21:
Ano, takto jsem to už udělal. Děkuji

Momentálně se hodlám zaútočit na ACL s vlastním gui a tahat ty údaje z DB, tak jsem zvědavej.