Skip to main content

Laravel

Requirements

  • Ubuntu 24.04

  • PHP 8

    sudo apt install -y php8.3 php8.3-mysql
    
  • composer

    sudo apt install -y composer
    
  • mariadb

    sudo apt install -y mariadb-server
    

Example

  • Setup Apache2

    sudo vim /etc/apache2/apache2.conf
    
    # <Directory /var/www/Websites>
    #     Options Indexes FollowSymLinks
    #     AllowOverride All
    #     Require all granted
    # </Directory>
    
    sudo a2enmod rewrite
    sudo systemctl reload apache2
    
    # Create virtual host config file.
    sudo vim /etc/apache2/sites-available/shop.conf
    
    # <VirtualHost *:80>
    # 	  DocumentRoot /var/www/Websites/shop/public
    # </VirtualHost>
    
    sudo systemctl reload apache2
    
  • Create project

    cd /var/www/Websites/
    sudo -u www-data composer create-project laravel/laravel:10 shop
    
    cd /var/www/Websites/shop/
    
  • Edit environment variables

    # Create database user and database in advanced.
    # Set database basic information.
    sudo -u www-data vim .env
    sudo systemctl reload apache2
    
  • Create model (with migration) & controller

    # Create model with controller and migration.
    sudo -u www-data php artisan make:model -c -m Product
    
  • Define model

    sudo -u www-data vim app/Models/Product.php
    
    File Content
    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class Product extends Model
    {
      use HasFactory;
    
      protected $fillable = ['title', 'descript', 'price'];
    }
    
  • Define migration according to model

    sudo -u www-data vim database/migrations/2024_09_09_082148_create_products_table.php
    
    File Content
    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    return new class extends Migration
    {
      /**
       * Run the migrations.
       */
      public function up(): void
      {
        Schema::create('products', function (Blueprint $table) {
          $table->id();
          $table->text('title');
          $table->text('descript');
          $table->unsignedInteger('price');
          $table->timestamps();
        });
      }
    
      /**
       * Reverse the migrations.
       */
      public function down(): void
      {
        Schema::dropIfExists('products');
      }
    };
    
  • Do migrate to create table in database

    sudo -u www-data php artisan migrate
    sudo -u www-data php artisan migrate:status
    
  • Define controller

    sudo -u www-data vim app/Http/Controllers/ProductController.php
    
    File Content
    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use App\Models\Product;
    
    class ProductController extends Controller
    {
      public function index()
      {
        // Fetch all products from DB.
        $products = Product::all(); //fetch all products from DB
    
        return view('product.list', ['products' => $products]);
      }   
    
      public function create()
      {   
        return view('product.add');
      }   
    
      public function store(Request $request)
      {   
        $newPost = Product::create([
          'title' => $request->title,
          'short_notes' => $request->short_notes,
          'price' => $request->price
        ]);
    
        return redirect('product/' . $newPost->id . '/edit');
      }   
    
      public function show(Product $product)
      {   
        //
      }   
    
      public function edit(Product $product)
      {   
        return view('product.edit', [
          'product' => $product,
        ]);
      }   
    
      public function update(Request $request, Product $product)
      {   
        $product->update([
          'title' => $request->title,
          'short_notes' => $request->short_notes,
          'price' => $request->price
        ]);
    
        return redirect('product/' . $product->id . '/edit');
      }   
    
      public function destroy(Product $product)
      {   
        $product->delete();
        return redirect('product/');
      }
    }
    
  • Define view

    sudo -u www-data mkdir resources/views/product
    
    sudo -u www-data vim resources/views/product/list.blade.php
    
    File Content
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Product List</title>
        <link rel="stylesheet" href="{{ asset('css/app.css') }}">
    
        <style>
    
          table
          {
            border-collapse: collapse;
          }
    
          th, td
          {
            padding: 5px 10px;
            border: 1px solid #000000;
          }
    
        </style>
      </head>
      <body>
        <div class="container">
          <h1>Product List</h1>
    
          <a href="/products/create" class="btn btn-primary mb-3">Add New Product</a>
    
          @if ($products->isEmpty())
            <p>No content available.</p>
          @else
            <table class="table table-bordered">
              <thead>
                <tr>
                  <th>ID</th>
                  <th>Title</th>
                  <th>Description</th>
                  <th>Price</th>
                  <th>Actions</th>
                </tr>
              </thead>
                <tbody>
                  @foreach ($products as $product)
                    <tr>
                      <td>{{ $product->id }}</td>
                      <td>{{ $product->title }}</td>
                      <td>{{ $product->descript }}</td>
                      <td>{{ $product->price }}</td>
                      <td>
                        <a href="/products/{{ $product->id }}/edit" class="btn btn-warning btn-sm">Edit</a>
                        <form action="/products/{{ $product->id }}" method="POST" style="display:inline;">
                          @csrf
                          @method('DELETE')
                          <button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Are you sure you want to delete this product?')">Delete</button>
                        </form>
                      </td>
                    </tr>
                  @endforeach
                </tbody>
              </table>
          @endif
        </div>
      </body>
    </html>
    
  • Define router

    sudo -u www-data vim routes/web.php
    
    File Content
    <?php
    
    use Illuminate\Support\Facades\Route;
    use App\Http\Controllers\ProductController;
    
    /*
    |--------------------------------------------------------------------------
    | Web Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register web routes for your application. These
    | routes are loaded by the RouteServiceProvider and all of them will
    | be assigned to the "web" middleware group. Make something great!
    |
    */
    
    Route::get('/', function () { return view('welcome'); }); 
    Route::get('/products', [ProductController::class, 'index']);
    Route::get('/products/create', [ProductController::class, 'create']);
    Route::post('/products/create', [ProductController::class, 'store']);
    Route::get('/products/{id}', [ProductController::class, 'show']);
    Route::get('/products/{id}/edit', [ProductController::class, 'edit']);
    Route::put('/products/{id}', [ProductController::class, 'update']);
    Route::post('/products/{id}', [ProductController::class, 'destroy']);
    

Reference