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
W tej lekcji zajmiemy się tym w jaki sposób odczytywać przesłane z formularza dane
na serwerze i jak za ich pomocą możemy utworzyć nowy wpis, więc
może jeszcze jedną rzecz zróbmy na początek, tutaj mamy coś takiego jak delete, tym
się zajmiemy później to będzie na ekranie edycji tylko, więc możemy to tutaj
spokojnie usunąć i bardzo ważna rzecz jest taka, żeby w formularzu zawsze mieć atrybuty,
name bo to właśnie na ich podstawie po stronie serwera są parsowane dane,
więc tutaj mamy name text, w zasadzie widzę że tutaj
jest błąd to powinno być na odwrót czyli title, poprawmy
to sobie mamy name type, następnie mamy coś takiego jak date,
mamy Premium, tym się na razie nie będziemy zajmować, troszeczkę później to zrobimy. Mamy image,
również później i mamy name content to jest super ważne. Teraz sobie
będziemy musieli wygenerować tutaj link do odpowiedniej akcji naszego
kontrolera i zobaczysz na czym sprawa polega, o Ile create
jest tutaj jasno napisane wyświetla formularz tworzenia nowego zasobu, o tyle
metoda store do której prześlemy zapytanie post'em, będzie nam
zapisywała to w bazie danych, dlatego do metody store
chcemy sobie utworzyć teraz ścieżkę w routes i zróbmy
to na samym dole, ona będzie taka sama. Dlatego name
tutaj nie musi mieć a będziemy mogli z niego korzystać, tylko że będzie to
post. Te ścieżki możesz sobie dowolnie tutaj zmieniać, ja
robię to ten sposób, gdybyśmy mieli czysto takie restowe API, jeżeli wiesz
na czym rest polega, to wtedy mielibyśmy na przykład posts i po prostu wysłanie
zapytania typie post po ukośnik posts tworzyłoby nowy wpis. Jeżeli
byśmy mieli posts ukośnik na przykład 1 to byśmy wyświetla ten wpis. Jeżeli
byśmy wysłali zapytanie o typie put powiedzmy albo
patch pod posts 1, to wtedy byśmy go edytowali. Natomiast
tutaj jest pełna dowolność dla naszego przykładu. Ja to zostawię
ten sposób. Czyli teraz będziemy chcieli wysyłać dane z formularza pod ten adres
i tutaj oczywiście jeszcze tylko metodę musimy dostosować store. Ten
adres możemy uzyskać za tego name bo one są takie same, dlatego admin post create. Spokojnie
można tutaj podmienić i oczywiście
jeszcze trzeba dodać tutaj metodę post, to bardzo ważne. Dobrze,
mamy to zrobione, zatem przejdźmy do metody store i
zobaczymy co tutaj się w ogóle będzie działo, skorzystamy z laravel'owej fajnej
metody, takiej funkcji die dump, która pozwoli nam wyświetlić w sformatowany
sposób to, co tutaj podamy. Ja będę chciał tutaj podać request
all, czyli request jest to obiekt jak jest tak jasno
pokazane z klasy request więc można tą klasę podejrzeć zobaczyć
jakie ona metody. Część z nich znajdziesz oczywiście w dokumentacji. Jedną z nich jest all,
która nam jako tablica zwraca wszystkie dane przesyłane do
serwera, a te dane będą oczywiście danymi z formularza, czyli tutaj zupełnie nie musimy
jakby serializacją tych danych się zajmować i tak dalej. Jeżeli byś wysłał Ajaxem
z poziomu JavaScript'u dane do serwera, na przykład json'owe, laravel również
je poprawnie odczyta. Tutaj ta warstwa abstrakcji jest naprawdę duża i nie musimy
w ogóle tym myśleć, więc wyświetlmy wszystko, co zostało przesłane. Tutaj
odświeżmy jeszcze, żeby ten formularz się zaktualizował i okej nic
nie wyślemy, czyli takie puste dane. Mamy Page expired i to ci powinno mówić bardzo
ważną rzecz o której ja często zapominam, że musimy dodać csrf.
Jeżeli to dodamy, spróbujmy pusty formularz wysłać. Dokładnie
tak wyglądają dane przesyłane do serwera z których możemy skorzystać, token jest to ten csrf, my
nie musimy ręcznie z niego korzystać. Natomiast później mamy title, date, image i tak
dalej. To są wartości null, tak naprawdę do serwera jeżeli nic nie wpiszemy
w polu wysyłany jest pusty string. Skąd się bierze null, to taka tylko ciekawostka,
nie wiem czy znajdziemy tutaj, ale chyba tak. Mamy coś takiego jak,
taki middleware, ok ono nie jest tutaj, ale w jednym
z miejsc gdzie się rejestruje middleware jest zarejestrowany i jest to specjalny
middleware, które puste ciągi zamienia na null, więc warto wiedzieć że to też
nie jest jakaś magia, jest to zdefiniowane w laraverze żeby tak robić. Natomiast
tutaj jest z kolei middleware TrimStrings i ono polega na tym że będzie
nam przesyłane stringi trymować z przodu z tyłu usuwa puste znaki
oprócz takich które podamy tutaj to tylko tak tytułem ciekawostki,
żebyś wiedział, że laravel wiele rzeczy za robi na przykład zamienia puste ciągi
znaków na wartości null, ale w razie w razie czego można to wyłączyć. Skoro
takie dane są przesyłane do serwera to jeżeli coś uzupełnimy to raczej tutaj nie ma
niespodzianek, również to tutaj się pojawi i teraz na tej podstawie moglibyśmy już utworzyć
nowy wpis, zapewne się domyślasz jak to zrobić. Jeżeli tutaj zaimportujemy
u góry, że chcemy korzystać z posts, czyli
mamy model eloquent, to w tym miejscu gdzie te dane mamy,
moglibyśmy wtedy powiedzieć Post create i te
dane tam przekazać. To jest jeden sposób na tworzenie wpisów, drugi byłby taki, że
możemy zrobić new Post, przekazać tutaj dane i on się
tylko utworzy, ale nie jest w bazie danych, a potem można zrobić zawsze post save, tak
to działa w eloquent'cie. Niemniej jednak od razu można skorzystać z metody statycznej
Create, która nam coś takiego zrobi więc możemy
taki wpis utworzyć z tym że jeszcze nie mamy walidacji, tym się zajmiemy w kolejnych lekcjach, ale
chcę ci pokazać jedną ważną rzecz przesyłamy tutaj title, date i image
i zasadzie to są rzeczy nam wystarczą. Jeżeli byśmy sobie zerknęli na
migracje create posts table, którą sami napisaliśmy, to
wychodzi na to, że tak naprawdę wymagany jest jedynie title date i type, nic
więcej tutaj wymagane nie jest i uda nam się wtedy dodać taki wpis do
bazy, czyli jeżeli w formularzu, który jest tutaj wpiszemy tytuł, wybierzemy
jakiś typ i wybierzemy datę jakąkolwiek i
wyślemy te dane się tutaj znajdą to możemy te dane przekazać jest
to tablica jak tutaj jasno widać czyli wydawałoby że możemy
teraz tutaj przekazać request all. Powiem później dlaczego
nie jest to dobrym pomysłem i taki wpis powinien zostać utworzony.
Zobaczymy co się stanie kiedy spróbujemy coś takiego zrobić. Tam
nam się zapamiętały więc fajnie, akurat to tylko przeglądarka to zebrała nie jakaś nasza
logika. Wyślemy, okej i wpis
nam się dodał i on się rzeczywiście do bazy danych dodał, jak
widać tutaj jest, nie pojawił żaden błąd. Wydawałoby
się że jest wszystko w że musimy tylko dodać teraz jakąś logika żeby go wyświetlać ale
pokażę ci co się wydarzy, jeżeli zrobimy że dokładnie taką samą czyli wszystko jest wypełnione
i zaznaczymy jeszcze checkbox Premium a tenże checkbox
znajduje się w tym miejscu gdzieś i on ma nazwę. Jeżeli
zostanie zaznaczony to zostanie przez przeglądarkę przesłany do serwera. Wydawałoby że
robimy dokładnie to co przed momentem ale z zaznaczonym checkbox'em Premium i to już generuje
błąd że nieznana jest kolumna premium i to jest to niebezpieczeństwo
przekazywania wszystkich danych jakie zostały przesłane do tworzenia nowego
zasobu. Nigdy nie powinniśmy tego robić. Po pierwsze dlatego że tutaj użytkownik
może dowolne rzeczy sobie wpisać, nawet takie których my byśmy zmieniać nie chcieli, to
po pierwsze. Po drugie jeżeli będą tam dane których nie ma i próbować, laravel
próbuje je dodać do bazy danych, to będzie to generować błędy. Więc walidacja zawsze jest potrzebna,
ale pokazałem ci to po to żebyśmy mogli umówić jedną ważną
rzecz. Jeżeli byśmy sobie przeszli do
post. To mamy coś tutaj takiego jak guarded. Ja
to jednej lekcji dodałem, mówiłem ci że się tym później zajmiemy. I teraz guarded
oznacza, że są pewne właściwości których nie powinno się móc
przypisać za pomocą Mass Assigment, czyli właśnie w ten sposób. Mass Assignment
jest zawsze kiedy zrobimy create albo update i podajemy tutaj tablice z wieloma różnymi
polami, więc jeżeli byśmy w guarded powiedzieli, że wszystko tutaj można ustawić
oprócz na przykład Premium to gwarantuje, że wtedy to przejdzie, bo on to Premium będzie miał
po prostu pominie, natomiast dużo lepszym rozwiązaniem jest
ustawienie fillable i fillable oznacza, że my tutaj mówimy jasno,
które z pól można pomocą Mass Assigment ustawiać, a które nie i w zasadzie
jeśli poprawnie je uzupełnimy to nawet bezpieczne jest podawanie tutaj request
all, bo nieważne co kto doda do takiego formularza, nie ważne co nam tutaj przyśle,
to tylko te pola które my za deklarujemy jasno wyraźnie będą mogły
być zmieniane dlatego możemy tutaj w fillable podać to co chcemy żeby mogło
być zmieniane i naszym przypadku to będzie title, może być ustawiony, date,
content, image i zobaczmy
czy tam jeszcze coś mamy i oczywiście type
jeszcze musimy sobie tutaj dodać. Kiedy
zrobimy coś takiego to teoretycznie nawet bez walidacji bezpiecznie możemy pozwolić
aby request all, czyli wszystko co zostało przesłane zostało przekazane, bo
tylko te zostaną przefiltrowane i na te pozwolimy, więc
jeżeli coś takiego zrobimy i wyślemy sobie formularze raz jeszcze to da nam się oczywiście
poprawnie wpis, natomiast jak on się doda, zróbmy to od razu, to
jego instancje będziemy mieli pod zmienną post i będziemy mogli oczywiście
zareagować na to w jaki sposób i coś użytkownikowi pokazać. Więc pierwsza z rzeczy,
którą wykorzystamy, coś co zrobiliśmy wcześniej, czyli session flash message
i tutaj napiszemy Post has been added. Wiemy,
że to nam wyświetli zielony komunikat i ostatnia rzecz którą tutaj możemy zrobić to
będzie return redirect. Jest też globalna funkcja która pozwala nam przekierowywać. Tutaj
możemy podawać ścieżki na przykład w ten sposób lub możemy podać
nazwę na przykład route'a, natomiast zrobimy to tak, wiem
route, wykorzystaliśmy to w widoku posts.single,
zwraca nam odwołaniem czy zwraca nam ścieżkę do
pojedynczego wpisu. Natomiast tu musieliśmy przekazywać slug i ten slug automatycznie
zostanie utworzone, tym się już zajmowaliśmy wcześniej, czyli
samo route zwróci nam odpowiednią ścieżkę, a redirect do niej przekieruje. Spróbujmy
zatem co się wydarzy jeżeli uzupełnimy tutaj jakiś poprawne dane. Wybierzemy,
że jest to typ photo, następnie wybierzemy jakąś datę i wpiszemy
tutaj jakiś tekst. Próbujemy
dodać i widzimy Post has been added i od razu nas przekierowało
na adres tego posta. Jak zatem widzisz, działa to poprawnie, aczkolwiek będziemy
do tego wszystkiego chcieli jak najbardziej dodać jeszcze walidację. Niemniej jednak pokazałem
ci, mam nadzieję że zrozumiałeś o co chodzi na czym polega fillable i guarded. Fillable
mówi które z tych pól mogą być uzupełniane za pomocą Mass Assigment, czyli
kiedy przekazujemy całą tablicę, a guarded z kolei mówi, które nie mogą. Czyli te co
podasz w guarded nie mogą być ustawione, ale każde inne może być i to też nie
jest najlepszym rozwiązaniem, bo jeżeli tam będzie inne, które nie będzie tutaj wylistowane, wygeneruje
to błąd SQL.