SlideShare a Scribd company logo
1 of 28
Download to read offline
Cykl życia zapytania HTTP
(pod maską)
Krzysztof Rewak
CTO, Blumilk
krzysztof.rewak@blumilk.pl
github: @krzysztofrewak
Jak działa Laravel?
Aplikacje webowe oparte o Laravela najczęściej będą:
● wystawiać widoki budowane w HTML
● obsługiwać formularze
● serwować REST API
Jak działa Laravel? (ale tak na serio)
Może się okazać, że wejść i wyjść jest kilka, ale my skupimy się
dziś tylko na obsłudze zapytań HTTP.
Biblioteka vs. framework
Warto zacząć od tego czym różni się
framework od biblioteki. Laravel jest
oczywiście frameworkiem.
Biblioteka jest częścią kodu, która może
zostać dodana do naszego kodu.
Korzystamy z wielu bibliotek, np.
Guzzle lub Elasticsearch Client.
Biblioteka vs. framework
Framework jest natomiast kodem, do
którego dokładamy nasz kod. Wszystkie
ważniejsze rzeczy dzieją się we
frameworku, a my konfigurujemy jedynie
aspekty związane z logika biznesową.
Zaraz to zobaczymy na przykładach.
No to jedziemy!
Wiemy zatem, że zapytanie HTTP będzie uderzało do naszej aplikacji
zbudowanej na Laravelu. Praktycznie wszystkimi akcjami steruje framework…
oprócz jednej, a mianowicie uruchomienia Laravela.
Entrypoint do systemu znajduje się w pliku public/index.php
public/index.php
W zależności od wersji index.php się będzie różnił, ale mniej więcej zawsze robi
to samo: tworzy instancję jądra Laravela i przekazuje do niego złapane
zapytanie HTTP.
bootstrap/app.php
Plik public/index.php odwołuje się do bootstrap/app.php. To tam tworzona jest
instancja Laravela i deklarowane są powiązania która klasa będzie miała
zostać utworzona pod który interfejs.
Inne entrypointy
Warto pamiętać, że plik artisan również korzysta z bootstrap/app.php
Jest to na tyle istotne, że wszelkie zadeklarowane dodatkowo providery czy
inne zmiany w public/index.php nie będą dostępne z poziomu php artisan *
IlluminateFoundationApplication.php
Laravel składa się z kilku(dziesięciu?)
części składowych, ale jedną z
najważniejszych są jego kontener
zależności i lista providerów.
Ich inicjalizację można podejrzeć w
IlluminateFoundationApplication.php
IlluminateFoundationApplication.php
Najprościej ujmując:
● do aplikacji Laravela możemy
dodawać własne service providery,
które będą modyfikowały stan
aplikacji
● do kontenera zależności, często przez
providery, możemy wpisywać
bindingi instancji do zadanych
abstrakcji
Bindowanie instancji
W tak łatwy sposób można powiedzieć Laravelowi, że za każdym razem, gdy
“ktoś” poprosi o gdziekolwiek o AppContractsEventPusher, kontener
zależności wyda instancję AppServicesRedisEventPusher.
Więc wróćmy do public/index.php
Tworzymy metodą make() instancję zbindowaną do interfejsu
IlluminateContractsHttpKernel. Z bootstrap/app.php wiemy, że będzie to…
zadeklarowany w naszej aplikacji AppHttpKernel.php!
IlluminateFoundationHttpKernel.php
To co istotne znajduje się w bloku try: każde zapytanie HTTP zostaje
przepuszczone przez router. Jeżeli coś złego się stanie, wywołany zostanie
handler wyjątków.
IlluminateFoundationHttpKernel.php
I teraz zaczyna się zabawa: Laravel binduje obiekt Request z naszym
zapytaniem do kontenera zależności. Od teraz będzie można się do niego
odezwać z prawie każdego miejsca aplikacji. Request natomiast przesyłany jest
przez zadeklarowane middlewary i dopiero przesyłany do routera.
Ale jakie middlewary?
Wystarczy zajrzeć do naszego app/Http/Kernel i zbadać jego pole $middleware.
Powinna znaleźć się tam tablica middlewarów, które zostaną nałożone na
każde zapytanie. Może być ich dowolna liczba, mogą dowolnie działać.
Na przykład fajnie można sobie identyfikować wszystkie obiekty Request:
Ale jakie middlewary?
Warto też pamiętać, że Laravel umożliwia definiowanie nie tylko klasycznych
“before middlewarów”, ale także może nieco mniej intuicyjne “after
middleware”:
IlluminateFoundationHttpKernel.php
Jeżeli zadeklarujemy wszystkie middlewary, Laravel wywołuje swój router i
próbuje przepchnąć przez niego otrzymane zapytanie HTTP.
Magia!
Tutaj zaczyna się mocno skomplikowana rzecz. Metoda dispatch() wywołuje
dispatchToRoute(), która z kolei po wywołaniu findRoute() wywołuje
runRoute().
findRoute() szuka wzoru z zapytania HTTP w dostarczonych mu routach. A
skąd je zna? Możemy jest zadeklarować w service providerze, a konkretnie w
app/Providers/RouteServiceProvider.php - to tam deklarujemy jak podpiąć
routes/web.php czy routes/api.php
A więc znów cała magia dzieje się we frameworku, a po naszej stronie zostaje
włożenie odpowiedniego klocka w odpowiednie miejsce.
IlluminateRoutingRoute.php
Po zbudowaniu kolejnego Pipeline’a z middlewarami, router będzie spróbował
stworzyć kontroler, do którego jest przypisany dopasowany route. Metoda run()
sprawdzi jak została zarejestrowana akcji route’a i spróbuje coś z nią zrobić.
W przypadku powyżej, obsłużony zostaje klasyczny route podpięty pod
kontroler.
IlluminateRoutingRoute.php
Jak więc “rodzi się” kontroler? Z nazwy przekazanej w konfiguracji routingu
tworzony jest obiekt kontrolera z poziomu kontenera zależności!
IlluminateRoutingControllerDispatcher.php
Na tak stworzonym kontrolerze jest wywoływana metoda… również
wykoncypowana z konfiguracji. Natomiast resolveClassMethodDependencies()
to nic innego jak wywołanie refleksją wszystkich parametrów metody
kontrolera… znowuż w kontenerze zależności.
FormRequesty?
FormRequest, czyli z góry określony schemat oczekiwanego zapytania HTTP to
jeden z najwygodniejszych bulbulatorów Laravela. Wystarczy dodać nazwę
klasy Form Requestu do sygnatury metody kontrolera i nagle walidacja
zaczyna “sama działać” wedle opisanych reguł. Ale jak to działa?
FormRequesty?
Nikt w routerze nie sprawdza na twardo typów tworzonych obiektów. W taki
sposób plik Route.php rozrósłby się do dziesiątek tysięcy linijek kodu w
wielkim ifowym drzewku.
Ale przecież mamy kontener zależności! W IlluminateFoundationProviders
FormRequestServiceProvider zadeklarowano hook, który mówi, że po
wybraniu każdego obiektu implementującego kontrakt IlluminateContracts
ValidationValidatesWhenResolved, zostanie na nim wywołana metoda
validateResolved()
A co w niej jest? Ano walidacja naszego Form Requestu!
Jak działa Laravel?
A na samym końcu tak naprawdę możemy stworzyć jeden
kontroler, podpiąć go pod domyślny router i wszystko będzie
działać.
Słówko przestrogi
Takiej “magii” w Laravelu jest bardzo dużo. Bardzo.
Warto przejść się z debuggerem i krok po kroku zobaczyć jak wyglądają
przedstawione tutaj procesy, ale także wszystkie inne: tłumaczenia, fasady,
korzystanie z konfiguracji.
Dziękuję za uwagę.
Pytania?
krzysztof.rewak@blumilk.pl
github: @krzysztofrewak

More Related Content

What's hot

양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012devCAT Studio, NEXON
 
ROSチュートリアル ROBOMECH2018
ROSチュートリアル ROBOMECH2018ROSチュートリアル ROBOMECH2018
ROSチュートリアル ROBOMECH2018Ryuichi Ueda
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)YEONG-CHEON YOU
 
IEnumerator란 무엇인가?
IEnumerator란 무엇인가?IEnumerator란 무엇인가?
IEnumerator란 무엇인가?Jungsoo Park
 
PINTOS Operating system homework 2
PINTOS Operating system homework 2PINTOS Operating system homework 2
PINTOS Operating system homework 2Gichan Lee
 
How to Design Resilient Odoo Crons
How to Design Resilient Odoo CronsHow to Design Resilient Odoo Crons
How to Design Resilient Odoo CronsOdoo
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)Seungmo Koo
 
[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵
[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵
[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵NAVER Engineering
 
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked ChangesJiyeon Seo
 
[부스트캠퍼세미나]권혁우_REST는 바이바이_ GraphQL과 함께하는 칼퇴시대
[부스트캠퍼세미나]권혁우_REST는 바이바이_ GraphQL과 함께하는 칼퇴시대[부스트캠퍼세미나]권혁우_REST는 바이바이_ GraphQL과 함께하는 칼퇴시대
[부스트캠퍼세미나]권혁우_REST는 바이바이_ GraphQL과 함께하는 칼퇴시대CONNECT FOUNDATION
 
Recast Detour.pptx
Recast Detour.pptxRecast Detour.pptx
Recast Detour.pptxMUUMUMUMU
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をするjiro4989
 
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP AdvSeungmo Koo
 
[2019] 게임 서버 대규모 부하 테스트와 모니터링 이렇게 해보자
[2019] 게임 서버 대규모 부하 테스트와 모니터링 이렇게 해보자[2019] 게임 서버 대규모 부하 테스트와 모니터링 이렇게 해보자
[2019] 게임 서버 대규모 부하 테스트와 모니터링 이렇게 해보자NHN FORWARD
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법YEONG-CHEON YOU
 
はじめようGit
はじめようGitはじめようGit
はじめようGittechscore
 
[2018] 프런트엔드 성능 최적화
[2018] 프런트엔드 성능 최적화[2018] 프런트엔드 성능 최적화
[2018] 프런트엔드 성능 최적화NHN FORWARD
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonadKouji Matsui
 
Luigi presentation OA Summit
Luigi presentation OA SummitLuigi presentation OA Summit
Luigi presentation OA SummitOpen Analytics
 

What's hot (20)

양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
 
ROSチュートリアル ROBOMECH2018
ROSチュートリアル ROBOMECH2018ROSチュートリアル ROBOMECH2018
ROSチュートリアル ROBOMECH2018
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
IEnumerator란 무엇인가?
IEnumerator란 무엇인가?IEnumerator란 무엇인가?
IEnumerator란 무엇인가?
 
PINTOS Operating system homework 2
PINTOS Operating system homework 2PINTOS Operating system homework 2
PINTOS Operating system homework 2
 
How to Design Resilient Odoo Crons
How to Design Resilient Odoo CronsHow to Design Resilient Odoo Crons
How to Design Resilient Odoo Crons
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 
[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵
[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵
[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵
 
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
 
[부스트캠퍼세미나]권혁우_REST는 바이바이_ GraphQL과 함께하는 칼퇴시대
[부스트캠퍼세미나]권혁우_REST는 바이바이_ GraphQL과 함께하는 칼퇴시대[부스트캠퍼세미나]권혁우_REST는 바이바이_ GraphQL과 함께하는 칼퇴시대
[부스트캠퍼세미나]권혁우_REST는 바이바이_ GraphQL과 함께하는 칼퇴시대
 
Recast Detour.pptx
Recast Detour.pptxRecast Detour.pptx
Recast Detour.pptx
 
PEGで構文解析をする
PEGで構文解析をするPEGで構文解析をする
PEGで構文解析をする
 
게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv게임서버프로그래밍 #2 - IOCP Adv
게임서버프로그래밍 #2 - IOCP Adv
 
[2019] 게임 서버 대규모 부하 테스트와 모니터링 이렇게 해보자
[2019] 게임 서버 대규모 부하 테스트와 모니터링 이렇게 해보자[2019] 게임 서버 대규모 부하 테스트와 모니터링 이렇게 해보자
[2019] 게임 서버 대규모 부하 테스트와 모니터링 이렇게 해보자
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
 
はじめようGit
はじめようGitはじめようGit
はじめようGit
 
[2018] 프런트엔드 성능 최적화
[2018] 프런트엔드 성능 최적화[2018] 프런트엔드 성능 최적화
[2018] 프런트엔드 성능 최적화
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
Luigi presentation OA Summit
Luigi presentation OA SummitLuigi presentation OA Summit
Luigi presentation OA Summit
 

Similar to Cykl życia zapytania HTTP (pod maską)

Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwLuke Adamczewski
 
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Polcode
 
Kubernetes: from zero to be hero
Kubernetes: from zero to be heroKubernetes: from zero to be hero
Kubernetes: from zero to be heroThe Software House
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyqbeuek
 
Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?tkryskiewicz
 
Laravel workshops 1
Laravel workshops 1Laravel workshops 1
Laravel workshops 1Kamil Fojuth
 
My littlemvc 2008 official
My littlemvc 2008 officialMy littlemvc 2008 official
My littlemvc 2008 officialskowronkow
 
Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Natalia Stanko
 
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy SpringXlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy SpringXSolve
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegroallegro.tech
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?javOnet
 
Kubernetes i Docker Swarm - Tomasz Woszczynski
Kubernetes i Docker Swarm - Tomasz WoszczynskiKubernetes i Docker Swarm - Tomasz Woszczynski
Kubernetes i Docker Swarm - Tomasz Woszczynskiduchowe50k
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz
 
Laravel Poznań Meetup #8 - "Laravel czy lumen, oto jest pytanie"
Laravel Poznań Meetup #8 - "Laravel czy lumen, oto jest pytanie"Laravel Poznań Meetup #8 - "Laravel czy lumen, oto jest pytanie"
Laravel Poznań Meetup #8 - "Laravel czy lumen, oto jest pytanie"HighSolutions Sp. z o.o.
 
Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Maciek Próchniak
 
Exam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows ApplicationExam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows ApplicationMaciej Zbrzezny
 

Similar to Cykl życia zapytania HTTP (pod maską) (20)

Torquebox
TorqueboxTorquebox
Torquebox
 
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketwAsynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
Asynchroniczny PHP i komunikacja czasu rzeczywistego z wykorzystaniem websocketw
 
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
Asynchroniczny PHP & komunikacja czasu rzeczywistego z wykorzystaniem websock...
 
Kubernetes: from zero to be hero
Kubernetes: from zero to be heroKubernetes: from zero to be hero
Kubernetes: from zero to be hero
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 
Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?
 
Laravel workshops 1
Laravel workshops 1Laravel workshops 1
Laravel workshops 1
 
My littlemvc 2008 official
My littlemvc 2008 officialMy littlemvc 2008 official
My littlemvc 2008 official
 
Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010Ruby, Ruby on Rails 2010
Ruby, Ruby on Rails 2010
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy SpringXlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
Xlab #10: Integracja zewnętrznych API z wykorzystaniem platformy Spring
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?
 
react-pl.pdf
react-pl.pdfreact-pl.pdf
react-pl.pdf
 
Kubernetes i Docker Swarm - Tomasz Woszczynski
Kubernetes i Docker Swarm - Tomasz WoszczynskiKubernetes i Docker Swarm - Tomasz Woszczynski
Kubernetes i Docker Swarm - Tomasz Woszczynski
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
 
Laravel Poznań Meetup #8 - "Laravel czy lumen, oto jest pytanie"
Laravel Poznań Meetup #8 - "Laravel czy lumen, oto jest pytanie"Laravel Poznań Meetup #8 - "Laravel czy lumen, oto jest pytanie"
Laravel Poznań Meetup #8 - "Laravel czy lumen, oto jest pytanie"
 
Laravel czy Lumen, oto jest pytanie
Laravel czy Lumen, oto jest pytanieLaravel czy Lumen, oto jest pytanie
Laravel czy Lumen, oto jest pytanie
 
Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010Camel-Drools - Javarsovia 2010
Camel-Drools - Javarsovia 2010
 
Exam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows ApplicationExam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows Application
 

More from Laravel Poland MeetUp

WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...Laravel Poland MeetUp
 
xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug) xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug) Laravel Poland MeetUp
 
Kilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w EloquentKilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w EloquentLaravel Poland MeetUp
 
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Laravel Poland MeetUp
 
Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?Laravel Poland MeetUp
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravel Poland MeetUp
 
Przegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do LaravelaPrzegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do LaravelaLaravel Poland MeetUp
 
Laravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2ELaravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2ELaravel Poland MeetUp
 
Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Poland MeetUp
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPLaravel Poland MeetUp
 
Wstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w LaravelWstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w LaravelLaravel Poland MeetUp
 
Laravel Collection - tablice na sterydach
Laravel Collection - tablice na sterydachLaravel Collection - tablice na sterydach
Laravel Collection - tablice na sterydachLaravel Poland MeetUp
 

More from Laravel Poland MeetUp (20)

WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
WebRTC+Websockety - Jak stworzyłem aplikację do kamerek internetowych w Larav...
 
xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug) xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
xD bug - Jak debugować PHP-owe aplikacje (Xdebug)
 
Kilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w EloquentKilka slajdów o castowaniu atrybutów w Eloquent
Kilka slajdów o castowaniu atrybutów w Eloquent
 
Licencje otwartego oprogramowania
Licencje otwartego oprogramowaniaLicencje otwartego oprogramowania
Licencje otwartego oprogramowania
 
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%Jak przyspieszyłem aplikację produkcyjną o ponad 40%
Jak przyspieszyłem aplikację produkcyjną o ponad 40%
 
Jak przemycić Shape Up do Scruma?
Jak przemycić Shape Up do Scruma?Jak przemycić Shape Up do Scruma?
Jak przemycić Shape Up do Scruma?
 
Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?Enumy w Laravelu - dlaczego warto stosować?
Enumy w Laravelu - dlaczego warto stosować?
 
Laravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelnianiaLaravelowe paczki do uwierzytelniania
Laravelowe paczki do uwierzytelniania
 
Przegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do LaravelaPrzegląd najciekawszych wtyczek do Laravela
Przegląd najciekawszych wtyczek do Laravela
 
Walidacja w Laravelu
Walidacja w LaraveluWalidacja w Laravelu
Walidacja w Laravelu
 
(prawie) Wszystko o Tinkerze
(prawie) Wszystko o Tinkerze(prawie) Wszystko o Tinkerze
(prawie) Wszystko o Tinkerze
 
Laravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2ELaravel Dusk - prosty przepis na testy E2E
Laravel Dusk - prosty przepis na testy E2E
 
Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?Laravel Octane - czy na pewno taki szybki?
Laravel Octane - czy na pewno taki szybki?
 
Laravel Jobs i PHP8
Laravel Jobs i PHP8Laravel Jobs i PHP8
Laravel Jobs i PHP8
 
Wszystko o Laravel Livewire
Wszystko o Laravel Livewire Wszystko o Laravel Livewire
Wszystko o Laravel Livewire
 
Laravel/PHP - zderzenie z PDFami
Laravel/PHP - zderzenie z PDFamiLaravel/PHP - zderzenie z PDFami
Laravel/PHP - zderzenie z PDFami
 
Action-based Laravel
Action-based LaravelAction-based Laravel
Action-based Laravel
 
Automatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHPAutomatyzacja utrzymania jakości w środowisku PHP
Automatyzacja utrzymania jakości w środowisku PHP
 
Wstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w LaravelWstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
Wstęp do Gitlab CI/CD w aplikacjach napisanych w Laravel
 
Laravel Collection - tablice na sterydach
Laravel Collection - tablice na sterydachLaravel Collection - tablice na sterydach
Laravel Collection - tablice na sterydach
 

Cykl życia zapytania HTTP (pod maską)

  • 1. Cykl życia zapytania HTTP (pod maską)
  • 3. Jak działa Laravel? Aplikacje webowe oparte o Laravela najczęściej będą: ● wystawiać widoki budowane w HTML ● obsługiwać formularze ● serwować REST API
  • 4. Jak działa Laravel? (ale tak na serio) Może się okazać, że wejść i wyjść jest kilka, ale my skupimy się dziś tylko na obsłudze zapytań HTTP.
  • 5. Biblioteka vs. framework Warto zacząć od tego czym różni się framework od biblioteki. Laravel jest oczywiście frameworkiem. Biblioteka jest częścią kodu, która może zostać dodana do naszego kodu. Korzystamy z wielu bibliotek, np. Guzzle lub Elasticsearch Client.
  • 6. Biblioteka vs. framework Framework jest natomiast kodem, do którego dokładamy nasz kod. Wszystkie ważniejsze rzeczy dzieją się we frameworku, a my konfigurujemy jedynie aspekty związane z logika biznesową. Zaraz to zobaczymy na przykładach.
  • 7. No to jedziemy! Wiemy zatem, że zapytanie HTTP będzie uderzało do naszej aplikacji zbudowanej na Laravelu. Praktycznie wszystkimi akcjami steruje framework… oprócz jednej, a mianowicie uruchomienia Laravela. Entrypoint do systemu znajduje się w pliku public/index.php
  • 8. public/index.php W zależności od wersji index.php się będzie różnił, ale mniej więcej zawsze robi to samo: tworzy instancję jądra Laravela i przekazuje do niego złapane zapytanie HTTP.
  • 9. bootstrap/app.php Plik public/index.php odwołuje się do bootstrap/app.php. To tam tworzona jest instancja Laravela i deklarowane są powiązania która klasa będzie miała zostać utworzona pod który interfejs.
  • 10. Inne entrypointy Warto pamiętać, że plik artisan również korzysta z bootstrap/app.php Jest to na tyle istotne, że wszelkie zadeklarowane dodatkowo providery czy inne zmiany w public/index.php nie będą dostępne z poziomu php artisan *
  • 11. IlluminateFoundationApplication.php Laravel składa się z kilku(dziesięciu?) części składowych, ale jedną z najważniejszych są jego kontener zależności i lista providerów. Ich inicjalizację można podejrzeć w IlluminateFoundationApplication.php
  • 12. IlluminateFoundationApplication.php Najprościej ujmując: ● do aplikacji Laravela możemy dodawać własne service providery, które będą modyfikowały stan aplikacji ● do kontenera zależności, często przez providery, możemy wpisywać bindingi instancji do zadanych abstrakcji
  • 13. Bindowanie instancji W tak łatwy sposób można powiedzieć Laravelowi, że za każdym razem, gdy “ktoś” poprosi o gdziekolwiek o AppContractsEventPusher, kontener zależności wyda instancję AppServicesRedisEventPusher.
  • 14. Więc wróćmy do public/index.php Tworzymy metodą make() instancję zbindowaną do interfejsu IlluminateContractsHttpKernel. Z bootstrap/app.php wiemy, że będzie to… zadeklarowany w naszej aplikacji AppHttpKernel.php!
  • 15. IlluminateFoundationHttpKernel.php To co istotne znajduje się w bloku try: każde zapytanie HTTP zostaje przepuszczone przez router. Jeżeli coś złego się stanie, wywołany zostanie handler wyjątków.
  • 16. IlluminateFoundationHttpKernel.php I teraz zaczyna się zabawa: Laravel binduje obiekt Request z naszym zapytaniem do kontenera zależności. Od teraz będzie można się do niego odezwać z prawie każdego miejsca aplikacji. Request natomiast przesyłany jest przez zadeklarowane middlewary i dopiero przesyłany do routera.
  • 17. Ale jakie middlewary? Wystarczy zajrzeć do naszego app/Http/Kernel i zbadać jego pole $middleware. Powinna znaleźć się tam tablica middlewarów, które zostaną nałożone na każde zapytanie. Może być ich dowolna liczba, mogą dowolnie działać. Na przykład fajnie można sobie identyfikować wszystkie obiekty Request:
  • 18. Ale jakie middlewary? Warto też pamiętać, że Laravel umożliwia definiowanie nie tylko klasycznych “before middlewarów”, ale także może nieco mniej intuicyjne “after middleware”:
  • 19. IlluminateFoundationHttpKernel.php Jeżeli zadeklarujemy wszystkie middlewary, Laravel wywołuje swój router i próbuje przepchnąć przez niego otrzymane zapytanie HTTP.
  • 20. Magia! Tutaj zaczyna się mocno skomplikowana rzecz. Metoda dispatch() wywołuje dispatchToRoute(), która z kolei po wywołaniu findRoute() wywołuje runRoute(). findRoute() szuka wzoru z zapytania HTTP w dostarczonych mu routach. A skąd je zna? Możemy jest zadeklarować w service providerze, a konkretnie w app/Providers/RouteServiceProvider.php - to tam deklarujemy jak podpiąć routes/web.php czy routes/api.php A więc znów cała magia dzieje się we frameworku, a po naszej stronie zostaje włożenie odpowiedniego klocka w odpowiednie miejsce.
  • 21. IlluminateRoutingRoute.php Po zbudowaniu kolejnego Pipeline’a z middlewarami, router będzie spróbował stworzyć kontroler, do którego jest przypisany dopasowany route. Metoda run() sprawdzi jak została zarejestrowana akcji route’a i spróbuje coś z nią zrobić. W przypadku powyżej, obsłużony zostaje klasyczny route podpięty pod kontroler.
  • 22. IlluminateRoutingRoute.php Jak więc “rodzi się” kontroler? Z nazwy przekazanej w konfiguracji routingu tworzony jest obiekt kontrolera z poziomu kontenera zależności!
  • 23. IlluminateRoutingControllerDispatcher.php Na tak stworzonym kontrolerze jest wywoływana metoda… również wykoncypowana z konfiguracji. Natomiast resolveClassMethodDependencies() to nic innego jak wywołanie refleksją wszystkich parametrów metody kontrolera… znowuż w kontenerze zależności.
  • 24. FormRequesty? FormRequest, czyli z góry określony schemat oczekiwanego zapytania HTTP to jeden z najwygodniejszych bulbulatorów Laravela. Wystarczy dodać nazwę klasy Form Requestu do sygnatury metody kontrolera i nagle walidacja zaczyna “sama działać” wedle opisanych reguł. Ale jak to działa?
  • 25. FormRequesty? Nikt w routerze nie sprawdza na twardo typów tworzonych obiektów. W taki sposób plik Route.php rozrósłby się do dziesiątek tysięcy linijek kodu w wielkim ifowym drzewku. Ale przecież mamy kontener zależności! W IlluminateFoundationProviders FormRequestServiceProvider zadeklarowano hook, który mówi, że po wybraniu każdego obiektu implementującego kontrakt IlluminateContracts ValidationValidatesWhenResolved, zostanie na nim wywołana metoda validateResolved() A co w niej jest? Ano walidacja naszego Form Requestu!
  • 26. Jak działa Laravel? A na samym końcu tak naprawdę możemy stworzyć jeden kontroler, podpiąć go pod domyślny router i wszystko będzie działać.
  • 27. Słówko przestrogi Takiej “magii” w Laravelu jest bardzo dużo. Bardzo. Warto przejść się z debuggerem i krok po kroku zobaczyć jak wyglądają przedstawione tutaj procesy, ale także wszystkie inne: tłumaczenia, fasady, korzystanie z konfiguracji.