Laravel is an excellent PHP framework for web development. It creates a RESTful web app with just a few commands. The procedures are shown as the following steps:
1. Create a New Project
$> laravel new laravel_product
Crafting application...
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 86 installs, 0 updates, 0 removals
- Installing doctrine/inflector (v1.3.0): Loading from cache
- Installing doctrine/lexer (v1.0.1): Loading from cache
- Installing dragonmantank/cron-expression (v2.2.0):
:
:
Package manifest generated successfully.
Application ready! Build something amazing.
After creating a new project named 'laravel_product', the files needed have been created under the directory.
$> cd laravel_product
$> php artisan -v
Laravel Framework 5.7.19
Edit .env file
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_product
DB_USERNAME=xxxx
DB_PASSWORD=xxxx
Add a database in MySQL server
Add a database manually by using Sequel Pro and following parameters.
- Database Name: laravel_product
- Database Encoding: UTF-8 Unicode (utf8mb4)
- Database Collation: Default (utf8mb4_general_ci)
Create tables
$> php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
3: Create a Model 'Product' and a Migration File.
$> php artisan make:model Product -m
Model created successfully.
Created Migration: 2018_12_26_181923_create_products_table
Edit migration file 2018_12_26_181923_create_products_table.php
Insert fields between id
and timestamps
:
$table->increments('id');
:
$table->string('prod_name');
$table->text('prod_desc');
$table->integer('prod_price');
$table->integer('prod_qty');
:
$table->timestamps();
Create table 'products'
$> php artisan migrate
Migrating: 2018_12_26_181923_create_products_table
Migrated: 2018_12_26_181923_create_products_table
Add the fillable property inside Product.php
file.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model {
protected $fillable = [
'prod_name',
'prod_desc',
'prod_price',
'prod_qty'
];
}
4: Create Routes and Controller
Create ProductController.php
Use following command to create controller.
- php artisan make:controller
$> php artisan make:controller ProductController --resource
Controller created successfully.
Add routes code in /routes/web.php
file.
Route::resource('products', 'ProductController');
Show routes
$> php artisan route:list
+-----------+-------------------------+------------------+-----------+
| Method | URI | Name | Action |
+-----------+-------------------------+------------------+-----------+
| GET|HEAD | / | | Closure |
| GET|HEAD | api/user | | Closure |
| GET|HEAD | products | products.index | *@index |
| POST | products | products.store | *@store |
| GET|HEAD | products/create | products.create | *@create |
| GET|HEAD | products/{product} | products.show | *@show |
| PUT|PATCH | products/{product} | products.update | *@update |
| DELETE | products/{product} | products.destroy | *@destroy |
| GET|HEAD | products/{product}/edit | products.edit | *@edit |
+-----------+-------------------------+------------------+-----------+
* = App\Http\Controllers\ProductController
5: Create the views
a. Create a file layout.blade.php
inside '/resources/views' folder.
b. Create a folder 'products' inside '/resources/views' folder.
c. Then, create the following three files inside '/resource/view/products'.
- create.blade.php
- edit.blade.php
- index.blade.php
d. Edit layout.blade.php
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatiable" content="ie=edge">
<title>Laravel 5.7 A simple CRUD Example</title>
<link href="{{ asset('css/app.css') }}" rel="stylesheet" type="text/css">
</head>
<body>
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="{{ route('products.index') }}">
A Laravel CRUD Sample</a>
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="{{ route('products.create') }}">
Add A Product
<span class="sr-only">(current)</span></a>
</li>
</ul>
<form method="post" action="#" class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="text" placeholder="Search"
aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0"
type="submit">Search</button>
</form>
</div>
</nav>
<div class="container">
@yield('content')
</div>
<script src="{{ asset('js/app.js') }}"></script>
</body>
</html>
e. Edit create.blade.php
Remember to add @csrf
in the tag in order to have CSRF Protection.
<form method="post" action="{{ route('products.store') }}">
@csrf // must added.
:
</form>
create.blade.php
is as follows:
@extends('layout')
@section('content')
<div class="card uper">
<div class="card-header">
<h4>Add Product</h4>
</div>
<div class="card-body">
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
<button type="button" class="close" data-dismiss="alert"
aria-label="Close">
<span aria-hidden="true">×</span>
</button>
@endforeach
</ul>
</div><br/>
@endif
<form method="post" action="{{ route('products.store') }}">
@csrf
<div class="form-group">
<label for="prod_name">Product Name:</label>
<input type="text" class="form-control" name="prod_name"/>
</div>
<div class="form-group">
<label for="prod_desc">Product Description:</label>
<input type="text" class="form-control" name="prod_desc"/>
</div>
<div class="form-group">
<label for="prod_price">Product Price:</label>
<input type="text" class="form-control" name="prod_price"/>
</div>
<div class="form-group">
<label for="prod_qty">Product Quantity:</label>
<input type="text" class="form-control" name="prod_qty"/>
</div>
<button type="submit" class="btn btn-primary">Add</button>
<a href="{{ route('products.index') }}" class="btn btn-info">Back</a>
</form>
</div>
</div>
@endsection
f. Code 'create' function in ProductController.php
Remember to add use App\Product;
in the controller in order to use the Model 'Product'.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Product;
public function create()
{
return view('shares.create');
}
6: Save Data
Code the "store" function in the ProductController.php
public function store(Request $request)
{
$request->validate([
'prod_name' => 'required',
'prod_desc' => 'required',
'prod_price' => 'required|integer',
'prod_qty' => 'required|integer'
]);
$product = new Product([
'prod_name' => $request->get('prod_name'),
'prod_desc' => $request->get('prod_desc'),
'prod_price' => $request->get('prod_price'),
'prod_qty' => $request->get('prod_qty')
]);
$product->save();
return redirect('/products')->with('success','Product has been added!');
}
Add some testing data and save.
7: Display the data.
Code index.blade.php
@extends('layout')
@section('content')
<div class="uper">
@if(session()->get('success'))
<div class="alert alert-success">
{{ session()->get('success') }}
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div><br/>
@endif
</div>
<table class="table table-hover">
<thead>
<tr>
<td><b>ID</b></td>
<td><b>Product Name</b></td>
<td><b>Product Description</b></td>
<td><b>Product Price</b></td>
<td><b>Product Qty</b></td>
<td colspan="2"><b>Action</b></td>
</tr>
</thead>
<tbody>
@foreach($products as $product)
<tr>
<td>{{$product->id}}</td>
<td>{{$product->prod_name}}</td>
<td>{{$product->prod_desc}}</td>
<td>{{$product->prod_price}}</td>
<td>{{$product->prod_qty}}</td>
<td><a href="{{ route('products.edit', $product->id) }}"
class="btn btn-primary">Edit</a></td>
<td>
<form method="post" action="{{ route('products.destroy', $product->id) }}">
@method('DELETE')
@csrf
<button type="submit" class="btn btn-danger">Delete</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
<div class="pagination justify-content-center">
{{ $products->links() }}
</div>
@endsection
Code the "index" function in the ProductController.php
public function index()
{
$products = Product::all();
return view('products.index', compact('products'));
}
8: Edit and Update Data
Code the "edit" function in the ProductController.php
public function edit($id)
{
$product = Product::find($id);
return view('products.edit', compact('product'));
}
Code "edit.blade.php"
@extends('layout')
@section('content')
<div class="card uper">
<div class="card-header">
<h4>Edit Product</h4>
</div>
<div class="card-body">
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
<button type="button" class="close" data-dismiss="alert"
aria-label="Close">
<span aria-hidden="true">×</span>
</button>
@endforeach
</ul>
</div><br/>
@endif
<form method="post" action="{{ route('products.update', $product->id) }}">
@method('PATCH')
@csrf
<div class="form-group">
<label for="prod_name">Product Name</label>
<input type="text" class="form-control" name="prod_name"
value={{ $product->prod_name }} />
</div>
<div class="form-group">
<label for="prod_desc">Product Description</label>
<input type="text" class="form-control" name="prod_desc"
value={{ $product->prod_desc }} />
</div>
<div class="form-group">
<label for="prod_price">Product Price</label>
<input type="text" class="form-control" name="prod_price"
value={{ $product->prod_price }} />
</div>
<div class="form-group">
<label for="prod_qty">Product Qty</label>
<input type="text" class="form-control" name="prod_qty"
value={{ $product->prod_qty }} />
</div>
<button type="submit" class="btn btn-primary">Update</button>
</form>
</div>
</div>
@endsection
Code the "update" function in the ProductController.php
public function update(Request $request, $id)
{
$request->validate([
'prod_name' => 'required',
'prod_desc' => 'required',
'prod_price' => 'required|integer',
'prod_qty' => 'required|integer'
]);
$product = Product::find($id);
$product->prod_name = $request->get('prod_name');
$product->prod_desc = $request->get('prod_desc');
$product->prod_price = $request->get('prod_price');
$product->prod_qty = $request->get('prod_qty');
$product->save();
return redirect('/products')->with('success', 'Product has been updated!');
}
9: Delete the data
Code the "delete" function in ProductController.php
public function destroy($id)
{
$product = Product::find($id);
$product->delete();
return redirect('/products')->with('success', 'Product has been deleted!');
}
10: Start the CRUD web app.
Start the server:
$> php artisan serve
Go to "http://localhost:8000/products" and will see the product index page.
If it needs to have the pagination functionality, it's just as easy as doing two things.
Modify the 'index' function in ProductController.php
.
Just change
$products = Product::all();
to:
$products = Product::paginate(number);
Pagination links:
:
</table>
<div class="pagination justify-content-center">
{{ $products->links() }}
</div>
@endsection
That's all! Isn't it simple and easy!