![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 125 Pomógł: 7 Dołączył: 27.01.2010 Ostrzeżenie: (0%) ![]() ![]() |
Hej,
pracuje aktualnie nad jednym projektem i jest w nim kawałek CRM w związku z tym potrzebowałem czegoś do masowego generowania faktur dla klientów. Pomyślałem, że pewnie nie jestem pierwszy, który ma ten problem więc można by zrobić z tego osobną bibliotekę do używania w różnych projektach. I tak oto jest: https://github.com/loskoderos/faktura-php Przykładowa faktura: https://github.com/loskoderos/faktura-php/b..._invoice_pl.pdf ![]() Używanie jest dość proste:
Tutaj jest pełny przykład: https://github.com/loskoderos/faktura-php/b..._invoice_pl.php Projekt aktualnie bazuje na Xvfb i Wkhtmltopdf, które muszą być zainstalowane w systemie aby działało. Ponieważ, buduję aplikacje w Symfony to pewnie opakuje to w bundle i dodam support dla Twig'a, ale póki co to jest pierwsza beta. Wrzucam tutaj, fajnie jakbyście zajrzeli w kod i ocenili co warto by zmienić. W założeniu to musi być w stanie generować fakture dla dowolnego projektu i wspierać model faktury z dowolnego kraju. Z góry dzięki za feedback. -------------------- |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Nie przyglądałem się bliżej, ale jestem przekonany, że ta klasa ma za dużo odpowiedzialności. Fabryka, renderer i exporter w jednym. Rozdziel to na klasy posiadające pojedynczą odpowiedzialność i przy okazji skorzystaj z interfejsów.
Przy okazji też unikaj takich myków:
W ten sposób jesteś uzależniony od tych konkretnych implementacji. (Co jak będziesz chciał eksportować do docx, itp?). Użyj Dependency Injection z typowaniem za pomocą interfejsów. -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 125 Pomógł: 7 Dołączył: 27.01.2010 Ostrzeżenie: (0%) ![]() ![]() |
E, ale dokładnie po to zrobiłem setRenderer i setExporter żeby móc zmienic renderer lub exporter, są też interfejsy do tego. Generalnie mógłbym zainicjować konstruktor lub całkowicie pozbyć sie fabryki, ale ten sposób wydał mi się najprostszy do używania.
-------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
E, ale dokładnie po to zrobiłem setRenderer i setExporter żeby móc zmienic renderer lub exporter, są też interfejsy do tego. Generalnie mógłbym zainicjować konstruktor lub całkowicie pozbyć sie fabryki, ale ten sposób wydał mi się najprostszy do używania. Widzę, że interfejsy rzeczywiście są, więc nie dostrzegam sensu tworzyć w konstruktorze konkretnych instancji obiektów, które można wstrzyknąć: https://pl.wikipedia.org/wiki/Wstrzykiwanie...C5%BCno%C5%9Bci Na drugą część odpowiem tylko tyle, że Singletonów też się łatwo używa, a God classy łatwo rozszerza zanim się nimi staną. https://laracasts.com/series/solid-principles-in-php Przy okazji zajrzałem teraz do testów, a tam na początku pliku klasa, która ma służyć jako mock... zamiast tego zrób po prostu mocka. Jeśli chodzi o same testy to widać, że coś jest nie tak z konstrukcją, bo jest za dużo efektów ubocznych. Przy okazji kątem oka zauważyłem też, że są odniesienia typu: . Można to zastąpić https://phpunit.de/manual/current/en/append...ssertFileExists // ADD PHPDoc tylko dla wybrańców, np. https://github.com/loskoderos/faktura-php/b...ntity/Party.php -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 7.05.2025 - 06:10 |