Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Refaktoryzacja kontrolerów Symfony. Proszę o wskazówki.
porzeczki
post
Post #1





Grupa: Zarejestrowani
Postów: 144
Pomógł: 0
Dołączył: 15.09.2016
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Chciałbym zabrać się za refaktoryzację projektu (pierwszego i jedynego jaki zrobiłem - praca dyplomowa inż). Robiłem go nie zwracając uwagi na zasady porządnego kodu, bo ich nie znałem, projekt miał wyglądać dobrze w przeglądarce internetowej a nie w IDE. Teraz, gdy naczytałem się stosu książek i best practices głowa pęka i nie potrafię tego natłoku nowych informacji posortować w głowie i wykorzystać.

Jakby komuś się strasznie nudziło to byłbym bardzo wdzięczny za wskazanie głupot w tych kontrolerach i ogólnych wskazówek typu: "takie rzeczy to przenieś i używaj jako usług", " z tego najlepiej zrobić listener", "takie coś nie powinno być w kontrolerze".

Będę wdzięczny za każdą, nawet najbardziej ogólną, nie związaną z tą aplikacją uwagę.

github.com/.../Bundle/Controller/


edit:
chociaż tak sobie wszedłem teraz w pierwszy lepszy kontroler to zacząłem wątpić by komuś chciało się rozkminiać o co tam w ogóle chodzi,a bez zrozumienia o co chodzi chyba nie da się strzelać poradami jak to refaktoryzować.

Ten post edytował porzeczki 28.09.2016, 02:19:12
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
kpt_lucek
post
Post #2





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(porzeczki @ 1.10.2016, 12:03:13 ) *
[...]
masz na myśli to, by przenieść taki kod z kontrolera czy żeby zastąpić else kolejnym ifem lub switchem?

1.
Nie

Dla przykładu:
  1. if($session->has('cart'))//jeśli zmienna sesji cart juz jest to:
  2. {
  3. $cart = $session->get('cart');
  4. $cartquantity = array_sum($cart) ;
  5. }else{
  6. $cartquantity = 0;
  7. }


Możesz zamienić w ten sposób:
  1. $cartquantity = 0;
  2.  
  3. if($session->has('cart'))
  4. {
  5. $cart = $session->get('cart');
  6. $cartquantity = array_sum($cart);
  7. }


Wartość logiczna jest ta sama, a kodu mniej.

---

2.
Używaj serwisów, wrzucaj logikę tam, im niżej w hierarchii tym lepiej, bo mniejsza duplikacja kodu.
  1. $session = $request->getSession();
  2.  
  3. if($session->has('cart'))//jeśli zmienna sesji cart juz jest to:
  4. {
  5. $cart = $session->get('cart');
  6. if(!array_key_exists($isbn,$cart))//jeśli isbn nie jest w koszu
  7. {
  8. $cart[$isbn]=1; // = 1
  9. }
  10. else
  11. {
  12. $cart[$isbn]++; //to zwiększ wartość ++
  13. }
  14. }
  15. else
  16. {
  17. $cart[$isbn]=1;
  18. }
  19. $session->set('cart',$cart );

Pomyśl ile razy robisz logikę podobną do powyższej, nie prościej zarejestrować serwis który jako dependency ma serwis @session i bezpośrednio na nim bazuje?

---

3.
Twórz własny Exception, tak aby opisywał zdarzenie, bo inaczej na dłuższą metę się nie połapiesz.
  1. if(!$cart_obiekt->session->has('cart')) {
  2. throw new \Exception('Koszyk pusty.');
  3. }


---

4.
Używaj CONSTów, zwłaszcza jak współdzielisz nazwy parametrów pomiędzy uslugami.

  1. $session->set('cart',$cart );


---

5.
Używaj repozytoriów

  1. $em = $this->get('doctrine.orm.entity_manager');
  2. $dql = "SELECT a FROM AppBundle:Ksiazka a";
  3. $query = $em->createQuery($dql);


Powyższy kod możesz wstawić w Repozytorium i korzystać z niego w wielu miejscach bez potrzeby duplikowania go (nawiązuje do #2).

Poza tym, to co masz wyżej i tak możesz uprościć:
  1. /** @var EntityManager $em */
  2. $em = $this->get('doctrine.orm.entity_manager');
  3. $query = $em->getRepository('AppBundle:Ksiazka')
  4. ->createQueryBuilder('ksiazka')
  5. ->getQuery();


I wiele więcej (IMG:style_emoticons/default/smile.gif)

Ten post edytował kpt_lucek 1.10.2016, 12:55:25
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 16:32