K čomu sú potrebné názvy service?
- iNviNho
- Člen | 352
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
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
Není to „k ničemu“, je to právě jediný způsob, jak předávat služby, když nelze použít autowiring.
- Michal Vyšinský
- Člen | 608
iNviNho napsal(a):
Rád by som mal ešte 2 otázky:
- Aký by si hľadal hned rozdiel pri pohlade na názvy KontaktRepository a KontaktService, respektíve rozdiel repository/service
- 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.
- 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í.
- Například při práci s více databázemi.
- Tomáš Votruba
- Moderator | 1114
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)
- David Matějka
- Moderator | 6445
@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
@iNviNho: kdyz mas vice zavislosti stejneho typu, tak by selhal autowiring
- Tomáš Votruba
- Moderator | 1114
@matej21 Rozumím, tedy lepší příklad by vypadal takto:
services:
foo: SomeFactory(App\Entity\Foo)
bar: SomeFactory(App\Entity\Bar)
- petr.pavel
- Člen | 535
@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.
- Tharos
- Člen | 1030
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)