Jak stworzyć CRUD w Laravel?

by admin 1 Comment
Jak stworzyć CRUD w Laravel?

Co to jest ten CRUD? W tym wpisie dowiesz się jak jesteś w stanie stworzyć swój pierwszy lub kolejny crud w Laravelu. W rozwijając skrót to (Create, Read, Update, Delete), czyli po polsku pozwalamy użytkownikowi w naszej aplikacji zapisać, odczytać zaktualizować oraz usunąć dane.

Inicjalizacja projektu

Zachęcam Ciebie do przejrzenia poprzedniego mojego wpisu gdzie pokazywałem Jak działa observer w Laravel? to jest kontynuacja tego cyklu. W tym wpisie stworzyłem model Product oraz jego kontroler, a także pokazałem działanie obserwera. Tutaj znajduje się kod projektu, a tutaj link do stanu aplikacji z poprzedniego wpisu.

Tworzymy CRUD Produktu

CRUDy w Laravelu tworzymy w kontrolerach, aby zachować czystość kodu przyjmuje się nazewnictwo NazwaModelu+Controller np. ProductController. Kontrollery tworzymy za pomocą komendy:

php artisan make:controller NAZWAKONTROLLERA

Utwórzmy kontroller ProductController. W konsoli powinien pojawić się komunikat: “Controller created successfully.”

php artisan make:controller ProductController

Nasz kontroler powinien utworzyć się w ścieżce app\Http\Controllers\ProductController.php. Jeśli użyjemy parametru -r lub -resource, to powstanie nam kompleksowy crud, z gotowymi wygenerowanymi metodami w kontrolerze do użycia:

php artisan make:controller ProductController -r

W nasz plik kontrolera powinien wyglądać w taki sposób:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProductController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

Samo uzupełnienie metod, co zrobimy później nie wystarczy. Laravel sam w sobie wykorzystuje wzorzec architektoniczny MVC (model, view, controller), na schemacie wygląda to następująco:

obrazek jak działa wzorzec MVC
  • Model – czyli logika naszej aplikacji
  • Kontroler – przetwarza dane od użytkownika pełni “pośrednika” pomiędzy modelem a kontrolerem
  • Widok – zwrócenie danych do użytkownika.

Z racji tego że tworzymy api naszej aplikacji w pliku routes/api.php dodamy odniesienie do naszego kontrollera, a następnie zwrócenie danych z kontrollera. Możemy się odnosić do endpointów następująco w taki sposób co robiliśmy w poprzednim wpisie:

Route::post('product','ProductController@store');

Warto postawić na minimalizm i wykorzystać Route::resource

Route::resource('products','ProductController');

Dlaczego w tym przypadku warto postawić na ten zapis. Mamy już z góry określone ścieżki, typy requestów, nazwy metod w kontrolerach oraz nazwy ścieżek. Więcej możesz przeczytać w dokumentacji w rozdziale o kontrolerach.

Jeśli chcesz sprawdzić ścieżki w swojej aplikacji możesz użyć do tego komendy:

php artisan route:list

Uzupełnianie metod

Teraz w końcu zajmiemy się częścią uzupełniania metod w naszej aplikacji.

Listowanie produktów

Wyświetlmy wszystkie nasze produkty użytkownikowi na ekran, w późniejszym czasie bardziej rozbudujemy ten kontroler m.in. o paginację czy filtrowanie.

W moim przypadku wywołanie metody GET na adresie http://localhost/laravel-observer/public/api/products spowoduje wyświetlenie wszystkich produktów.

/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$products = Product::all();
return response()->json($products);
}
crud listowanie produktów

Tworzenie produktu

Tą część realizowaliśmy w poprzednim wpisie, ale przypomnijmy sobie jeszcze raz jak stworzyć produkt:

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$product = new Product([
'name' => $request->get('name'),
'price' => $request->get('price'),
'description' => $request->get('description'),
'active' => $request->get('active')
]);
$product->save();
return response()->json($product);
}

Pobieramy dane z requesta, tworzymy nowy model, następnie zapisujemy go i zwracamy model jsonem.

crud tworzenie produktu

Możliwe że zauważyłeś ale nasz observer nadal działa i nazwa produktu jest z dużych liter.

Wyświetlenie pojedynczego rekordu

Aby wyświetlić pojedynczy rekord należy się do niego odwołać po ID z bazy danych. Aby się odwołać do pierwszego produktu z bazy danych wykonam żądanie na adres: http://localhost/laravel-observer/public/api/products/1. Kolejny numerek oznacza kolejny rekord w bazie danych.

/**
 * Display the specified resource.
 *
 * @param Product $product
 * @return \Illuminate\Http\JsonResponse
 */
public function show(Product $product)
{
    return response()->json($product);
}

W argumencie metody show() użyliśmy dependency injection czyli bezpośrednie wstrzyknięcie zależności do metody. Polega ona na przekazaniu gotowych instancji obiektów, które przekazują swoje metody i właściwości obiektom, które z nich korzystają.

crud pokazania kontkretnego produktu

Edycja rekordu

Edycja jest chyba jednym z trudniejszych metod jeśli chodzi o przetwarzanie. Należy sprawdzić czy dany rekord istnieje w bazie, sprawdzić dane, zaktualizować dane.

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param Product $product
* @return \Illuminate\Http\JsonResponse
*/
public function update(Request $request, Product $product)
{
$product->name = $request->get('name');
$product->price = $request->get('price');
$product->description = $request->get('description');
$product->active = $request->get('active');
$product->save();
return response()->json($product);
}

UWAGA! Aby zaktualizować rekord należy użyć metody PUT.

crud aktualizacji produktu

Można zauważyć że dane podstawowe naszego produktu uległy zmianie. Nie możemy zaktualizować pól ID, created_at, pole updated_at samoczynnie się zaktualizuje.

Usuwanie rekordu

Chyba najprostsza rzecz znajdź rekord w bazie danych i go usuń robimy to w następujący sposób:

/**
 * Remove the specified resource from storage.
 *
 * @param Product $product
 * @return \Illuminate\Http\JsonResponse
 * @throws \Exception
 */
public function destroy(Product $product)
{
    $product->delete();
    return response()->json(['message' => 'Product deleted']);
}

Jeśli rekord zostanie usunięty zwróćmy informację że produkt został usunięty. Pamiętaj aby usunąć rekord należy użyć metody w requeście DELETE i podać id produktu który ma zostać usunięty.

crud usuwania produktu

Mamy już w pełni funkcjonalny CRUD, który pozwala na operację listowania, wyświetlenie szczegółów pojedynczego rekordu, tworzenia, edycji oraz usuwania rekordu. Należy zachować czystość w naszym kontrolerze usunąłem 2 metody create() oraz edit() które służą do wyświetlenia wbudowanych szablonów w laravelu, z racji że nie używamy tego, pozwoliłem sobie to usunąć. Nasz kontroler powinien wyglądać w następujący sposób:

<?php

namespace App\Http\Controllers;

use App\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$products = Product::all();
return response()->json($products);
}

/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$product = new Product([
'name' => $request->get('name'),
'price' => $request->get('price'),
'description' => $request->get('description'),
'active' => $request->get('active')
]);
$product->save();
return response()->json($product);
}

/**
* Display the specified resource.
*
* @param Product $product
* @return \Illuminate\Http\JsonResponse
*/
public function show(Product $product)
{
return response()->json($product);
}

/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param Product $product
* @return \Illuminate\Http\JsonResponse
*/
public function update(Request $request, Product $product)
{
$product->name = $request->get('name');
$product->price = $request->get('price');
$product->description = $request->get('description');
$product->active = $request->get('active');
$product->save();
return response()->json($product);
}

/**
* Remove the specified resource from storage.
*
* @param Product $product
* @return \Illuminate\Http\JsonResponse
* @throws \Exception
*/
public function destroy(Product $product)
{
$product->delete();
return response()->json(['message' => 'Product deleted']);
}
}

Kod źródłowy

  • Realizowany projekt: link
  • Wprowadzone zmiany: link
  • Stan projektu po zmianach: link

Comment ( 1 )

  1. Walidacja danych w Laravelu krok po kroku - Laravel Developer
    […] poprzednim wpisie Jak stworzyć CRUD w Laravel? stworzyliśmy wszelkie niezbędne metody aby wylistować wszystkie produkty a także wyświetlić […]

Leave a reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>