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
Innym bardzo popularnym typem relacji jest relacja many to many
i będę chciał ci ją pokazać na przykładzie tagów. Zauważ, że my tutaj jakieś tagi
mamy i będę chciał jej przepisywać do wpisów i teraz dlaczego many to many. Dlatego
że jeden tag może być przypisany do wielu wpisów
i z drugiej strony wpis może mieć wiele tagów, więc jest relacja many to many,
będziemy w tej lekcji chcieli sobie wygenerować migracje dla
tagów dla specjalnej tabeli pośredniczącej i również utworzymy sobie model tag'u,
a w kolejnej zajmiemy się pozostałymi czynnościami, więc przejdźmy sobie teraz
do wiersza poleceń i będę chciał po pierwsze utworzyć model
tag i następnie będę chciał utworzyć migracje
dla tabeli tagów, więc php artisan make:migration create_tags_table.
Pozostawię oczywiście
id, to jest bardzo ważne, timestamp też się przyda, będziemy wiedzieć kiedy dany tag
został utworzony i teraz chciałbym, żeby każdy
tag miał nazwę, będzie to string i
żeby miał slug, bo ten slug nam będzie potrzebny później. Okej,
teraz jeżeli przejdziemy do tag, bo chciałem od
razu zrobić jedną rzecz i skopiujemy ją sobie z Post, czyli chciałbym, żeby od był
tworzony automatycznie slug. Zatem
setNameAttribute tym razem, kiedy name będzie ustawiane, to
chcemy name ustawić na value, a slug ustawić na str slug tylko
musimy sobie to str jeszcze tutaj zaimportować i teraz w
jaki sposób utworzy się relację many to many. Nie
możemy tego zrobić tak jak wcześniej, że w tabeli tags będzie od razu
przypisane przy tagu do jego wpisu on przynależy dlatego, że może przynależeć wielu
wpisów czyli coś takiego jak mieliśmy tutaj że dany komentarz przynależy
do jakiegoś wpisu już przypadku tagu nie wchodzi grę bo jeden tak może
być wielu wpisach i dlatego potrzebna jest zupełnie osobna
tabela która będzie się nazywała post tag. Można
ją nazwać dowolnie, natomiast taka jest konwencja w laravel i laravel
dzięki temu automatycznie będzie to rozpoznawał. Czyli bierzemy sobie dwie tabele które
chcemy w jaki sposób ze sobą skojarzyć. Czyli będzie to posts i tags,
tutaj się powinno tags pojawić. Za moment kiedy wykonamy oczywiście
artisan migrate, czyli one są tutaj liczbę mnogą
nazwane, a nową tabele którą tworzymy to nazywamy już liczbami pojedynczymi
i alfabetycznie ustawiamy. Jeżeli najpierw w alfabecie występuje literka p
to będzie post podkreślnik tag, może to jest dziwne
na początku ale zobaczysz, że ma to sens dlatego my musimy sobie taką tabelę
utworzyć, a zatem potrzebujemy migracji czyli
make:migration i nazwiemy create_post_tag_table. Teraz
będziemy chcieli ją uzupełnić w odpowiedni sposób i w tej tabeli
nie jest nam potrzebny id. Natomiast co jest nam potrzebne.
No właśnie przechowywanie post_id i tag_id, dlatego table unsignedBigInteger
będziemy tutaj przechowywać post_id i zrobimy
to samo dla tag_id i w
zasadzie tyle by wystarczyło, ale pokażę ci jeszcze jedną ciekawą rzecz timestamps
sobie również tutaj zostawimy. Otóż do tej pory te relacje, które
ustawialiśmy, to one były na poziomie naszej aplikacji wyłącznie ustawione, czyli
na przykład, że wpis jest przypisany użytkownika i tak dalej. One nie były na
poziomie SQL'a w żaden sposób zrobione. Za pomocą tak zwanego foreign key
ale możemy to zrobić i pokażę ci to na tym konkretnym
przykładzie. Zawsze możemy tutaj zrobić coś takiego, że mówimy table foreign
post_id i następnie
powiemy references, czyli, że on
nawiązuje do id w tabeli posts i następnie
jeszcze ustawimy coś takiego jak onDelete cascade. To
dla ciebie może być jasne jeżeli miałaś do czynienia z SQL'owymi bazami danych i rozumiesz jak
działają relacje. Jeżeli nie to już tłumaczę, tutaj jasno mówimy już na etapie
tworzenia tej tabeli, co się zaraz będzie działo. Mówimy SQL'owi,
że ten klucz obcy, czyli post_id, on
odpowiada czy wskazuje na id w tabeli posts, a onDelete
cascade oznacza tylko tyle że jeżeli dwa będziemy to kojarzyć z odpowiednimi
tagami to jeżeli tak i tak zostanie usunięty, czy w tym przypadku
jeżeli posts zostanie usunięty to również ten rekord bazy czy z tabeli
post tak ma zostać usunięty. Podobną rzecz chcemy teraz zdefiniować
dla tagu, czyli mówimy że tag_id
odpowiada id w tabeli
tags i również cascade, to kolei oznacza, że jeżeli dany tag,
którego id się w tym rekordzie pojawiło zostanie usunięty, również ten rekord usuń
bo on prostu nie ma sensu i na końcu jeszcze jedną ciekawą rzecz zrobimy. Otóż
chciałbym, żeby się nie dało dwa razy dodać do tej tabeli takiego samego
rekordu, czyli na przykład jeżeli będziemy chcieli powiedzieć że tag o identyfikatorze jeden
jest przypisany do wpisu o identyfikatorze 2, to będziemy w
tej tabeli mieć zaraz zobaczysz 1 i 2 i bez sensu byłoby gdyby dwa razy
dało się dodać coś takiego więc możemy na poziomie już SQL'a
powiedzieć że coś takiego jest niemożliwe i kiedy nasza aplikacja w jakiś sposób
zawiedzie czyli spróbujemy coś takiego dodać to SQL zwróci nam błąd i to możemy
zrobić pisząc primary czyli ustawiamy sobie ten
klucz podstawowy, podamy tutaj tablice post_id oraz
tag_id czyli te dwa w zasadzie muszą być unikalne
to oznacza tylko tyle że nie możemy dodać 1 2 i potem znowu 1 2, coś
takiego nam po prostu nie przejdzie. Wykonajmy sobie te migracje teraz. Jak
widzisz udało się i teraz jak odświeżymy to powinno to być już lepiej widoczne, mamy
tutaj taką tabelę jak post_tag i tutaj na przykład wpiszemy post_id 1, tag_id 2
to znaczy że tag o identyfikatorze 2 jest przypisany wpisu
o identyfikatorze 1 potem znowu może być że post_id 1
i tag_id 3, to znaczy że ten taki jest do tego samego wpisu co ten wyższy
przypisany. Teraz musimy ustawić sobie jeszcze odpowiednią relacje,
dlatego przejdziemy do tag i tak
jak wcześniej utworzyliśmy relację jakie tworzyliśmy, stworzymy funkcję
publiczną, którą nazwiemy posts i tutaj
zwrócimy this belongsToMany, czyli
że ten tag może przynależeć do wielu wpisów. Tutaj
podamy Post class, nie musimy tutaj nic więcej definiować, bo tutaj można podać kolejne
parametry, dzięki temu, że zastosowaliśmy się do tej konwencji nazewniczej
i gdzie tabelę nazywaliśmy post_tag i dzięki temu bez problemu
nam to będzie działać, czyli możemy powiedzieć, że tag przynależy
do wielu wpisów i teraz wpis może mieć wiele tag'ów. Zatem
skopiuję to co mamy tutaj i przyjdziemy to Post tutaj
będziemy chcieli powiedzieć tags belongsToMany Tak. Dzięki
temu jak już mamy model post, to możemy na nim zrobić tags i zwróci nam wszystkie
tagi, laravel zrobi to dla nas automatycznie będzie to bardzo fajnie działać. Na
koniec tej lekcji utwórzmy sobie jakiś tag i przypisz go do wpisu. Zrobimy
to za pomocą php artisan tinker, tag
równa się App Tag create. Wystarczy
mu podać name, więc tutaj taka tablica slug zostanie utworzony automatycznie
nazwiemy
go po prostu test, okej i znowu ten sam problem co wcześniej, laravel
chroni nas nami samymi, więc zadajemy sobie tutaj protected fillable,
chcemy żeby się dało ustawić name, slug się
ustawia automatycznie. Musimy tinkera zamknąć i jeszcze raz otworzyć,
natomiast strzałką w górę można przejść do ostatnich operacji, teraz taki tag
już nam się utworzył, zapisał się w bazie danych, więc odtwórzmy sobie co tutaj się dzieje.
Dodał się tag, który ma identyfikator 1 i odpowiednie kolumny
i teraz chcemy żeby on pojawił w tym miejscu, więc mamy jakiś post
na przykład ten z identyfikatorem 2, zaraz go znajdziemy, zróbmy
to tak App Post find 2, czyli ten identyfikatorem
drugim chcemy zwrócić i jak do niego przypisać ten tag. W laraverze wystarczy,
że skorzystamy z metody attach i tutaj możemy przekazać model
tag, który zapisaliśmy zmiennej powyżej. Okej,
pojawił się błąd bo najpierw jeszcze musimy się odwołać do tags, żeby
to wszystko było jasne już ci to wytłumaczę. Odwołuje się na modelu post,
do tag tylko dlatego że nazwałem to tutaj tags, to jest bardzo
ważne i na tej funkcji tags na tym co ona zwróci wywołuje
metodę attach, czyli dopiero teraz to powinno zadziałać i to
oznacza że ten tag został tutaj przypisany i to oznacza tylko tyle,
że dokładnie w tej tabeli taka relacja została zapisana, czyli że post_id
2 zawiera tag_id 1 i tutaj
może być wiele takich przypisań i dzięki temu że zrobiliśmy coś takiego to
teraz się mogę odwołać do tego post'a i mogę zwrócić wszystkie jego tag i będzie
to wyglądać następująco. Jeżeli chciałbym taki tag usunąć to
mogę skorzystać z metody detach i można albo przekazać
model albo po prostu id. Wiemy że id tego tagu to było 1 jeżeli
to zadziała to w tej tabeli po prostu to zniknie i teraz jeżeli byśmy się chcieli
odwołać tak jak wcześniej do tags to one już nie będą zwracane.