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

Introduction to PostgreSQL
Introduction to PostgreSQLIntroduction to PostgreSQL
Introduction to PostgreSQLJim Mlodgenski
 
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)Aurimas Mikalauskas
 
Tuning Autovacuum in Postgresql
Tuning Autovacuum in PostgresqlTuning Autovacuum in Postgresql
Tuning Autovacuum in PostgresqlMydbops
 
Upgrade from MySQL 5.7 to MySQL 8.0
Upgrade from MySQL 5.7 to MySQL 8.0Upgrade from MySQL 5.7 to MySQL 8.0
Upgrade from MySQL 5.7 to MySQL 8.0Olivier DASINI
 
Monitoring Oracle Database Instances with Zabbix
Monitoring Oracle Database Instances with ZabbixMonitoring Oracle Database Instances with Zabbix
Monitoring Oracle Database Instances with ZabbixGerger
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBMongoDB
 
The Full MySQL and MariaDB Parallel Replication Tutorial
The Full MySQL and MariaDB Parallel Replication TutorialThe Full MySQL and MariaDB Parallel Replication Tutorial
The Full MySQL and MariaDB Parallel Replication TutorialJean-François Gagné
 
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)MongoDB
 
Oracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention TroubleshootingOracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention TroubleshootingTanel Poder
 
High Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando PatroniHigh Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando PatroniZalando Technology
 
HBaseCon 2015: Taming GC Pauses for Large Java Heap in HBase
HBaseCon 2015: Taming GC Pauses for Large Java Heap in HBaseHBaseCon 2015: Taming GC Pauses for Large Java Heap in HBase
HBaseCon 2015: Taming GC Pauses for Large Java Heap in HBaseHBaseCon
 
Same plan different performance
Same plan different performanceSame plan different performance
Same plan different performanceMauro Pagano
 
MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形yoku0825
 
Software Engineering (Testing techniques)
Software Engineering (Testing techniques)Software Engineering (Testing techniques)
Software Engineering (Testing techniques)ShudipPal
 
RocksDB detail
RocksDB detailRocksDB detail
RocksDB detailMIJIN AN
 
Why MySQL Replication Fails, and How to Get it Back
Why MySQL Replication Fails, and How to Get it BackWhy MySQL Replication Fails, and How to Get it Back
Why MySQL Replication Fails, and How to Get it BackSveta Smirnova
 
Transactional writes to cloud storage with Eric Liang
Transactional writes to cloud storage with Eric LiangTransactional writes to cloud storage with Eric Liang
Transactional writes to cloud storage with Eric LiangDatabricks
 

What's hot (20)

Introduction to PostgreSQL
Introduction to PostgreSQLIntroduction to PostgreSQL
Introduction to PostgreSQL
 
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
 
Tuning Autovacuum in Postgresql
Tuning Autovacuum in PostgresqlTuning Autovacuum in Postgresql
Tuning Autovacuum in Postgresql
 
Upgrade from MySQL 5.7 to MySQL 8.0
Upgrade from MySQL 5.7 to MySQL 8.0Upgrade from MySQL 5.7 to MySQL 8.0
Upgrade from MySQL 5.7 to MySQL 8.0
 
Monitoring Oracle Database Instances with Zabbix
Monitoring Oracle Database Instances with ZabbixMonitoring Oracle Database Instances with Zabbix
Monitoring Oracle Database Instances with Zabbix
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 
The Full MySQL and MariaDB Parallel Replication Tutorial
The Full MySQL and MariaDB Parallel Replication TutorialThe Full MySQL and MariaDB Parallel Replication Tutorial
The Full MySQL and MariaDB Parallel Replication Tutorial
 
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
MongoDB Schema Design (Event: An Evening with MongoDB Houston 3/11/15)
 
Oracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention TroubleshootingOracle Latch and Mutex Contention Troubleshooting
Oracle Latch and Mutex Contention Troubleshooting
 
Trigger in mysql
Trigger in mysqlTrigger in mysql
Trigger in mysql
 
Ms sql-server
Ms sql-serverMs sql-server
Ms sql-server
 
High Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando PatroniHigh Availability PostgreSQL with Zalando Patroni
High Availability PostgreSQL with Zalando Patroni
 
HBaseCon 2015: Taming GC Pauses for Large Java Heap in HBase
HBaseCon 2015: Taming GC Pauses for Large Java Heap in HBaseHBaseCon 2015: Taming GC Pauses for Large Java Heap in HBase
HBaseCon 2015: Taming GC Pauses for Large Java Heap in HBase
 
Same plan different performance
Same plan different performanceSame plan different performance
Same plan different performance
 
MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形
 
Software Engineering (Testing techniques)
Software Engineering (Testing techniques)Software Engineering (Testing techniques)
Software Engineering (Testing techniques)
 
RocksDB detail
RocksDB detailRocksDB detail
RocksDB detail
 
08 Terraform: Provisioners
08 Terraform: Provisioners08 Terraform: Provisioners
08 Terraform: Provisioners
 
Why MySQL Replication Fails, and How to Get it Back
Why MySQL Replication Fails, and How to Get it BackWhy MySQL Replication Fails, and How to Get it Back
Why MySQL Replication Fails, and How to Get it Back
 
Transactional writes to cloud storage with Eric Liang
Transactional writes to cloud storage with Eric LiangTransactional writes to cloud storage with Eric Liang
Transactional writes to cloud storage with Eric Liang
 

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.