🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.php
Article #232362

Symfony 4 - jaka korzyść z wstrzykiwanych service providerów?

#232362
From: Marek S
Date: Sun, 14 Apr 2019 20:27
80 lines
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-mail

Show 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