Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [laravel][symfony] Laravel, działanie modelu
Forum PHP.pl > Forum > PHP > Frameworki
miccom
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
nospor
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
miccom
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
nospor
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.
ohm
Apropos youtube, https://www.youtube.com/watch?v=Lf_ftXDkWv0
miccom
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
ohm
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.


Szado
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).
miccom
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
Szado
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.
miccom
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/ ?
Rysh
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ć.
miccom
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
gitbejbe
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.
netir
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.
StreetFighter
Cytat
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/ ?



Ja dopiero zacząłem uczyć się Laravela, jestem nim po prostu zafascynowany. I właśnie chciałem zapytać gdzie powinna być trzymana logika aplikacji? Przykładowo klasa generująca imieniny.

Repositories, service container?

Myślę że przyda się kilku osoba które trafią na ten wątek: Dobre praktyki Laravel
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.