Aplikacja CRUD w Laravel 5

W dzisiejszym wpisie chciałbym opisać jak w prosty i szybki sposób stworzyć od podstaw aplikację typu CRUD w Laravel 5 i MySQL. Aplikacja będzie przechowywała listę książek, w tym tytuł, cenę, wydawcę i ilość stron. Przejdźmy do konkretów.

 1. Tworzymy bazę:

po czym tworzymy pierwszą i ostatnią tabelę:

 

Jak widzimy jest to prosta tabela reprezentująca książkę, a składająca się z pięciu pól: identyfikatora, tytułu, ilości stron, ceny, a także wydawcy. W celach testowych dodany został również jeden wpis książki o tytule ‚Hobbit’.

2. Za pomocą Composera (getcomposer.org) dodajemy nowy projekt:

W tym miejscu należy pamiętać o stworzeniu wirtualnych hostów dla naszej testowej aplikacji.

 3. Modyfikujemy plik library/config/database.php:

Modyfikacje dokonujemy również poprzez edycję plików z dostępami:

 

  1. Tworzymy model książki:

Dzięki tej instrukcji powstanie:

app/ Book.php:

  1. Tworzymy kontroler książki używając Artisana:

W ten sposób w katalogu app/Http/Controllers powstał plik BookController.php

Kontroler ten będzie miał za zadanie zarządzanie naszym systemem, przy czym widzimy, iż Artisan stworzył szablon kontrolera, który następnie będziemy sukcesywnie uzupełniać o kolejne linijki kodu.

  1. Dodajemy routing dla naszej aplikacji CRUD.

Laravel przechowuje wszystkie dane na temat routingu w pliku app/http/routes.php. Jeśli podejrzymy plik to zobaczymy:

W Laravelu ruting zorganizowany został w sposób jasny i klarowny. Odpowiedni wpis deklarujemy za pomocą funkcji odpowiadającej typowi żądania:
Route::typ_żądania(…)
np.
– Route::get(…) – żądania typu GET

– Route::post(..) – żądania typu POST

– Route::any(…) – żądanie dowolnego typu

– Route::get(‚user/{id}’, function($id)}); – żądanie z parametrem ID

– Route::get(‚user/{id?}’, function($id)}); – żądanie z opcjonalnym parametrem ID

W żądaniach można również swobodnie korzystać z wyrażeń regularnych.

W pierwszej kolejności chcielibyśmy w naszym systemie wyświetlić listę książek, także użyjemy metody GET, dodatkowo zdefiniujmy metody do dodawania, edytowania, aktualizowania i usuwania książek, tak będzie prezentował się cały plik routes.php:

 

Nasz pierwszy wpis

Route::get(‚books’, ‚BookController@index’);

oznacza, iż ‚books’ zostanie zmapowane do kontrolera ‚BookController’ i metody ‚index’. Do pozostałych wpisów wrócimy w dalszej części kursu.

 

  1. Przechodzimy więc do naszego kontrolera app/http/BookController.php na samej górze dodajemy wpis modelu książki:

i odpowiednio modyfikujemy metodę index:

W powyższej metodzie za pomocą metody all() obiektu Eloquent pobraliśmy wszystkie książki i przypisaliśmy je do zmiennej ‚booksList’. Następnie zwróciliśmy obiekt widoku o parametrze pierwszym równym adresowi widoku (w naszym przypadku będzie to resources/views/books/list.blade.php) a także przekazujemy do tego obiektu listę książek w postaci obiektu booksList.

 8. W tym kroku musimy stworzyć widok wyświetlający listę książek. Najpierw stwórzmy jednak szablon naszej strony, nasz główny template:

app/resources/views/template.blade.php:

Nasz szablon korzysta z systemu dołączonego do Laravela o nazwie „Blade”. Wszystkie pliki korzystające z instrukcji Blade powinny kończyć się na *.blade.php. Jak widzimy na przykładowym kodzie Blade jest ciekawym silnikiem umożliwiającym szybkie i czyste zarządzanie kodem widoków. Powyższy kod za pomocą instrukcji IF sprawdza, czy w sesji nie ma zapisanej żadnej wiadomości dla użytkownika. Jeśli tak to oczywiście wyświetla ją. Instrukcja definiująca miejsce umieszczenia właściwej części strony dynamicznie się zmieniającej to oczywiście @yeild(‚content’). Jak się łatwo domyślić, nazwa ‚content’ to etykieta identyfikująca dany obszar przeznaczony na główną treść widoku.

  1. Kolejny krok to stworzenie pojedynczego widoku listy książek. W tym celu tworzymy plik resources/views/books/list.blade.php o następującej treści:

 

Pierwsza linia to oczywiste odwołanie do katalogu wyżej i pliku z naszym szablonem. W drugiej linii definiujemy start sekcji ‚content’. Sekcja kończy się w ostatniej linijce pliku instrukcją ‚@stop’. W ciele sekcji definiujemy znacznik odnośnika z adresem do kontrolera BookController i metody create – będzie to odnośnik służący do dodania nowej pozycji (jak widzimy w sekcji adresu podaliśmy tą samą wartość zdefiniowaną w naszym pliku routes.php).

W kolejnych linijkach sprawdzamy czy podany do widoku obiekt nie jest pusty (czy nie zawiera żadnych wpisów). W takim wypadku wyświetlany jest stosowny komunikat, w przeciwnym wyświetlana zostanie lista książek utworzona za pomocą pętli foreach iterującej po każdym elemencie listy. Obok każdej książki tworzymy sparametryzowany odnośnik do opcji usunięcia lub edycji książki:

Jeśli teraz uruchomimy przeglądarkę internetową i spróbujemy uruchomić efekty naszej pracy to pod adresem:

[nazwaserwera]/books

powinniśmy ujrzeć:

Image1

  1. Kolejny krok to stworzenie widoku i funkcjonalności dodawania nowej książki.
    Jako, że odpowiedni routing mamy już ustawiony (wpis:

) wystarczy teraz uzupełnić metodę ‚create()’ klasy BookController:

(metoda ta ma za zadanie jedynie zwrócenie widoku o nazwie ‚books.create’), a następnie dodać widok create.blade.php:

resources/views/books/create.blade.php

Podobnie jak w przypadku pierwszego widoku tak i tu musimy zadeklarować szablon, do którego przypiszemy widok, a także samą treść pojedynczej strony. Jako miejsce docelowe formularza dodajemy adres:

‚BookController@store’ wcześniej zdefiniowany w pliku routes.php. Warto również zwrócić uwagę na linijkę:

<input type=”hidden” name=”_token” value=”{{{ csrf_token() }}}” />

Jako, że używamy natywnych kontrolek HTMLowych Laravel wymaga by w formularzu przesyłać również token CSRF – co też za pomocą ukrytego pola czynimy.

Jeśli uruchomimy teraz adres serwer/books/create powinniśmy ujrzeć poniższy formularz:

Image2

  1. W kolejnym kroku musimy dane pobrane z formularza zapisać w bazie. W tym celu po raz kolejny edytujemy kontoler BookController i metodę ‚store’:

Cóż ta metoda robi? Przede wszystkim tworzy nowy obiekt książki, następnie przypisuje do jej pól wartości pobrane z formularza uzyskane poprzez odwołanie do obiektu żądania i metody ‚input’. W ostatnim kroku obiekt książki zapisuje zmiany a aplikacja przenosi użytkownika do karty listy książek.

 12. W kolejnym kroku zajmiemy się edytowaniem książek. W tym celu tworzymy no widok edycji:

/resources/views/books/edit.blade.php

Widzimy, że widok ten niewiele różni się od widoku dodawania nowej książki. Jedyne istotne zmiany to:

– zmiana skryptu docelowego formularza, tutaj użyliśmy metody ‚update’ kontrolera ‚BookController’. Używamy przy tym routingu zdefiniowanego wcześniej w routes.php

Sama metoda update prezentuje się następująco (w pierwszej linii jej działanie sprowadza się do odnalezienia książki na podstawie id pobranego z formularza, następnie do pól książki przypisywane są wartości pobrane z pól formularza, obiekt książki jest zapisywany – a na samym końcu wykonywane jest przekierowanie do spisu książek):

/app/Http/Controllers/BookController.php:metoda update()

– do każdej formatki HTMLowej dodana została wartość dla danego pola edytowanego przedmiotu

No dobrze, mamy już zrobioną obsługę formularza edycji, a także sam wygląd formularza. Stwórzmy teraz kod obsługujący jego wyświetlenie. Posłuży do tego metoda edit($id) kontrolera Book:

/app/Http/Controllers/BookController.php:metoda edit()

Metoda ta jest trywialnie prosta, za argument przyjmuje identyfikator książki, po czym w pierwszej linii pobiera z bazy książkę na podstawie ów ID, po czym przekazuję ją do widoku edycji. Warto dodać, iż również ten kontroler ma zdefiniowany swój własny routing w pliku routes.php.

Tak stworzona funkcjonalność powinna działać poprawnie – czyli wyświetlać formularz, a następnie go pozytywnie zapisać.

Image3

  1. Ostatnim elementem naszej aplikacji książek będzie opcja usunięcia książki. W tym celu stworzony został sparametryzowany przycisk „Delete”. Zgodnie z naszą tabelą routingu (plik routes.php), za usuwanie odpowiadać będzie metodą destroy ($id) kontrolera Book:

Jak widać, metoda ta pobiera id książki, odnajduje ją w bazie, po czym przy pomocy instrukcji delete() usuwa ją z dostępnych rekordów.

Tak oto stworzyliśmy w pełni działającą aplikację CRUD w Laravelu 5. Jest to niezwykle ciekawy framework, zdobywający przy tym co raz większą popularność.

Oczywiście powyższy przykład to minimalny start do frameworka. Wiele aspektów można poprawić (oddzielny katalog dla modeli, użycie Dependency Injection), ale na początek myślę, ze to wystarczy.

Zachęcam do zgłębienia tematu i obserwowania kolejnych wpisów, gdyż takie o Laravelu na pewno się jeszcze pokażą.

 

Kod źródłowy aplikacji: library

Baza: library

6 thoughts on “Aplikacja CRUD w Laravel 5

  1. Szaleństwo 🙂 Nie sądziłem, że tak łatwo i szybko można coś stworzyć. Bardzo pomocny opis. Pozdrawiam. 🙂

  2. Krok 5: Jakim cudem powstal plik BookController.php skoro zostala wywolana komenda: „php artisan make:controller BooksController”? Ma byc Book? czy Books?

    Krok 8: Jest napisane, ze template ma byc stworzony w „app/resources/template.blade.php”… moze chodzilo o „app/resources/views/template.blade.php”?

    Kurs bardzo fajny, ale duzo drobnych bledow ktore uniemozliwiaja uruchomienie aplikacji :/
    Wyglada jakby autor pisal kod z glowy, a sam nie przetestowal czy to dziala.
    Wykonujac kroki 1-9 nie jestem w stanie uruchomic widoku „server/books”

    1. Tak, ma Pan rację. Dziękuję za wskazanie nieścisłości, poprawki już zostały naniesione. Żeby rozwiać resztę wątpliwości zamieszczam kod źródłowy na końcu wpisu. Dziękuję za konstruktywny komentarz!

  3. Witam.

    Przeglądając bloga oraz szukając pewnych informacji w internecie. Próbuje znaleźć powiązania między Laravel a Angular. Czy te dwa frameworki da się się wspólnie połączyć, oczywiście nie na siłę, ale jako harmonijna współpraca między nimi? Jest sens pracować przy projekcie na tych dwóch frameworkach?

    1. Witam,
      oczywiście, te dwa frameworki nie dość, że da się połączyć, to nawet należy to robić.

      Laravel świetnie nadaje się jako część serwerowa, backend, który udostępnia pewne API, czyli pewien zakres funkcjonalności, gdzie formatem danych będzie np. JSON.

      Takie API może być wykorzystane właśnie przez Angulara do stworzenia logiki frontendu strony www. Proszę zauważyć ile to przyniesie korzyści – w momencie gdy będzie potrzeba napisania do naszego systemu aplikacji mobilnej (oprócz istniejącej strony www w Angularze) – wystarczy połączyć się z nią z pomocą istniejącego API.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.