Article View: pl.comp.lang.php
Article #232362Symfony 4 - jaka korzyść z wstrzykiwanych service providerów?
From: Marek S
Date: Sun, 14 Apr 2019 20:27
Date: Sun, 14 Apr 2019 20:27
80 lines
3541 bytes
3541 bytes
Witam,
Wyjaśnię, że stawiam pierwsze kroki w Symfony 4. Dotarłem do etapu
tworzenia Service Providerów w jakimś kursie. Oczywiście ja, jakto ja,
nigdy bezmyśnie nie przepisuję tego, co w kursie mówią lecz od razu
buduję życiowe sytuacje symulując praktyczne użycie.
No i albo czegoś nie ogarniam, albo autowiring to jakaś ściema i kula u
nogi, czasem nawet uniemożliwiająca korzystanie z tej funkcjonalności.
Korzystanie z klas w klasyczny sposób dla PHP wydaje się być
nieporównywalnie lepszym podejściem. Sprostujcie mnie. Zapewne czegoś
nie dostrzegam.
Oto przykład kontrolera, gdzie poległem:
<?php
namespace App\Controller;
use App\Entity\Users;
use App\Services\MarekService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class DefaultController extends AbstractController {
/**
* DefaultController constructor.
*/
public function __construct(MarekService $marekService) {
array_unshift($marekService->gifts, "constr");
}
private function getRandom(MarekService $marekService): array {
return $marekService->gifts;
}
/**
* @Route("/default", name="default")
*/
public function index(MarekService $marekService) {
$users =
$this->getDoctrine()->getRepository(Users::class)->findBy([], ['name' =>
'ASC']);
return $this->render('default/index.html.twig', [
'controller_name' => 'DefaultController',
"users" => $users,
"gifts2" => $this->getRandom(),
"gifts" => $marekService->gifts,
]);
}
}
Załóżmy, że wszystkie metody będą potrzebowały korzystać z MarekService.
Jeśli chodzi o metody publiczne, te, które budują routing lub
konstruktor, to wszystko ok choć, moim zdaniem, niepotrzebnie dużo
piszemy przekazując do każdej z tych metod regułkę:
MarekService $marekService
Prościej byłoby w konstruktorze przypisać do zmiennej prywatnej:
$this->prv=new MarekService();
...i dalej w kodzie posługiwać się $this->priv zamiast każdorazowo
wstrzykiwać coś.
Po drugie, przy wstrzykiwaniu powstała sprzeczność. Popatrzcie na metodę
prywatną $this->getRandom(). Wstrzykuję do niej MarekService, a z
drugiej strony chcę ją użyć bez przekazywania parametrów (na dole
skryptu), bo nie ma po co ich przekazywać. Metoda ma mi coś zwrócić i
koniec, kropka. Gdybym bazował na $this->priv, to taka sprzeczność nie
miałaby miejsca.
--
Pozdrawiam,
Marek
Technical Details
Message-ID:
<q90548$dop$1@node1.news.atman.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mailShow Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!.POSTED!not-for-mail From: Marek S <precz@spamowi.com> Newsgroups: pl.comp.lang.php Subject: Symfony 4 - jaka korzyść z wstrzykiwanych service providerów? Date: Sun, 14 Apr 2019 22:27:45 +0200 Organization: ATMAN - ATM S.A. Lines: 80 Message-ID: <q90548$dop$1@node1.news.atman.pl> NNTP-Posting-Host: 89-70-94-204.dynamic.chello.pl Mime-Version: 1.0 X-Trace: node1.news.atman.pl 1555273672 14105 89.70.94.204 (14 Apr 2019 20:27:52 GMT) X-Complaints-To: usenet@atman.pl NNTP-Posting-Date: Sun, 14 Apr 2019 20:27:52 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 X-Mozilla-News-Host: news://news.atman.pl:119 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit