Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [laravel][symfony] Laravel, działanie modelu
miccom
post 2.07.2021, 11:21:16
Post #1





Grupa: Zarejestrowani
Postów: 448
Pomógł: 7
Dołączył: 7.07.2007
Skąd: Tychy

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


Cześć.
Nie rozumiem jednej sprawy i proszę społeczność o nakreślenie co robić smile.gif

Mam problem w zrozumieniu laravela, modeli itp.

Ostatnio analizowałem kurs laravela ( z uprzejmości nie podam adresu kursu wink.gif ) na którym pan jawnie w kontrolerze wykonywał operacje na modelu, coś w deseń poniżej:

  1. namespace App\Http\Controllers;
  2.  
  3. use App\Models\User;
  4. $data = file_get_contents('https://jsonplaceholder.typicode.com/users');
  5. $fullData = json_decode($data, TRUE);
  6. foreach( $fullData AS $singleData ){
  7. $user = new User();
  8. $user->name = $singleData['name'];
  9. $user->username = $singleData['username'];
  10. $user->phone = $singleData['phone'];
  11. $user->website = $singleData['website'];
  12. $user->save();
  13. }


Jako że poszukuję pracy jako junior laravel developer to przygotowałem zadanie testowe zgodnie z tym kursem... ale moi rekruterzy napisali mi, że pomieszałem wszystko w kontrolerze itp.

Pytanie- jak poprawnie używać kontrolera i modelu ? bo nieco zagmatwałem się w tych elementach.

Jak rozumiem, kontroler steruje modelem, model wykonuje operacje ( najczęściej na bazie danych ) i zwraca dane do kontrolera, a ten kontroler dalej przekazuje dane do widoku.
Jak powinienem zmodyfikować $user = new User(); aby poprawnie używać frameworka MVC?

Proszę o pomoc w zrozumieniu tematu smile.gif


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
nospor
post 2.07.2021, 12:03:05
Post #2





Grupa: Moderatorzy
Postów: 35 694
Pomógł: 6048
Dołączył: 27.12.2004




W wielkim skrocie:
zadanie kontrolera to przechwycic routing, odpalic serwis ktory wykona cala robote i wynik tej roboty przekazac do widoku.

Ty w swoim rozwiazaniu cala robote robisz w kontrolerze a powininies robic w Serwisie, ktory kontroler jedynie odpali.

ps: jesli jednak szukasz pracy jako junior, to rekruterzy nie powinni sie czepiac twojego rozwiazania. Co najwyzej napisac jak to powinno byc zrobione poprawnie wink.gif


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
miccom
post 2.07.2021, 13:17:32
Post #3





Grupa: Zarejestrowani
Postów: 448
Pomógł: 7
Dołączył: 7.07.2007
Skąd: Tychy

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


Cytat(nospor @ 2.07.2021, 13:03:05 ) *
W wielkim skrocie:
zadanie kontrolera to przechwycic routing, odpalic serwis ktory wykona cala robote i wynik tej roboty przekazac do widoku.

Ty w swoim rozwiazaniu cala robote robisz w kontrolerze a powininies robic w Serwisie, ktory kontroler jedynie odpali.

ps: jesli jednak szukasz pracy jako junior, to rekruterzy nie powinni sie czepiac twojego rozwiazania. Co najwyzej napisac jak to powinno byc zrobione poprawnie wink.gif


Mówisz w serwisie? smile.gif Ha ha

Niewiele mi to mówi, pędzę się dowiedzieć ale temat nie jest zamknięty, można nadal odpowiadać i proponować smile.gif

Choć głupieję jak czytam dokumentację dla insert model laravel :
https://laravel.com/docs/8.x/eloquent#inserts

  1.  
  2. namespace App\Http\Controllers;
  3.  
  4. use App\Http\Controllers\Controller;
  5. use App\Models\Flight;
  6. use Illuminate\Http\Request;
  7.  
  8. class FlightController extends Controller
  9. {
  10. /**
  11.   * Store a new flight in the database.
  12.   *
  13.   * @param \Illuminate\Http\Request $request
  14.   * @return \Illuminate\Http\Response
  15.   */
  16. public function store(Request $request)
  17. {
  18. // Validate the request...
  19.  
  20. $flight = new Flight;
  21.  
  22. $flight->name = $request->name;
  23.  
  24. $flight->save();
  25. }
  26. }


Tutaj też zapis jest realizowany w kontrolerze.
O co tu chodzi?


Tutaj to zrozumiałem smile.gif Hi hi


https://www.youtube.com/watch?v=93ZhGkFIwbA

Dziękuję za uwagę smile.gif

Ten post edytował miccom 2.07.2021, 12:53:05


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
nospor
post 2.07.2021, 14:27:53
Post #4





Grupa: Moderatorzy
Postów: 35 694
Pomógł: 6048
Dołączył: 27.12.2004




To co znalazles to nadal jeszcze nie jest Service a Repository.
Ok, to juz jest lepiej ale to jeszcze nie to.
Repository wykonuje operacje na twoim modelu i tylko tyle. Service zas robi wszystko na roznych klasach, np. do Service mozesz dodac wysylke maila, logowanie oraz rzecz jasna uzyc w nim Repository oraz wiele innych rzeczy
Repository poza tym nie powinien miec wglada do request tylko Service powinien przekazac mu wszystkie nizbedne dane.


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ohm
post 2.07.2021, 14:40:09
Post #5





Grupa: Zarejestrowani
Postów: 558
Pomógł: 136
Dołączył: 22.12.2010

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


Apropos youtube, https://www.youtube.com/watch?v=Lf_ftXDkWv0
Go to the top of the page
+Quote Post
miccom
post 3.07.2021, 13:47:57
Post #6





Grupa: Zarejestrowani
Postów: 448
Pomógł: 7
Dołączył: 7.07.2007
Skąd: Tychy

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


Cytat(ohm @ 2.07.2021, 15:40:09 ) *


Nie rozumiem o co chodzi sad.gif
Gość tłumaczy takim jak Wy smile.gif a nie początkującym smile.gif


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
ohm
post 3.07.2021, 15:29:37
Post #7





Grupa: Zarejestrowani
Postów: 558
Pomógł: 136
Dołączył: 22.12.2010

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


Chodzi o to że masz controller, w nim odbierasz dane z requesta oraz wysyłasz dane do widoku. W miedzyczasie cos musi sie dziac (kalkulacja danych, generowanie raportu) czyli ogólnie logika danego miejsca. Założenie jest takie, że całą tę logikę wywalasz do osobnej klasy (czyli w tym przypadku nazywamy to serwisem), nic więcej.


Go to the top of the page
+Quote Post
Szado
post 3.07.2021, 17:27:20
Post #8





Grupa: Zarejestrowani
Postów: 22
Pomógł: 4
Dołączył: 30.05.2017

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


Wrzuć kod który wysłałeś rekruterowi, bo zakładam, że ten który pokazałeś w pierwszym poście to jakiś pseudokod (gdzie jest klasa?).

Gdybyś umieścił kod z linii 4-13 w ramach pojedynczej akcji kontrolera, to jak na początkującego juniora nie byłoby tragedii. To co mi się rzuca w oczy to możliwość użycia frameworkowego klienta http zamiast file_get_contents/json_decode (w ramach chwalenia się znajomością narzędzia) i tak jak piszą koledzy wyżej przeniesienia samego zapytania do API oraz akcji tworzenia oraz wypełniania modelu do oddzielnych serwisów (dedykowanych tym zadaniom klas).
Go to the top of the page
+Quote Post
miccom
post 3.07.2021, 17:52:34
Post #9





Grupa: Zarejestrowani
Postów: 448
Pomógł: 7
Dołączył: 7.07.2007
Skąd: Tychy

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


Cytat(Szado @ 3.07.2021, 18:27:20 ) *
Wrzuć kod który wysłałeś rekruterowi, bo zakładam, że ten który pokazałeś w pierwszym poście to jakiś pseudokod (gdzie jest klasa?).

Gdybyś umieścił kod z linii 4-13 w ramach pojedynczej akcji kontrolera, to jak na początkującego juniora nie byłoby tragedii. To co mi się rzuca w oczy to możliwość użycia frameworkowego klienta http zamiast file_get_contents/json_decode (w ramach chwalenia się znajomością narzędzia) i tak jak piszą koledzy wyżej przeniesienia samego zapytania do API oraz akcji tworzenia oraz wypełniania modelu do oddzielnych serwisów (dedykowanych tym zadaniom klas).


Proszę bardzo smile.gif

https://github.com/miccom1977/postInLaravel

Chociaż bardziej chodzi mi o to, ze nawet w manualach odnosi się do modelu implementujac model... a teraz niby nie tak to ma być?
To po co w manualu dla laravela w ogóle przedstawiać błędne podejścia? smile.gif

Ten post edytował miccom 3.07.2021, 17:54:51


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
Szado
post 4.07.2021, 14:49:23
Post #10





Grupa: Zarejestrowani
Postów: 22
Pomógł: 4
Dołączył: 30.05.2017

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


W dokumentacji przedstawiane są uproszczone przykłady zastosowania poszczególnych elementów frameworka, które mają demonstrować koncepty. W życiu codziennym, aplikacje często rozwiązują bardziej złożone problemy które wymagają napisania większej ilości kodu (tak jak w Twoim przypadku). Wtedy aby tworzyć zwięzły, czytelny i zrozumiały kod stosuje się zasady KISS, DRY, SOLID (Google) które narzucają m.in. logiczne wydzielanie jego fragmentów odpowiadających za pojedyncze procesy (np. zamykając je w odseparowanych od siebie serwisach).

Jeśli nie znasz jeszcze tych zasad/nie są one dla Ciebie intuicyjne, sugeruję zastosowanie bardzo prostej zasady która "na oko" powie Ci, czy powinieneś rozważyć refactoring: jeśli kod Twojej funkcji/metody nie mieści się w całości na ekranie (tj. musisz ją przewijać) to znaczy, że należy ją podzielić na kilka metod w ramach klasy lub sprawdzić, czy przypadkiem sama w sobie nie wykonuje zbyt wielu czynności - wtedy można opakować je w oddzielne klasy (serwisy), a w metodzie macierzystej użyć ich wywołań.

Na przykładzie metody kontrolera loadDataToBase() z przesłanego przez Ciebie projektu, można wydzielić:
  • czyszczenie tabel do oddzielnego serwisu,
  • pobieranie danych z API i ich parsowanie do oddzielnego serwisu,
  • tworzenie modeli na podstawie wyników z API do oddzielnego serwisu lub chociażby jako metodę samych modeli (chociaż w przypadku laravelowego active recordu będzie tam bałagan i bez tego),
  • opcjonalnie - sam mechanizm regularnego uruchamiania akcji przerobić można na laravelowe zadanie (Job) i zlecić jego wykonywanie w Console\Kernel np. raz dziennie. Poczytaj w dokumentacji o zadaniach cyklicznych i kolejkach.
Go to the top of the page
+Quote Post
miccom
post 16.07.2021, 17:53:07
Post #11





Grupa: Zarejestrowani
Postów: 448
Pomógł: 7
Dołączył: 7.07.2007
Skąd: Tychy

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


No muszę to zrozumieć smile.gif
Nie kumam nic- ale chcę smile.gif

Funkcja:
  1. public function loadDataToBase(){
  2.  
  3. Schema::disableForeignKeyConstraints();
  4. Post::truncate();
  5. User::truncate();
  6. Address::truncate();
  7. Company::truncate();
  8. Schema::enableForeignKeyConstraints();
  9.  
  10.  
  11. $data = file_get_contents('https://jsonplaceholder.typicode.com/users');
  12. $fullData = json_decode($data, TRUE);
  13. foreach( $fullData AS $singleData ){
  14.  
  15. $user = new User();
  16. $user->name = $singleData['name'];
  17. $user->username = $singleData['username'];
  18. $user->phone = $singleData['phone'];
  19. $user->website = $singleData['website'];
  20. $user->save();
  21.  
  22. $address = new Address();
  23. $address->user_id = $singleData['id'];
  24. $address->street = $singleData['address']['street'];
  25. $address->suite = $singleData['address']['suite'];
  26. $address->city = $singleData['address']['city'];
  27. $address->zipcode = $singleData['address']['zipcode'];
  28. $address->lat = $singleData['address']['geo']['lat'];
  29. $address->lng = $singleData['address']['geo']['lng'];
  30. $address->save();
  31.  
  32. $company = new Company();
  33. $company->user_id = $singleData['id'];
  34. $company->name = $singleData['company']['name'];
  35. $company->catchPhrase = $singleData['company']['catchPhrase'];
  36. $company->bs = $singleData['company']['bs'];
  37. $company->save();
  38. }


I teraz mam to podzielić na serwisy. Tworzę katalog services i tam dodaję poszczególne klasy? katalog services tworzę w katalogu App/ czy w App/Http/ ?


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
Rysh
post 17.07.2021, 19:01:38
Post #12





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


Ogólnie, ten kod który wkleiłeś to jakaś tragedia... propnowałbym ten wątek przenieśc jednak do Przedszkola, wtedy można by było wytknąć wszystkie błędy które należy koniecznie poprawić.


--------------------
Go to the top of the page
+Quote Post
miccom
post 20.08.2021, 07:48:10
Post #13





Grupa: Zarejestrowani
Postów: 448
Pomógł: 7
Dołączył: 7.07.2007
Skąd: Tychy

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


Cytat(Rysh @ 17.07.2021, 20:01:38 ) *
Ogólnie, ten kod który wkleiłeś to jakaś tragedia... propnowałbym ten wątek przenieśc jednak do Przedszkola, wtedy można by było wytknąć wszystkie błędy które należy koniecznie poprawić.


Można przenieść do Przedszkola ale tam że napiszesz co jest źle ? bo pisać tragedia- i nie wyjasnić dlaczego tragedia- to zwykłe trollowanie smile.gif


--------------------
Jeśli pomogłem- kliknij POMÓGŁ-przyda się ;)- jeśli piszę bzdury- pisz pod postami. Poprawię się.
PISZĘ POPRAWNIE PO POLSKU!
Go to the top of the page
+Quote Post
gitbejbe
post 26.08.2021, 05:41:52
Post #14





Grupa: Zarejestrowani
Postów: 512
Pomógł: 63
Dołączył: 27.08.2012

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


ale co tutaj wyjaśniać, na tym polega cała sztuka pisania dobrego kodu, doświadczenia i wiedzy za którą ludzie zdobywają latami i trzepią za to sporo hajsu. Wyjaśnienie Tobie co robisz źle w tym fragmencie kodu nie zamyka się tylko na jego fragmencie, to o wiele bardziej złożony temat który obecnie dla Ciebie jest czystą abstrakcją - biorąc pod uwagę że chłopaki wyżej już próbowali Ciebie nakierować ale nic z tego nie rozumiesz. Nie da się Tobie pomóc z kilku komentarz tego tematu. Musisz zwyczajnie w świecie nabrać doświadczenia, nie wnikaj tylko pisz ile wlezie - każdy zaczynał tak jak Ty teraz.
Go to the top of the page
+Quote Post
netir
post 13.09.2021, 17:08:43
Post #15





Grupa: Zarejestrowani
Postów: 35
Pomógł: 5
Dołączył: 20.05.2019

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


Cytat(miccom @ 20.08.2021, 08:48:10 ) *
Można przenieść do Przedszkola ale tam że napiszesz co jest źle ? bo pisać tragedia- i nie wyjasnić dlaczego tragedia- to zwykłe trollowanie smile.gif


Pomijając dodatkowe warstwy, biorąc tylko pod uwagę logikę to koniecznie poczytaj i zrozum:
- https://laravel.com/docs/8.x/collections (opcjonalnie, zamiast foreach)
- https://laravel.com/docs/8.x/eloquent#mass-assignment (nie masz najmniejszej potrzeby tworzyć modelu tak jak to robisz)
- https://laravel.com/docs/8.x/eloquent-relat...e-create-method (j/w korzystaj z relacji przy tworzeniu)
- poczytaj o standardach formatowania kodu https://www.php-fig.org/psr/
- https://laravel.com/docs/8.x/migrations#introduction (linijki 3-8 świadczą ewidentnie o złych migracjach/fk)
- https://pl.wikipedia.org/wiki/SOLID_(progra...anie_obiektowe)

To co napisałeś powinno być max w ~10 linijkach na oko + rozbite na mniejsze części i umieszczone w odpowiednich miejscach.

Ten post edytował netir 13.09.2021, 17:17:52
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 27.09.2021 - 19:49