K čomu sú potrebné názvy service?

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

Ahojte, jednoduchá otázka

Aký je rozdiel, respektíve vo využítí pri:

<?php
services:
	Kontakt : App\Model\KontaktRepository
?>

a

<?php
services:
	- App\Model\KontaktRepository
?>

Následne

<?php
class KontaktRepository extends Nette\Object {

     /** @var Nette\Database\Context */
    private $database;

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

    public function vratVsetko()
    {
        return $this->database->query("select * from kontakty")->fetchAll();
    }

}
?>
  • v presenteri
<?php
/** @var Model\KontaktRepository @inject */
    public $kontakty;
?>

Editoval iNviNho (18. 6. 2014 23:38)

David Matějka
Moderator | 6445
+
+7
-

Vetsinou k nicemu. Je to stary zpusob, anonymni sluzby bez nazvu jsou tu myslim od 2.1. Hodilo se to, kdyz jsi pouzival context jako service locator

$this->context->kontakt

Snad jediny, k cemu muze byt jmeno uzitecne nyni, je pri rucnim predavani zavislosti

services:
	kontakt: KontaktRepository
	foo: FooService(@kontakt)

Coz se hodi treba kdyz mas vice sluzeb stejneho typu a nemuze tedy fungovat autowiring.

David Grudl
Nette Core | 8233
+
+5
-

Není to „k ničemu“, je to právě jediný způsob, jak předávat služby, když nelze použít autowiring.

iNviNho
Člen | 352
+
0
-

Rád by som mal ešte 2 otázky:

  1. Aký by si hľadal hned rozdiel pri pohlade na názvy KontaktRepository a KontaktService, respektíve rozdiel repository/service
  2. Mohli by ste mi popísať kedy by som takúto závislosť v reálnom príklade využil, stačí slovne.

Ďakujem za odpovede.

Michal Vyšinský
Člen | 608
+
0
-

iNviNho napsal(a):

Rád by som mal ešte 2 otázky:

  1. Aký by si hľadal hned rozdiel pri pohlade na názvy KontaktRepository a KontaktService, respektíve rozdiel repository/service
  2. Mohli by ste mi popísať kedy by som takúto závislosť v reálnom príklade využil, stačí slovne.

Ďakujem za odpovede.

  1. Repository – čistě skladiště dat, ze kterého je jen taháš, takže se nestará o ukládání/mazání. Service může dělat vše, a podle mě to není hezký postfix pro třídy, které jsou už tak servisní.
  2. Například při práci s více databázemi.
vvoody
Člen | 910
+
0
-

Názvy služieb sú dobré na to aby sme na nich mohli v configu odkázať. Napríklad vypnúť autowiring niektorej služby z extension.

servicese:
	nette.templateFactory:
		autowired: no
	- App\MyTemplateFactory

Editoval vvoody (19. 6. 2014 16:24)

Tomáš Votruba
Moderator | 1114
+
0
-

matej21 napsal(a):

Snad jediny, k cemu muze byt jmeno uzitecne nyni, je pri rucnim predavani zavislosti

services:
	kontakt: KontaktRepository
	foo: FooService(@kontakt)

Coz se hodi treba kdyz mas vice sluzeb stejneho typu a nemuze tedy fungovat autowiring.

A co tento zápis? Ekvivalent k getByType() v containeru.

services:
    - KontaktRepository
    - FooService(@KontaktRepository)
iNviNho
Člen | 352
+
0
-

Prečo by som si chcel vypnúť autowire? Nepíšem to do services práve kvôli tomu aby to prebehol autowire?

David Matějka
Moderator | 6445
+
0
-

@TomášVotruba: pokud se zavislosti nechaji resolvnout dle typu, tak se nechaji autowirovat a je tedy zbytecne je takhle uvadet. Pojmenovane service jsou tu prave pro pripad, kdy zavislost nejde autowirnout

David Matějka
Moderator | 6445
+
0
-

@iNviNho: kdyz mas vice zavislosti stejneho typu, tak by selhal autowiring

Tomáš Votruba
Moderator | 1114
+
0
-

@matej21 Rozumím, tedy lepší příklad by vypadal takto:

services:
    foo: SomeFactory(App\Entity\Foo)
    bar: SomeFactory(App\Entity\Bar)
bazo
Člen | 620
+
+5
-

len taka rada pomimo, programuj prosim ta v anglictine.

petr.pavel
Člen | 535
+
-4
-

@bazo: Nesouhlasím. Pokud je naprosto nereálné, že by se projektu v brzké budoucnosti účastnil ne-Čech, je praktičtější čeština. Vyhneš se nepochopitelným czenglish konstruktům a komentářům, ostychu (víc komentářů) a čitelnějšímu oddělení tříd aplikace od tříd knihoven.

Mysteria
Člen | 797
+
0
-

@petr.pavel Jak konkrétně chceš dosáhnout jazykové konzistence používáním češtiny a frameworku, který používá angličtinu? To asi moc fungovat nebude, viz KontaktRepository, název metody v ČJ a obsah v AJ,…

Tharos
Člen | 1030
+
+1
-

Já názvy služeb občas používám v testech, když potřebuji v již hotovém DI kontejneru nahradit nějakou službu mockem či nějak speciálně nakonfigurovanou instancí. Hodí se to například u Nette\Http\Request (zejména u jednotkových testů presenterů):

$container->removeService('httpRequest');
$container->addService('httpRequest', $fakeHttpRequest);

Zatím jsem neobjevil způsob, jak tohle udělat bez použití názvu služby…

Editoval Tharos (22. 6. 2014 22:47)