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ę przypisywaniem tag'ów do wpisu i
zrobimy to w dosyć ciekawy sposób. Najpierw będę chciał ttutaj w edycji dodać
sobie możliwość przypisywania tagów, dlatego przejdźmy do edit
i w miejscu mieliśmy na przykład date możemy tutaj
dać coś takiego. Od razu już dodaje
gotowy kod, czyli będziemy mieli pole takie zwykłe tekstowe o nazwie
tags. No oczywiście standardowa walidacja tak mieliśmy wcześniej
coś takiego samego chcemy dodać również do create kiedy tworzymy nowy wpis
z tym że tutaj nie będzie walidacji,
więc to możemy po prostu usunąć, okej i teraz wiemy,
że jeżeli jakieś tagi tutaj zostaną wpisane to one się pojawią w
kontrolerze czyli jeżeli przejdziemy sobie do kontrolera PostController w Admin
to tutaj gdzie mieliśmy walidacje możemy również dodać tags i
powiedzieć to jest nullable, bo one mogą nie być podawane. Jeżeli
będą podane to zasadzie nie ważne co tam będzie wpisane, będziemy
musieli się tym jakoś zająć i teraz co my będziemy chcieli zrobić, bo jaka
jest idea tej lekcji idea tej lekcji jest taka, że jeżeli tutaj po
odświeżeniu będzie mieli tags, przy edycji wpiszemy sobie jakiekolwiek
tagi oddzielone spacją i to dla nas będzie istotne, możemy
je nazywać hasztagami, możemy bez hasztagów to nie będzie miało znaczenia ale
jeżeli napiszę sobie tutaj na przykład typo i powiedzmy style,
jakieś krótkie żebyśmy mogli to szybko wpisać. Po przesłaniu tego serwer
to będzie string. Chciałbym ten string rozbić na spacji lub nawet jeżeli
tutaj będzie wiele spacji, tym się za moment zajmiemy i z każdego z tych słów
utworzyć nowy tag w bazie danych. Jeżeli takiego tagu
nie ma, czyli do tabeli tags będziemy chcieli taki tag
dodać, jeżeli go nie ma, a jeżeli on jest to po prostu będziemy
tylko gdzieś zwrócić jego id, bo te id będą nam potrzebne, o czym przekonasz się za moment i ta
lekcja jest o tyle ciekawa, że po pierwszy pokażę ci jak utworzyć własny serwis i po
co możemy to zrobić. Nie jest to koncepcja jakoś ściśle związana z laravelem, po
prostu nie zawsze musimy mieć mnóstwo logiki w metodach kontrolerów.
Czasem warto jest część tej logiki wyekstrahować
sobie do osobnego pliku czyli tak zwanego serwisu i tutaj z
tego skorzystać, dlatego chciałbym taki serwis sobie zrobić, ale zanim
go zrobimy to tutaj takie małe sprawdzenie może sobie dodamy, przy
zapisywaniu na przykład wpisu. Jeżeli już po walidacji, tą walidację
przejdziemy i będziemy mieli tagi jakiś dodane. Czyli
możemy sprawdzić If isset data
tags to wtedy będziemy w jakiś sposób chcieli te tagi przypisać
do tego post'u, więc na razie sobie zostawmy to w ten sposób i
teraz utworzymy sobie pewien serwis, który nam tym pomoże. Jak działają
serwisy, ja przyjmuję sobie i zresztą nie tylko ja taką konwencję, że
tutaj gdzie mamy wszystkie te rzeczy typu Providers Controllers
i tak dalej, tworzę sobie katalog Services i dlatego
utworze go teraz, Services, a w środku utworzymy sobie serwis,
który nazwiemy TagsParsingService.php. To
jest normalny plik php'owy w którym utworzymy klasę, ale w zasadzie mógłbyś utworzyć dowolną rzecz,
natomiast operujemy na klasach, więc tak to również zrobimy. Ważny tutaj jest namespace, namespace
powinien podążać za strukturą na dysku tych katalogów,
dlatego tutaj zrobimy App Services i utworzymy
sobie klasę, którą nazwiemy tak jak nazwy pliku czyli TagsParsingService
i teraz ta klasa mogłaby być taka, którą
możemy, możemy utworzyć nową instancje, ale ja to dam tutaj po
prostu jedną prostą, statyczną metodę, z której za moment skorzystamy, dlatego
public static function parse i tutaj
chcemy otrzymywać tekst i tak jak wcześniej wspomniałem z tego tekstu będziemy
chcieli robić go na spacji i utworzyć odpowiednie tagi, więc
jeszcze na górze od razu sobie skorzystajmy z App Tag bo ten
tak będzie nam potrzebny za sekundę i teraz prosta
logika, utworzymy sobie listę przesłaną do serwera bo zaraz tutaj oczywiście będziemy
przekazywać ten tekst w kontrolerze przesyłanym więc powiedzmy
coś takiego jak type i style i chcemy to rozbić na spacji lub wielu stacjach
więc tutaj można skorzystać wyrażenia regularnego preg_split,
to nam stworzyć tablice właśnie z stringu rozbije go na wyrażeniu regularnym
i to może wyglądać tak, że tutaj podamy stację i plus oznacza
jedną lub więcej i następnie co chcemy rozbić, czyli przekazany
tekst. Jak będziemy już mieli taką listę to utworzymy sobie tablice z identyfikatorami, dlatego,że
tak jak wspomniałem jeżeli tutaj dopiszemy sobie na przykład test i taki
hashtag już tutaj mamy. Ma name test, może sobie nawet zmienimy
tak żeby tutaj ten hashtag się na początku pojawił i tutaj go
też dodamy to chciałbym zrobić tak że skoro on istnieje tego nie dodaję, zwracam
jego id czyli 1, a te dwa pozostałe chciałbym dodać i również zwrócić ich id. Zatem
jak możemy to zrobić? Musimy wykonać pętla foreach, czyli po wszystkich elementach tej listy
as tag i teraz
kluczową rzeczą będzie to że utworzymy czy w zasadzie to napiszemy
sobie zmienną tag. Oczywiście można ją nazwać inaczej. Odwołamy
się do modelu tag i na nim wykonamy ciekawą
metodę, którą eloquent oferuje. Jest to firstOrCreate, czyli to
oznacza zwróć nam pierwszy lub utwórz nowy i tutaj
podamy name, równa się tag i to
oznacza tylko tyle, że name to będzie na przykład hashtag typo, czyli w
bazie danych w tabeli tags znajdź taki, który ma name typo. Jeżeli
jest to go zwróć, Jeżeli go nie ma to utwórz go i dopiero tutaj nam zwróć jego model i teraz
do ids. Za pomocą takiego zapisu będziemy chcieli zrobić
push, czyli wstawić identyfikator takiego tagu albo znalezionego
albo nowoutworzonego i na końcu zwrócimy wszystkie identyfikatory.
Zauważ, że tego kodu nie ma dużo, mógłby on się znajdować w kontrolerze, ale
zdecydowanie lepiej jest go tutaj zapisać i mamy TagsParsingService. Teraz jeżeli
wrócimy do PostController, to będziemy mogli skorzystać i może
zróbmy sobie to tym miejscu use App Services i tutaj TagsParsingService. Dzięki
temu na tym etapie gdzie mieliśmy store, czyli jeżeli wiem
że jakiś tagi zostały przesłane to będziemy mogli identyfikatory tych
tagów pobrać. Stworzymy zatem zmienną tags i odwołam się TagsParsingService
i do jego metody statycznej parse, którą przed momentem utworzyliśmy. Przekażemy
jej tam przesłany ciąg, to nam zwróci identyfikatory,
czyli utworze wszystkie tagi jeśli trzeba, jeżeli nie trzeba to po prostu zwróci ich
identyfikatory i teraz kluczowa rzecz którą należy zrozumieć, w lekcji
poprzedniej pokazałem ci, że jeżeli mamy odwołanie do posta,
to możemy na nim wywołać tags i następnie attach, attach
pozwalało nam przypisać jakiś tag do danego wpisu, a detach pozwalało
nam go usunąć i to było odzwierciedlane oczywiście w tabeli w bazie danych
i teraz mamy jeszcze jedną metodę, która nazywa się sync i ona
dla nas tutaj jest kluczowa, więc odwołamy się do post, tags
i następnie sync. Ta metoda działa
tak, że jak jej przekażemy tablice gdzie będzie na przykład 1 i 2, to
oznacza, że przypiszę do tego wpisu tagi, które mają identyfikator
1 i 2 i wszystkie pozostałe usunie. Jeżeli
następnym razem byśmy zrobili na samo 1,a było tam 1 i 2 to
zostaje tylko jeden, dwujka zostanie usunięta, czyli to po prostu będzie odzwierciedlane
tutaj dokładnie, w tej tabeli. Zatem my już
tablice z identyfikatorami mamy, więc wystarczy
ją tutaj przekazać. Jeżeli to się wydaje skomplikowane,
na spokojnie to sobie prześledź, ale powinno nam to wszystko jak najbardziej zadziałać.
Okej widzę tylko teraz tutaj, że powinniśmy to zrobić troszkę w innym miejscu, bo odwołuje
się do posta, który nie istnieje, więc tutaj on dopiero Jest utworzony i sprawdzimy
czy zostały jakieś tagi przesłane. Okej, więc jeżeli tutaj prześlemy,
tak jak widzimy typo stule i test to powinno być okej, natomiast
jesteśmy tutaj w edycji, a ja póki co dodałem to do metody store. Trochę
tutaj powtórzonego kody już jest, można było pomyśleć również o jakimś serwisie w
którym można byłoby to zawrzeć. Ale zostawmy to razie w tym
miejscu, mamy post update i zrobimy rzecz następującą tak samo jak wyżej. Zatem
ten wpis nie ma przepisanych żadnych tag'ów, bo widzimy, że ta tabela jest pusta, nic tutaj się
zupełnie nie znajduje. Spróbujemy zrobić update. Jak
widzimy Post has been updated, czyli wydaje się że wszystko jest okej i po odświeżeniu tej
tabeli już jest tak jak być powinno. Zatem post miał identyfikator
1 i przypisaliśmy do niego tag o identyfikatorze 1 2
i 3. Te tag'i oczywiście zostały utworzone, oprócz tego test, bo on już był. Tak
dokładnie to będzie wyglądać, jak widzisz, te tag'i zostały
tutaj poprawnie utworzone, więc teraz jeżeli będziemy chcieli coś zmienić zresztą te tag'i
jeszcze tutaj musimy wyświetlić, a więc zrobimy coś takiego i prześlemy
update, odświeżmy tutaj, oczywiście w
tabeli tags nic się nie zmienia, żadnego tagu nie usunęliśmy, ale w tej tabeli
już zostało to odzwierciedlone właśnie dzięki metodzie sync czyli tylko te
tagi, które zostały przesłane zostały przypisane do tego właśnie wpisu i
teraz na tym wpisie jeżeli byśmy sobie skorzystali z
post i strzałeczka tags, to wszystkie te tagi będą
dla nas widoczne, okej. Zróbmy sobie w tej lekcji jeszcze jedną rzecz, mianowicie tutaj chciałbym
te tagi móc również wyświetlać. Czyli jeżeli przyjdziemy sobie to edit
to powinniśmy te tagi w odpowiedni sposób tutaj wyświetlać. Te
tagi które będą zwrócone z posts tags, to jest kolekcja i kolekcja
w laravel ma taką metodę jak implode, czyli możemy kolekcję
złączyć. Musimy tutaj
powiedzieć na jakim atrybucie, czyli name i następnie
w jaki sposób chcemy złączyć, chciałbym to złączyć po prostu spacją. Sprawdźmy czy
to zadziała, oczywiście tak mamy typo i style możemy
teraz dodać tutaj test i zapisać. To wszystko tutaj się odzwierciedliło i
oprócz tego, że się odzwierciedliło to oczywiście również jest tutaj i dzięki
temu za chwilkę w kolejnej lekcji będziemy mogli to wyświetlić na stronie. Jak
zatem zobaczyłeś tej lekcji czasami warto do osobnego pliku do takiego
serwisu sobie coś wyrzucić. Jak widzisz również tutaj możesz praktycznie
dowolnie tworzyć sobie tą strukturę, jeżeli tylko nie będziesz nadpisywał jakiś katalogów, które tutaj
się mogą pojawić dlatego że pewne komendy artisan generują tutaj jakieś katalogi,
ale services jak najbardziej dobrze jest sobie tutaj wstawić
i ja zawsze jakąś dodatkową logikę do takich serwisów wyrzucam później
importuje i z nich korzystam.
Pole z tagami · 1 min
<div class="form-fieldset">
<label class="form-label">Tags:</label>
<input class="form-field{{ $errors->has('tags') ? ' is-invalid' : '' }}" type="text" name="tags" value="{{ $post->tags->implode('name', ' ') }}">
</div>Pole z tagami · 1 min
<div class="form-fieldset">
<label class="form-label">Tags:</label>
<input class="form-field{{ $errors->has('tags') ? ' is-invalid' : '' }}" type="text" name="tags" value="{{ $post->tags->implode('name', ' ') }}">
</div>Pole z tagami · 1 min
<div class="form-fieldset">
<label class="form-label">Tags:</label>
<input class="form-field{{ $errors->has('tags') ? ' is-invalid' : '' }}" type="text" name="tags" value="{{ $post->tags->implode('name', ' ') }}">
</div>