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.

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.

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.

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.

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]

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1