Techniki Pracy
8 godz. 33 min · Laravel · Full-stack i Programowanie
Piotr PalarzWeb DeveloperKurs ten rozpoczniemy od omówienia czym jest framework Laravel i co może Ci zaoferować. Następnie zobaczysz jak skonfigurować środowisko do pracy lokalnej w formie wirtualnej maszyny z preinstalowanymi narzędziami, tj. PHP, MySQL czy serwerem nginx. Zobaczysz w jaki sposób tworzyć nowe projekty wykorzystujące Laravel, zrozumiesz strukturę katalogów projektu i skonfigurujesz polaczenie z baza danych.
W kursie nie znajdziesz czysto teoretycznych lekcji. Każda z części przybliżać nas bowiem będzie do finalnej wersji projektu, którym będzie aplikacja internetowego bloga. Funkcjonalności, które od podstaw zaimplementujemy, to m.in. dodawanie i wyświetlanie wpisów, tworzenie i przypisywanie tagów, komentowanie, rejestracja i logowanie użytkowników czy wyszukiwarka. Każda z nich odkryje przez Toba możliwości frameworka Laravel i jego sposoby na rozwiazywanie konkretnych problemów.
Laravel to framework oparty o wzorzec MVC. Na konkretnych przykładach zobaczysz co to oznacza. Tworzyć będziemy wspólnie kontrolery, do których przypiszemy stosowne adresy URL, modele, które reprezentować będą dane, a także widoki, które te dane sformatują, wplatając je w kod HTML.
Choć aby w pełni zrozumieć omawiane zagadnienia, należy znać podstawowe koncepcje relacyjnych baz danych, to pisanie zapytań SQL nie jest czymś, to będziemy musieli robić. Wszystko to za sprawa migracji oraz Eloquenta. Te pierwsze pozwolą nam zaprojektować strukturę tabel bazy danych i jedna komenda je utworzyć, a Eloquent posłuży nam do tworzenia, zapisywania i odczytywania modeli reprezentujących te dane. Wszystko to uzyskamy pisząc wyłącznie prosty kod PHP.W kursie nie zabraknie również informacji na temat tworzenia relacji. Zobaczysz m. in. jak skojarzyć autora w wpisem, jak dodawać tagi czy komentarze.
Te dwa pojęcia, choć podobne, różnią się od siebie. Pierwsze pozwala określić, czy logujący się użytkownik jest tym, za kogo się podaje. Drugie mówi nam, czy dana osoba może wykonać zadana akcje. Oba te koncepty zobaczysz w akcji na praktycznym przykładzie. Do naszego bloga dodamy pełen system autentykacji, tj. rejestracje, logowanie, resetowanie hasła i potwierdzanie adresu email. Zalogowani użytkownicy otrzymają dzięki temu bonus w postaci niewidocznych dla pozostałych osób wpisów premium. Aby zarządzać wpisami na blogu, stworzymy mini sekcje administracyjna, do której dostęp będzie miał wyłącznie użytkownik oznaczony jako administrator. Dowiesz się wówczas nie tylko jak pokazywać pewne widoki wyłącznie zautoryzowanym osobom, ale także jak zabezpieczyć kontrolery przed nieuprawnionym dostępem.
Oprócz wymienionych wyżej tematów, w kursie poruszymy również uploadowanie plików na serwer, sposoby tworzenia i wysyłania maili, prace z Front-endem, debugowanie aplikacji, korzystanie z rozszerzeń tworzonych przez aktywna społeczność Laravel czy techniki wdrażania aplikacji do produkcji. Ostatni temat będzie o tyle ciekawy, ze jest on często pomijany w materiałach tego typu. Z tym kursem Twoja aplikacja nie pozostanie wyłącznie na dysku Twojego komputera. Dowiesz się bowiem jak skonfigurować serwer VPS tak, aby wykorzystać tzw. zero-downtime deployment. Dwie komendy wystarcza wówczas do tego, aby w kilkanaście sekund nowa wersja Twojej aplikacji ukazała się światu. A wszystko to bez przerywania jej działania nawet na ułamek sekundy i bez wykorzystania płatnych rozwiązań!
Kurs ten jest dla wszystkich tych, którzy znają już podstawy języka PHP i koncepcje relacyjnych baz danych SQL oraz chcieliby przyjemnie i wydajnie tworzyć ambitne aplikacje internetowe. Znajomość samego frameworka Laravel lub podobnych rozwiązań nie jest jednak wymagana. Praca z frameworkiem omawiana jest stopniowo, od podstaw do bardziej zaawansowanych tematów. Jeśli zatem masz głowę pełną pomysłów, a chcesz uniknąć frustracji związanej z pisaniem wszystkiego od podstaw - koniecznie sięgnij po Laravel i zobacz jak to narzędzie pozwoli skupić Ci się na tym, co istotne!
5.8.x
Nasz serwis już działa coraz sprawniej, natomiast mamy jeszcze jedną bardzo ważną lukę
bezpieczeństwa. Otóż każdy może dodawać u nas wpisy oraz je
usuwać. Wystarczy, że jest zalogowany, dlatego będziemy chcieli
teraz to zmienić, w zasadzie nawet nie musiałby być zalogowany
bo nie korzystaliśmy z żadnego middleware, ale wtedy mu formularza poprawnie nie wyświetlimy. Niemniej
jednak chciałbym zrobić tak żeby jeden użytkowników był adminem i jeżeli jest
adminem to wtedy może dodawać te wpisy. Pokażę ci teraz jak możemy to zrobić, po
pierwsze będziemy chcieli zdefiniować kto jest administratorem i teraz to można zrobić na
wiele sposobów, mniej lub zaawansowanych na przykład może mieć specjalną tabelę
w bazie danych, która listuje kto ma jaką rolę. Natomiast my to zrobimy w
uproszczony sposób gdzie użytkownik identyfikatorem 1 po
prostu jest administratorem. Zazwyczaj jeżeli tworzysz stronę to ty będziesz tym pierwszym użytkownikiem i
do prostych przykładów to w zupełności powinno wystarczyć dlatego przejdziemy
sobie do user naszego modelu i to jest nasz model więc
możemy tutaj dodawać co chcemy. Dlatego ja chciałbym dodać metodę publiczną
którą nazwiemy isAdmin, więc ona na każdym użytkowniku będzie dostępna i ona
będziesz zwracać true jeżeli i zróbmy
to w ten sposób this id, czyli id tego użytkownika równa
się 1, to oznacza że jest to admin w przeciwnym wypadku ten użytkownik
adminem nie będzie, więc naszym przypadku jeżeli przejdziemy do users mamy
tutaj takiego który ma 3 i 5, więc żaden z nich, można
powiedzieć, nie będzie adminem, ale to wynika tylko z tego że usuwaliśmy użytkowników,
dodawaliśmy. W zasadzie ja to robiłem tutaj w tle, więc
będziemy musieli wykonać sobie świeże migracje i wtedy te id będą od
nowa tutaj nadawane. Kiedy już wiemy jak określić czy użytkownik jest adminem
czy nie to dodamy sobie coś to nazywa się Gate i teraz
musimy przejść do pliku który się nazywa AuthServiceProvider on ma tutaj taką
metodę boot. W dokumentacji laravel znajdziesz że czasami są takie przypadki
że się tutaj właśnie coś dodaje i mamy coś takiego jak Gate to
powinno być tutaj zaimportowane u góry, jest i możemy taką bramę zdefiniować
za pomocą define, możemy ją nazwać chcemy więc ja chcę ją nazwać
manage-posts. Później będziemy pytać czy użytkownik can
manage posts. Dlatego chcę to nazwać w ten sposób. To będzie funkcja,
która otrzyma user, czyli użytkownika i z niej zwracamy co
chcemy. Jeśli zwrócimy true, dany użytkownik może zarządzać postami jeżeli zwrócimy
false to nie może. Co ważne i my tego nie będziemy robić, ale chciałbym żebyś był tego świadom,
możesz również zdefiniować te bramy w taki sposób czy użytkownik może
danym postem zarządzać, wtedy będziesz miał przekazanego i użytkownika i wpis i możesz
sprawdzić czy wpis należy do danego użytkownika. To bardzo ważne, bo wtedy taki
użytkownik mógł edytować tylko swoje wpisy, a nie cuda u nas jeżeli manage-posts
będzie zwracać true wszystkie wpisy może edytować. Więc stąd chcemy
zwrócić true lub false, mając już user'a zwrócimy to co przed
chwilką na nim dodaliśmy czyli isAdmin. Dzięki temu jeżeli w przyszłości zmienimy
logikę isAdmin na jakąś bardziej zaawansowaną, tutaj nie będziemy musieli nic zmieniać
i teraz co okazuje. W momencie kiedy zdefiniujemy taki Gate
to możemy korzystać z middleware, czyli takiej funkcji pośredniczącej, a z middleware można
korzystać na wiele sposobów, przyjdziemy sobie do PostController, tutaj
w Admin i następnie przejdziemy do samej góry, będę chciał dodać tutaj
konstruktor, którego nie mieliśmy i w
konstruktorze możemy korzystać z middleware za pomocą this, middleware. Skorzystałem po
pierwsze z auth, to będzie oznaczało tyle że żaden z tych kontrolerów nie
może być wykonan. Żadna z tych akcji jeżeli użytkownik nie jest zalogowany, wcześniej nie zrobiliśmy, więc
nawet nie zalogowani, gdyby wysłali odpowiednie zapytanie mogliby
dodać wpisy. Oczywiście im by się formularze nie wyświetliły, bo o to
zadbaliśmy widokach, ale to nie jest wymówka zawsze musimy na poziomie kontrolera
dbać o to, żeby czegoś się nie dało zrobić. To jest pierwszy middleware i i one
są sprawdzane w takiej kolejności jak tutaj dodamy, ale drugie middleware to
jest middleware can i jemu można przekazać parametr. Ten parametr jest o tyle dynamiczny.
No właśnie że jeżeli tutaj zdefiniujemy jakąś nazwę to potem możemy ją przekazać tutaj
czyli tak to będzie wyglądać, jeżeli dany użytkownik nie
może dodawać wpisów bo nie jest adminem to nie będzie mógł skorzystać z żadnej metod
które tutaj są. Otrzyma status 403 forbidden, po prostu. Zatem sprawdźmy,
przejdziemy teraz do create i o ile to się wyświetli, chociaż zasadzie nie, nawet się
nie wyświetli. Zauważ, że my to wyświetlaliśmy, no właśnie, za pomocą metody show
która gdzieś tutaj jest czy metody create, dokładnie
czyli return admin.post.create, więc ta metoda również
jest chroniona, oczywiście moglibyśmy tutaj zrobić na chwilę except create, czyli
wszystko chroń poza tą metodą, wtedy by się nam to wyświetliło, ale już wysłać by się nie
otrzymalibyśmy 403, więc w ten sposób możemy zabezpieczyć cały
nasz Controller przed tym żeby ktoś kto jest
adminem nie mógł w tutaj wykonać żadnych akcji. Innym sposobem
jest użycie autorise i i pokażę ci to na sekundę, może w danym
kontrolerze, w danej w zasadzie metodzie kontrolera, coś takiego wywołać więc
jak tutaj mieliśmy tą metodę create, to na jej początku
można zrobić this autorise, tutaj
możemy podać nazwę manage-posts, bo tak to nazwaliśmy. Wtedy
ta konkretna metoda będzie w ten sposób autoryzowana i znowu zobacz nie
da się do niej przejść, więc można to robić na właśnie takim poziomie, bo powiedzmy,
że tutaj będziemy mieli przekazane. Do tej metody akurat nie, ale gdybyśmy parametru url
tak jak przy edit, mieli zczytywany post, to wtedy moglibyśmy w takim
post'cie zrobić autorise przekazać tam również ten post, tak jak wspomniałem na początku
tej lekcji i wtedy tutaj można to podać jako drugi parametr i sprawdzić
czy admin, czy w zasadzie ten użytkownik może dany post w ogóle
edytować. U nas takiej koncepcji nie ma, ale warto wiedzieć, że authorise również istnieje. U nas
wystarczy czy ktoś może zarządzać post'ami, a to już zdefiniowaliśmy, musi
być po prostu adminem. Na koniec jeszcze ci pokażę jedną
rzecz, bo można na bardzo wiele sposobów przypisywać middleware. Przejdziemy do web
i można middleware przepisywać na przykład tak, przy danej ścieżce można powiedzieć middleware i
tutaj ją podać na przykład auth czy manage-posts, ale można również
utworzyć grupę. Wszelkie rzeczy które mamy admin moglibyśmy zrobić group, tutaj
podamy za chwilkę jedną rzecz, a druga będzie to taka funkcja i wszystkie
ścieżki, które tutaj zdefiniowaliśmy moglibyśmy wrzucić do środka. Tutaj
moglibyśmy powiedzieć prefix, to jest
admin dzięki temu wszystkie, które w środku mogłyby już tego
prefiksu nie mieć. Zapewniam cię że zadziała to dokładnie tak samo. A dodatkowo
możemy tutaj podać właśnie middleware i to
jako taką tablicę tu moglibyśmy powiedzieć can:manage-posts i
jeżeli tutaj to wykomentujemy sprawdźmy
czy to zadziała tak samo. Jak widzisz w się tutaj nie da przejść, ale sama
ścieżka jest poprawna, więc to jest kilka sposobów na to możemy to zrobić. Ja
zostawię to takiej formie jak było to wcześniej, ale pamiętaj, że możesz to również
z tego poziomu zabezpieczać.