Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Frameworki _ [Symfony] Symfony 4.1 vs Framework3

Napisany przez: eerie 1.08.2018, 10:24:04

Witam

Napisałem prostą aplikację we framework'u Symfony 4.1. Chciałbym poddać ją Waszej ocenie. Czy może być tak napisana i co ewentualnie powinienem poprawić. Link do repozytorium jest tutaj:

https://github.com/webeeq/sieciq.eeq

I biblioteka do obsługi REST API:

https://github.com/webeeq/sieciq

Potem napisałem własny szkielet aplikacji w PHP 7.2. Wzorowałem go na framework'u Symfony. Starałem się, aby był możliwie najprościej napisany, by działał możliwie najszybciej. Link do SVN:

https://github.com/webeeq/framework3.eeq

Zastanawia mnie jedno. Symfony strasznie długo się prekompiluje (5-20 s). Potem działa dość szybko, ale moja aplikacja jest wiele razy wydajniejsza. Czy nie dyskredytuje to Symfony do używania przy projektach dla dużej rzeszy użytkowników? Czy nie lepiej jest wtedy napisać coś po swojemu?

Pozdrawiam
Robert

Napisany przez: kallosz 1.08.2018, 12:11:24

tak na szybko
* za dużo logiki w kontrolerach. Tam powinno znajdować się jak najmniej.
* komunikaty wiadomości email do wysłania w kontrolerach. Przenieś to do szablonu i tam ładnie formatuj przed wysłaniem.
* źle zaprojektowane encje


Cytat
Czy nie dyskredytuje to Symfony do używania przy projektach dla dużej rzeszy użytkowników?


IMO nie, dzięki temu że dużo rzeczy leci do cache nie ma potrzeby podobnego ich generowania.

Napisany przez: eerie 2.08.2018, 08:45:57

Cytat(kallosz @ 1.08.2018, 13:11:24 ) *
* za dużo logiki w kontrolerach. Tam powinno znajdować się jak najmniej.

Logiki jest tyle, ile było niezbędne, aby wiadomości wyświetlały się nad formularzami. Da się obsłużyć błędy w klasach formularzy i potem tylko wyświetlić nad danym polem formularza lub całym formularzem. Jak wszystko jest ok i nie ma błędów, to wyświetlić stosowną podstronę z informacją. Tak byłoby prościej. Tylko w pierwowzorze strony miałem taki zamysł, aby wyświetlać komunikaty tylko nad formularzem. Że coś jest ok czy też źle i podświetlać odpowiednim kolorem. Dlatego akurat w tej aplikacji sprawdzam podstawowe błędy w klasie formularza i potem je zwracam w kontrolerze do zmiennej z komunikatami. Potem dodaję kolejne, jak wybrana została jakaś akcja i np. udało się coś zapisać do bazy lub nie. Gdy udało się wysłać email lub nie. Potem obudowuję to w html i wyświetlam nad formularzem na stronie.

Czyli jak postępować w przyszłości? Tak skonstruować klasy formularzy, aby obsłużyć w nich wszystkie informacje o błędach, gdy spełnione są odpowiednie warunki? Jak nie ma błędów, to tylko wykonać zapis do bazy danych i przekierować na stosowną podstronę z komunikatem?

Cytat(kallosz @ 1.08.2018, 13:11:24 ) *
* komunikaty wiadomości email do wysłania w kontrolerach. Przenieś to do szablonu i tam ładnie formatuj przed wysłaniem.

Czyli w zależności od akcji tylko wysłać email'em stosowną podstronę html z komunikatem? Teraz jest tak, że wszystkie komunikaty obsługuje jeden szablon. Przekazywane są do niego tylko dane o nadawcy, odbiorcy, temat, wiadomość... Faktycznie. Można to zrobić prościej.

Cytat(kallosz @ 1.08.2018, 13:11:24 ) *
* źle zaprojektowane encje

Tu nie rozumiem... Generuje się z nich baza MySQL, jak chciałem. Tabele są odpowiednio powiązane. Gety i sety wygenerowały się automatycznie. Na to nie mam wpływu.

OK. Zrobię nową wersję strony z odchudzonymi kontrolerami i pokarzę do oceny.

Napisany przez: kallosz 2.08.2018, 18:44:05

Cytat
Tu nie rozumiem... Generuje się z nich baza MySQL, jak chciałem.

No i to jest błąd. Myślisz podejściem Database first. Nawet doctrine zaleca Model first. https://www.youtube.com/watch?v=rzGeNYC3oz0

Napisany przez: sabat24 3.08.2018, 10:00:38

Cytat
No i to jest błąd.

Uważasz to za błąd w ogóle, czy w tym konkretnym przypadku?

Napisany przez: kallosz 3.08.2018, 12:18:19

Błąd niezależnie od przypadku. Myślenie o tym że encja model ma nam odzwierciedlać bazę jest złym podejściem. Model powinien odzwierciedlać nasze cele biznesowe a nie służyć do generowania bazy.

Napisany przez: sabat24 3.08.2018, 17:28:49

Chodzi mi raczej o to, że myślenie podejściem Data First nie jest uznawane za błąd sam w sobie, a Model First nie zawsze musi być stosowane w pierwszej kolejności. Wszystko zależy czego potrzeba i co się chce osiągnąć.
Zgadzam się, że przy modelu nie masz odwzorować schematu bazy, jaki masz założony, bo nie masz mieć takiego założenia po prostu. Natomiast jeśli idziesz od strony architektury bazy danych, bo masz ku temu powód, to nic w tym złego.

Napisany przez: eerie 4.08.2018, 13:02:54

Ja zastosowałem podejście "Code First". Jest najbardziej lubiane przez programistów. Najpierw stworzyłem klasy encji w php na podstawie modelu, jaki rozrysowałem wcześniej na kartce. Pamiętałem o tym, aby zastosować „czwartą postać normalną”. Potem na podstawie kodu php wygenerowałem automatycznie bazę danych. Następnie wygenerowałem get'y i set'y.

Podejście "DB First" jest mniej wskazane. Stosuje się je, gdy zaczyna się pisanie aplikacji od gotowej bazy danych.

"Model First" jest prosty i wskazany dla początkujących programistów. Można na nim oprzeć raczej niewielką aplikację, gdy dysponujemy mało doświadczonym zespołem.

Napisany przez: memory 5.08.2018, 16:52:26

poczytaj o:
- dependency injection
- o autoryzacji w symfony i ogólnie. CookieLogin brak soli, login i hasło plaintextem, tak samo przy aktualizacji danych.
- nazewnictwo IsUserUser
- warto poczytać o szablonie twig

grube controllery


Napisany przez: eerie 7.08.2018, 17:45:56

Poprawiłem obsługę błędów formularzy, żeby było, jak pokazują w dokumentacji. Będę wdzięczny za wytknięcie wszelkich niedociągnięć. Tylko tak mogę podnieść kwalifikację. Najnowsza wersja aplikacji w Symfony 4.1.1 poniżej:

https://github.com/webeeq/sieciq2.eeq

Pozdrawiam
Robert

Cytat(memory @ 5.08.2018, 17:52:26 ) *
poczytaj o:
[...]

Dzięki za wskazówki. Poczytam, zanim się wezmę za dalsze programowanie.

Cytat(memory @ 5.08.2018, 17:52:26 ) *
grube controllery

Próbowałem, ale zbytnio nie wiem, jak je uprościć.


PS Kontynuuję temat.

Cytat(memory @ 5.08.2018, 17:52:26 ) *
- dependency injection

Znalazłem krótki i prosty artykuł na ten temat. Warto doczytać coś więcej?

https://lukasz-socha.pl/php/wzorce-projektowe-cz-6-dependency-injection/

Cytat(memory @ 5.08.2018, 17:52:26 ) *
- o autoryzacji w symfony i ogólnie. CookieLogin brak soli, login i hasło plaintextem, tak samo przy aktualizacji danych.

Login jest czystym tekstem, ale hasło jest kodowane md5(). Zapis przy logowaniu również (kodowane hasło).

Możesz polecić jakiś dobry artykuł? W Google jest dużo nie do końca "przekonywujących" tekstów na ten temat. smile.gif

Cytat(memory @ 5.08.2018, 17:52:26 ) *
- nazewnictwo IsUserUser

Faktycznie. Chyba powinienem nazwać to w stylu isUserId() czy jakoś tak.

Cytat(memory @ 5.08.2018, 17:52:26 ) *
- warto poczytać o szablonie twig

Używam szablonów twig w Symfony, ale jeszcze doczytam.

http://symfony2-docs-pl.readthedocs.io/pl/latest/book/templating.html

Cytat(memory @ 5.08.2018, 17:52:26 ) *
grube controllery

Jak je uprościć? Nie mam pojęcia... wink.gif


PS Kontrolery wyglądały skromniej, gdy jeszcze nie przestrzegałem zasady długości maks 80 znaków w linii...

Napisany przez: robert0770 9.08.2018, 07:59:10

jak poczytasz o dependency injection to będziesz wiedział jak je uprościć, symfony service -> tego szukaj w google

Napisany przez: vokiel 9.08.2018, 20:48:14

Cytat(eerie @ 7.08.2018, 18:45:56 ) *
Login jest czystym tekstem, ale hasło jest kodowane md5(). Zapis przy logowaniu również (kodowane hasło).


MD5 jest od dłuższego czasu nie jest uważane za bezpieczne. To jest prosta funkcja skrótu, którą łatwo złamać (chociażby przy pomocy łatwo dostępnych tablic tęczowych). Nie jest to plaintext, ale jednak niewiele lepiej.

Poczytaj o bcrypt, który teraz jest standardem w przechowywaniu haseł.

Napisany przez: Pyton_000 9.08.2018, 21:23:23

w php jest to password_hash i w przypadku PHP7 argon2 jako metoda hashująca (obecnie chyba najbezpieczniejsza dla php)

Napisany przez: eerie 19.08.2018, 12:25:50

Cytat
jak poczytasz o dependency injection to będziesz wiedział jak je uprościć, symfony service -> tego szukaj w google

Dzięki. Poczytam... Na chwilę obecną dodałem klasy do obsługi wiadomości i błędów. Pozwoliło mi to na walidację danych z formularzy poza kontrolerem. Tak to wygląda teraz:

https://github.com/webeeq/framework4.eeq - Prosty szkielet aplikacji od podstaw
https://github.com/webeeq/sieciq2.eeq - Aplikacja powyżej w Symfony 4.1
https://github.com/webeeq/sieciq - Biblioteka do REST API aplikacji w Symfony (powyżej)

Pomyślę, co uprościć jeszcze. Może jakieś propozycje?

Cytat
Poczytaj o bcrypt, który teraz jest standardem w przechowywaniu haseł.

Cytat
w php jest to password_hash i w przypadku PHP7 argon2 jako metoda hashująca (obecnie chyba najbezpieczniejsza dla php)

Dzięki za wskazówki... Jeśli chodzi o Symfony, znalazłem takie artykuły o systemach logowania:

http://zkodemprzezswiat.pl/phpsymfony-prosty-system-uwierzytelniania-logowanie/
https://iwona.giat.pl/2017/03/27/autoryzacja-uzytkownikow/

Cytat
$password = $this->get('security.password_encoder')
->encodePassword($user, 'haslo');


Nie wiem, na ile to bezpieczne. Ale widzę, że Symfony też ma własne rozwiązanie... smile.gif

Pozdrawiam
Robert

Mam taki kod na początku każdego kontrolera:

Kod
$config = new Config();
$session = $request->getSession();
$em = $this->getDoctrine()->getManager();
$cookieLogin = new CookieLogin($em, $config);
$cookieLogin->setCookieLogin($session);


Pozawala mi to sprawdzić w sesji, czy jest zalogowany użytkownik. Jeśli nie jest, to loguje go na podstawie ciasteczka, jeśli takie zostało utworzone przy logowaniu.

Moje pytanie. Czy da się utworzyć usługę, która automatycznie wykona mi ten kod bez konieczności umieszczania go i wywoływania w każdym kontrolerze z osobna?

Pozdrawiam
Robert

Napisany przez: Pyton_000 21.08.2018, 07:04:35

Middleware twoim kluczem jest.

Napisany przez: eerie 21.08.2018, 16:48:36

Rozwiązałem to inaczej:

http://symfony.com/doc/current/reference/events.html
https://symfony.com/doc/2.3/cookbook/event_dispatcher/before_after_filters.html

Pozdrawiam
Robert

Napisany przez: Pyton_000 22.08.2018, 11:30:24

Autoryzacja w evencie? Słaba opcja. Jako Middleware możesz sobie dowolnie sterować np. czy ma to działać tylko na panel admina a może tylko gdzieś coś. Dla mnie zdarzenie które chcesz wywołać nie jest eventem

Napisany przez: eerie 7.09.2018, 06:18:56

Cytat(Pyton_000 @ 22.08.2018, 12:30:24 ) *
Dla mnie zdarzenie które chcesz wywołać nie jest eventem

Może się mylę... Moje zdarzenie nie jest eventem, ale jest wykonywane, gdy zdarza się event. Chodzi o to, aby przed wywołaniem jakiegokolwiek kontrolera (event: onKernelController) najpierw spróbowało mnie zalogować. Odpalenie mojego kontrolera z logowaniem poprzedza wykonanie jakiegokolwiek innego kontrolera sterującego treścią strony... Podobnie można obsłużyć jakieś menu, które ma się wyświetlić na każdej podstronie. W Google są na to nawet gotowe przykłady.

Pozdrawiam
Robert

Wprowadziłem usługi, aby odchudzić kontrolery. Prosiłbym o uwagi, co jeszcze kwalifikuje się do poprawy...

https://github.com/webeeq/sieciq2.eeq

Pozdrawiam
Robert

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)