Vlastní extension – jednoduchý návod od A – Z

pasik
Člen | 8
+
0
-

Ahoj,

nějakou dobu s Nette dělám (tak normálně) a trápí mě, že opravdu nemůžu pochopit jak vytvořit vlastní rozšíření.

Není problém s packagist, composerem ani s vytvořením samotného PHP kódu (který bude něco dělat).

Čtu pořád dokola „návod“ https://doc.nette.org/…n/extensions ale je to spíše takový obecný popis a hlava mi to nebere. Nevím co je addSetup, getDefinition, jak předat/přidat třeba nějaké další třídy / služby / parametry atd.

Několik rozšíření jsem studoval, ale přijde mi, že je napsané každé uplně jinak, navíc je kolem toho připojeno X dalších tříd a já se utápím ve zmatku a smutku.

Proto bych se chtěl zeptat, ač jsem asi hodinu neúspěšně googlil.

Neexistuje nějaký jednoduchý tutoriál na nějakou jednoduchou extension (třeba nějaké články, nebo stažení kurzů z ČNB nebo něco takhle jednoduchého), kde by autor vysvětlil vše od A-Z (proč tohle, co dělá tohle), viděl jsem extensions s modely , komponentami, presentery atd…

Planette.org je plné hezkých postupů a návodů, ale na tohle nic.

Moc díky za info.

Editoval pasik (21. 11. 2019 22:17)

pasik
Člen | 8
+
0
-

Mno tak se mi nějak podařilo to aspoň trošku pochopit a napsal jsem si „rozšíření“, které se jmenuje HelloWorld (je to defakto jen model), který má jen 1 nastavení a to „name“ takže to vypíše HelloWold $name.

OK fajn. (Docela jsem to pochopil z této extenze https://github.com/…GoogleMapAPI)

Nicméně co mi tedy není vůbec jasné: zde https://doc.nette.org/…n/extensions#… se používá k nastavení „služeb“ či čehosi @connection a @logger, chápu to tak, že to jsou pojmenované služby v neonu? Nešly by injectnout normálně? Já když to zkouším u sebe (a řekněme, že to jsou nějaké vymyšlené služby tak mám)

services:
	tag: App\Model\Tag

a dále

		$builder->addDefinition($this->prefix('hello'))
			->setFactory(Pasik\Model\HelloWorld::class, [@tag])
->addSetup('setName', array($config['name']));

a pak když to dumpnu, tak vidím jen string „tag“. Takže nechápu jak to funguje. Zkoušel jsem tam dávat všechno co je popsáno tady https://doc.nette.org/…onfiguration, třeba @Nette\Database\Connection, nebo @http.request::getRemoteAddress() a vždy to napíše use of undefined constant request – assumed …

Jsem z toho jelen. Vysvětlí / objasní někdo?

pasik
Člen | 8
+
0
-

:)

->setFactory(Pasik\Model\HelloWorld::class, [@tag])
=>
 ->setFactory(Pasik\Model\HelloWorld::class, ['@tag'])
Martk
Člen | 651
+
0
-

Nejlepší věc na učení je, že si budeš psát na čistém projektu jen s nette/di a vždycky se podíváš do cache, co se ti vygenerovalo.

Tady máš nějaký článek, kde vidíš zápis ⇒ výsledek di containeru: https://f3l1x.io/…ovat-sluzby/

předávání služeb přes jejich jméno (@tag) je potřebné jen, pokud je autowired vypnutý.

Aby se popsalo, co všechno se dá v nette/di dělat a jak to funguje, tak to vydá na několik dlouhých článků, aby to pochopil i člověk, který to vidí poprvé.

Felix
Nette Core | 1183
+
+1
-

@pasik Mrkni na balicky https://github.com/contributte/, skoro kazdy ma slozku src/DI kde je nejaka CompilerExtension. Zkus si najit nejakou jednoduchou a pridat si ji do cisteho projektu. Pak bych se mrknul do temp/cache/nette.configurator a tam nasel odpovidajici vygenerovanej container.

pasik
Člen | 8
+
0
-

Díky oboum. Už jenom to, že jsem @tag přidal jako string mi to začalo fungovat.
Informaci o tom, že to není potřeba když je zaplý autowiring je také velmi přínosná.
Článek od @Felix si přečtu aspoň 3× včetně postupu jak tomu více porozumět viz @Felix

pasik
Člen | 8
+
+1
-

https://github.com/…cy-injection

Tohle je úžasný, velká pochvala :-)