Praktyka wzorców projektowych w PHP + Symfony

Praktyka wzorców projektowych w PHP + Symfony
0

Witajcie,

mam od kilku lat dwie książki na temat wzorców projektowych: "PHP Obiekty, wzorce, narzędzia" i "PHP Wzorce obiektowe". Od czasu zainteresowania się tematem napisałem dużo kodu proceduralnego w Kohana, w Yii i w Symfony2/3 korzystając z zastanych mechanizmach obiektowych. Niestety - nie udało mi się przez ten czas zaimplementować "od zera" projektowego wzorca obiektowego w praktycznym (biznesowym) zastosowaniu.

Starałem się czytać te książki z kartki do kartki - zbyt wysoka abstrakcja dla mnie. Raz na jakiś czas je przeglądam - wciąż za dużo niewiadomych. Natomiast przepisywanie przykładów miałoby według mnie większy sens, gdybym wyobraził sobie praktyczne zastosowania w większej aplikacji (taka nauka od ogółu do szczegółu), co dodatkowo dałoby mi zrozumienie jak projektować spójną architekturę aplikacji zorientowanej objektowo (a nie rozbudowywanie aplikacji od funkcjonalności do funkcjonalności).

Zależy mi na zrozumieniu tego zagadnienia, dlatego zwracam się do Was z prośbą o odpowiedzi na dwie kwestie:

  1. (trochę poboczne zagadnienie) Symfony jest (jak wiadomo) obiektowym frameworkiem MVC. Skoro ma wbudowane takie wzorce jak EventListener (Obserwator), czy Dependency Injection (inaczej Inversion of Control), Subscriber, Listener, to czy:
    1.a. są wzorce które nie da się zastąpić mechanizmami Symfony (jakie)?
    1.b. gdzie umieszczać dodatkowe klasy tych wzorców w strukturze katalogów/plików
    - najbliżej kontrolerów, czy też w katalogu z logiką, czyli tam gdzie jest implementowany DJ, czy też jeszcze gdzie indziej? A może jako bundle?

  2. Czy moglibyście podać jak najwięcej opisów przykładowych (ale praktycznych) aplikacji webowych (takie jakby "zadania domowe") które wymagałyby jak największą ilość wzorców projektowych jednocześnie (wraz z wymienieniem zalecanych wzorców)?

Byłbym niezwykle wdzięczny za wszelkie rady, wskazówki i odpowiedzi,
pozdrawiam.

ajgoron
Nurtują mnie podobne kwestie, też zauważyłem, że mimo, iż wykorzystuję frameworki stricte obiektowe to piszę w nich często kod strukturalny. Nie mówiąc już o tym, żeby wykorzystać tam jakieś wzorce dodane od siebie. Chętnie poczytam co mają do powiedzenia bardziej doświadczeni koledzy. :) Więc przyłączam się do Twojego pytania. :)
0

Gdzie piszesz najwiecej kodu w Symfony? W kontrolerach, czy repozytoriach? Moja znajomosc Symfony, to wlasnie pisanie akcji w kontrolerach i dodawanie metod w repozytoriach no i jeszcze dostosowywanie Twigów. Zaczalem tez pisac kod calkowicie od podstaw. Wymyslam jakis problem. Implementuje go obiektowo i powstaje mi obiektowy zarys aplikacji. Wraz ze wzrostem stopnia zaawansowania pojawia sie potrzeba uzycia wzorcow projektowych.

ajgoron
Ja staram się pisać w repozytoriach. Ale mam świadomość, że nie wszystko powinno być w repozytorium, które dotyczy danej encji. Gdzieś powinna być jeszcze logika zawarta, przecież repo określonej encji powinno służyć do pobierania danych, również do niestandardowych zapytań. Wydaje mi się, że nie cała logika powinna być tam zawarta. Ale jakoś nie mogę wymyślić jak w takim razie powinno to wyglądać, żeby nie zaśmiecać repozytoriów oraz kontrolerów.
0

(punkt 1.) Jak kontroler jest za gruby, to wtedy przerzucam część kodu do DI, jeżeli Twig nie realizuje jakieś funkcji, to opisują ją przez rozszerzenie Twig_Extension. Większość rzeczy o których piszemy to funkcjonalności CRUD, a mi właśnie chodzi o "wejście" na wyższy poziom abstrakcji w obrębie Symfony.

Rozdzieliłem te dwie kwestie (własne implementacje wzorców i Symfony) gdyż bardzo chętnie bym je połączył. Byłoby to spore uproszczenie "ścieżki edukacji". Trzeba być niesamowicie (chyba) silnie zmotywowany do pisania kodu od podstaw, skoro Symfony oferuje taką liczbę świetnych narzędzi. Autorski framework zastępujący funkcjonalność Symfony to (pewnie) kilkutygodniowa praca zaawansowanego programisty. Nawet uwierzytelnianie które by było odporne na ataki OWASP, wymaga dużego zaangażowania czasowego, a ja bym nie miał odwagi konkurować z FOSuserBundle.

Jeżeli nie da się tego pogodzić, to zrobię tak jak piszesz:

Gremlin007 napisał(a):

Zaczalem tez pisac kod calkowicie od podstaw. Wymyslam jakis problem. Implementuje go obiektowo i powstaje mi obiektowy zarys aplikacji. Wraz ze wzrostem stopnia zaawansowania pojawia sie potrzeba uzycia wzorcow projektowych.

Tutaj poruszasz interesująca mnie kwestię (punkt 2.). Złożona aplikacja (powiedzmy gra przeglądarkowa) może korzystać z wielu wzorców projektowych. Od którego zacząć, żeby "powstał obiektowy zarys aplikacji"? Jakie zadania polecasz (polecacie) żeby się płynnie wdrożyć w zagadnienia wzorców obiektowych?

0

W ksiazce "PHP Wzorce obiektowe" natrafilem na przyklad mieszania kodu php z html i css. Poza tym jest to ksiazka, w ktorej w bardzo przystepny sposob wytlumaczono OOP i wzorce. Ja korzystam w pelni ze zdobytej wiedzy przy pisaniu wlasnych rpogramow bez frameworka. Symfony w zamierzeniu tworcy miala sluzyc do szybkiego i bezpiecznego implementowania zaawansowanych Crudow. W chwili obecnej nie moge sobie wyobrazic innego zastosowania Symfony, jak rozne serwisy z kontami uzytkownikow, sklepy internetowe i rozne inny aplikacje do ktorych istnieja pakiety i nie trzeba ich pisac od podstaw.

PA
To zależy co jest do napisania, bo jakiegoś mikro skryptu nie będziesz przenosil na framework.. chociaż z drugiej strony i tak korzysta się osobno z twiga czy innych wspomagaczy
MA
  • Rejestracja:ponad 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:26
0

Takie coś znalazłem: http://stackoverflow.com/questions/13696059/design-patterns-used-in-symfony2
Tam jest schemat użytych wzorców w Sf2. Może to coś pomoże w nauce.

kchteam
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Tychy
  • Postów:155
2

Myślę, że należy rozdzielić tematykę wykorzystania wzorców projektowych od wykorzystania Symfony. Symfony to framework, który w ramowy sposób rozwiązuje problem zamiany żądania na odpowiedź i zawiera szereg narzędzi ułatwiających ten proces.

Kod, który implementuje szczegóły przetwarzania powinien być tworzony niezależnie od Symfony, powinien być jedynie w Symfony użyty.
Nie da się określić z góry, jakie wzorce wykorzystywać przy pisaniu kodu.

Wzorce służą do rozwiązywania typowych problemów programistycznych, które się pojawiają podczas kodowania. Jest ich na tyle dużo, że okazuje się, że niemal każdy problem można sprowadzić w większym lub mniejszym stopniu do problemu typowego lub kilku problemów typowych i to właśnie wtedy udaje się zastosować wzorzec projektowy. Natomiast podejście na zasadzie "mam wzorce i koniecznie chcę ich użyć" nigdy się nie sprawdza. W ten sposób powstają potworki z nadmiernie rozbuchaną strukturą kodu.

Kiedy jaki wzorzec zastosować? Parę przykładów poniżej:

  1. wykorzystanie zewnętrznej biblioteki, która komunikuje się z jakimś API - Adapter lub Proxy
  2. wykonanie pewnych, tych samych czynności, ale uruchamianych w różny sposób - Polecenie
  3. wykonanie tej samej operacji, ale w różny sposób w zależności od czegoś (np. serializacja tablicy w zależności od wybranego formatu serializacji) - Strategia
  4. wykonanie czynności złożonych poprzez rozbicie na podobne czynności podstawowe - Wzorzec Złożony (Composite)

To tylko kilka przykładów, ale właśnie tak należy stosować wzorce - trzeba zauważyć podczas kodowania, że to co robimy to typowy problem, który już ktoś kiedyś rozwiązał za pomocą wzorca.

Jeszcze odnośnie tego jak pisać kod, który w Symfony będzie użyty, a nie będzie z nim ściśle zintegrowany.
Należy starać się, żeby kod w kontrolerach był prosty.
To serwisy powinny implementować całą skomplikowaną logikę.
Repozytoria powinny służyć do pobierania, ewentualnie utrwalania obiektów - nie powinny posiadać zbyt dużo logiki.

[Adam]


Jeden zespół, tysiące możliwości!
0

Chyba rozumiem. Symfony jako frontend i CRUD aplikacji, zaś przetwarzanie danych (klasy) tam gdzie serwisy. Dzięki za rozmowę, trochę mi rozjaśniła myśli i rozwiała część wątpliwości

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)