LỘ TRÌNH HỌC LARAVEL TRONG 7 NGÀY

Ngày 1: Làm quen với Laravel & Cấu hình môi trường

1. Cài đặt và thiết lập môi trường

  • Cài đặt Laravel bằng Composer:
bash composer create-project --prefer-dist laravel/laravel laravel-demo
  • Cấu hình file .env:

Giả sử bạn dùng MySQL, bạn cần chỉnh sửa các dòng sau:

env

DB_CONNECTION=mysql

DB_HOST=127.0.0.1

DB_PORT=3306

DB_DATABASE=laravel_demo

DB_USERNAME=root

DB_PASSWORD=your_password

 

  • Hiểu về cấu trúc thư mục của Laravel:

Ví dụ:

  • app/Http/Controllers: chứa các controller.
  • routes/web.php: định nghĩa các route cho giao diện web.
  • resources/views: chứa các file view (Blade templates).

2. Routing & Controllers

  • Định nghĩa route:

Trong file routes/web.php:

php

Sao chépChỉnh sửa

Route::get('/', function () {

    return view('welcome');

});

 

Route::get('/hello', 'App\Http\Controllers\HelloController@index');

  • Tạo controller:

Tạo file app/Http/Controllers/HelloController.php:

php

Sao chépChỉnh sửa

<?php

 

namespace App\Http\Controllers;

 

use Illuminate\Http\Request;

 

class HelloController extends Controller

{

    public function index()

    {

        return "Hello from Laravel!";

    }

}

  • Ví dụ về Middleware:

Tạo middleware bằng lệnh:

bash

Sao chépChỉnh sửa

php artisan make:middleware CheckAge

Trong file app/Http/Middleware/CheckAge.php:

php

Sao chépChỉnh sửa

<?php

 

namespace App\Http\Middleware;

 

use Closure;

 

class CheckAge

{

    public function handle($request, Closure $next)

    {

        if ($request->age && $request->age < 18) {

            return redirect('home');

        }

        return $next($request);

    }

}

Sau đó, đăng ký middleware trong app/Http/Kernel.php hoặc gán cho route cụ thể:

php

Sao chépChỉnh sửa

Route::get('/restricted', 'App\Http\Controllers\RestrictedController@index')

     ->middleware('check.age');

 

Ngày 2: Blade Template & Eloquent ORM

1. Blade Template

  • Tạo layout cơ bản:

Tạo file resources/views/layouts/app.blade.php:

blade

Sao chépChỉnh sửa

<!DOCTYPE html>

<html>

<head>

    <title>Laravel Demo</title>

</head>

<body>

    <div class="container">

        @yield('content')

    </div>

</body>

</html>

  • Tạo view sử dụng layout:

Tạo file resources/views/home.blade.php:

blade

Sao chépChỉnh sửa

@extends('layouts.app')

 

@section('content')

    <h1>Chào mừng đến với Laravel Demo!</h1>

    <p>Đây là trang chủ.</p>

@endsection

  • Định nghĩa route để hiển thị view:

Trong routes/web.php:

php

Sao chépChỉnh sửa

Route::get('/home', function () {

    return view('home');

});

2. Eloquent ORM & Database

  • Tạo migration và model:

Giả sử bạn tạo model Product:

bash

Sao chépChỉnh sửa

php artisan make:model Product -m

File migration database/migrations/xxxx_xx_xx_create_products_table.php:

php

Sao chépChỉnh sửa

public function up()

{

    Schema::create('products', function (Blueprint $table) {

        $table->id();

        $table->string('name');

        $table->text('description')->nullable();

        $table->decimal('price', 8, 2);

        $table->timestamps();

    });

}

Chạy lệnh migrate:

bash

Sao chépChỉnh sửa

php artisan migrate

  • Sử dụng Eloquent để truy xuất dữ liệu:

Trong controller, ví dụ ProductController:

php

Sao chépChỉnh sửa

<?php

 

namespace App\Http\Controllers;

 

use App\Models\Product;

 

class ProductController extends Controller

{

    public function index()

    {

        $products = Product::all();

        return view('products.index', compact('products'));

    }

}

  • Tạo view hiển thị danh sách sản phẩm:

Tạo file resources/views/products/index.blade.php:

blade

Sao chépChỉnh sửa

@extends('layouts.app')

 

@section('content')

    <h1>Danh sách sản phẩm</h1>

    <ul>

        @foreach ($products as $product)

            <li>{{ $product->name }} - ${{ $product->price }}</li>

        @endforeach

    </ul>

@endsection

 

Ngày 3: Xây dựng ứng dụng CRUD hoàn chỉnh

1. CRUD cơ bản

  • Định nghĩa các route CRUD:

Trong routes/web.php:

php

Sao chépChỉnh sửa

Route::resource('products', 'App\Http\Controllers\ProductController');

  • Controller cho CRUD:

Tạo controller:

bash

Sao chépChỉnh sửa

php artisan make:controller ProductController --resource

Ví dụ, phương thức store:

php

Sao chépChỉnh sửa

public function store(Request $request)

{

    $request->validate([

        'name' => 'required',

        'price' => 'required|numeric',

    ]);

 

    Product::create($request->all());

 

    return redirect()->route('products.index')

                     ->with('success', 'Product created successfully.');

}

Chú ý: Cần khai báo mass assignment trong model Product:

php

Sao chépChỉnh sửa

protected $fillable = ['name', 'description', 'price'];

2. Xử lý Upload File

  • Tạo form upload file:

Trong file view (ví dụ: resources/views/products/create.blade.php):

blade

Sao chépChỉnh sửa

<form action="{{ route('products.store') }}" method="POST" enctype="multipart/form-data">

    @csrf

    <input type="text" name="name" placeholder="Tên sản phẩm" required>

    <input type="number" name="price" placeholder="Giá" required>

    <input type="file" name="image">

    <button type="submit">Tạo sản phẩm</button>

</form>

  • Xử lý upload trong Controller:

php

Sao chépChỉnh sửa

public function store(Request $request)

{

    $request->validate([

        'name' => 'required',

        'price' => 'required|numeric',

        'image' => 'nullable|image|max:2048',

    ]);

 

    $data = $request->all();

 

    if ($request->hasFile('image')) {

        $data['image'] = $request->file('image')->store('images', 'public');

    }

 

    Product::create($data);

 

    return redirect()->route('products.index')

                     ->with('success', 'Product created successfully.');

}

 

Ngày 4: Authentication & Authorization

1. Authentication

  • Cài đặt Laravel Breeze:

bash

Sao chépChỉnh sửa

composer require laravel/breeze --dev

php artisan breeze:install

npm install && npm run dev

php artisan migrate

Sau đó bạn có sẵn các route, controller và view cho đăng ký, đăng nhập, khôi phục mật khẩu.

2. Authorization bằng Policies

  • Tạo Policy:

bash

Sao chépChỉnh sửa

php artisan make:policy ProductPolicy --model=Product

Ví dụ, trong file app/Policies/ProductPolicy.php:

php

Sao chépChỉnh sửa

public function update(User $user, Product $product)

{

    // Chỉ admin mới được phép update

    return $user->is_admin;

}

  • Đăng ký Policy trong AuthServiceProvider:

php

Sao chépChỉnh sửa

protected $policies = [

    Product::class => ProductPolicy::class,

];

  • Sử dụng Policy trong Controller:

php

Sao chépChỉnh sửa

public function edit(Product $product)

{

    $this->authorize('update', $product);

    return view('products.edit', compact('product'));

}

3. Xác thực API với Laravel Sanctum

  • Cài đặt Sanctum:

bash

Sao chépChỉnh sửa

composer require laravel/sanctum

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

php artisan migrate

  • Cấu hình middleware trong config/sanctum.php và app/Http/Kernel.php.
  • Tạo API token cho người dùng:

php

Sao chépChỉnh sửa

$user = User::find(1);

$token = $user->createToken('api-token')->plainTextToken;

  • Sử dụng token để xác thực request API:

Trong route routes/api.php:

php

Sao chépChỉnh sửa

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {

    return $request->user();

});

Ngày 5: Job, Queue & Event

1. Jobs & Queues

  • Tạo một Job gửi email:

bash

Sao chépChỉnh sửa

php artisan make:job SendWelcomeEmail

Trong file app/Jobs/SendWelcomeEmail.php:

php

Sao chépChỉnh sửa

<?php

 

namespace App\Jobs;

 

use App\Models\User;

use Illuminate\Bus\Queueable;

use Illuminate\Contracts\Queue\ShouldQueue;

use Illuminate\Foundation\Bus\Dispatchable;

use Illuminate\Queue\InteractsWithQueue;

use Illuminate\Queue\SerializesModels;

use Illuminate\Support\Facades\Mail;

use App\Mail\WelcomeMail;

 

class SendWelcomeEmail implements ShouldQueue

{

    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

 

    protected $user;

 

    public function __construct(User $user)

    {

        $this->user = $user;

    }

 

    public function handle()

    {

        Mail::to($this->user->email)->send(new WelcomeMail($this->user));

    }

}

  • Dispatch Job:

Trong controller, ví dụ sau khi người dùng đăng ký:

php

Sao chépChỉnh sửa

use App\Jobs\SendWelcomeEmail;

 

// Sau khi tạo user

SendWelcomeEmail::dispatch($user);

2. Event & Listener

  • Tạo Event:

bash

Sao chépChỉnh sửa

php artisan make:event UserRegistered

Trong file app/Events/UserRegistered.php:

php

Sao chépChỉnh sửa

<?php

 

namespace App\Events;

 

use App\Models\User;

use Illuminate\Foundation\Events\Dispatchable;

use Illuminate\Queue\SerializesModels;

 

class UserRegistered

{

    use Dispatchable, SerializesModels;

 

    public $user;

 

    public function __construct(User $user)

    {

        $this->user = $user;

    }

}

  • Tạo Listener:

bash

Sao chépChỉnh sửa

php artisan make:listener SendWelcomeNotification --event=UserRegistered

Trong file app/Listeners/SendWelcomeNotification.php:

php

Sao chépChỉnh sửa

<?php

 

namespace App\Listeners;

 

use App\Events\UserRegistered;

use Illuminate\Contracts\Queue\ShouldQueue;

use Illuminate\Queue\InteractsWithQueue;

use App\Jobs\SendWelcomeEmail;

 

class SendWelcomeNotification implements ShouldQueue

{

    public function handle(UserRegistered $event)

    {

        // Sử dụng Job đã tạo ở trên để gửi email

        SendWelcomeEmail::dispatch($event->user);

    }

}

  • Đăng ký Event và Listener trong EventServiceProvider:

php

Sao chépChỉnh sửa

protected $listen = [

    \App\Events\UserRegistered::class => [

        \App\Listeners\SendWelcomeNotification::class,

    ],

];

Ngày 6: Bảo mật, Performance & API nâng cao

1. Bảo mật trong Laravel

  • CSRF Protection:
    Laravel tự động thêm token CSRF vào form. Ví dụ:

blade

Sao chépChỉnh sửa

<form action="/some-action" method="POST">

    @csrf

    <!-- Các input khác -->

</form>

  • Hash mật khẩu:

Trong model hoặc controller:

php

Sao chépChỉnh sửa

use Illuminate\Support\Facades\Hash;

 

$user->password = Hash::make($request->password);

2. Tối ưu hiệu suất với Cache

  • Cache dữ liệu:

Ví dụ, cache danh sách sản phẩm trong Controller:

php

Sao chépChỉnh sửa

use Illuminate\Support\Facades\Cache;

 

public function index()

{

    $products = Cache::remember('products.all', 60, function () {

        return Product::all();

    });

    return view('products.index', compact('products'));

}

  • Sử dụng Pagination để giảm tải:

php

Sao chépChỉnh sửa

public function index()

{

    $products = Product::paginate(10);

    return view('products.index', compact('products'));

}

3. API nâng cao

  • Viết API để quản lý sản phẩm:

Trong routes/api.php:

php

Sao chépChỉnh sửa

Route::middleware('auth:sanctum')->group(function () {

    Route::get('/products', [\App\Http\Controllers\Api\ProductController::class, 'index']);

    Route::get('/products/{id}', [\App\Http\Controllers\Api\ProductController::class, 'show']);

    Route::post('/products', [\App\Http\Controllers\Api\ProductController::class, 'store']);

    Route::put('/products/{id}', [\App\Http\Controllers\Api\ProductController::class, 'update']);

    Route::delete('/products/{id}', [\App\Http\Controllers\Api\ProductController::class, 'destroy']);

});

  • Ví dụ controller API:

Tạo file app/Http/Controllers/Api/ProductController.php:

php

Sao chépChỉnh sửa

<?php

 

namespace App\Http\Controllers\Api;

 

use App\Http\Controllers\Controller;

use App\Models\Product;

use Illuminate\Http\Request;

 

class ProductController extends Controller

{

    public function index()

    {

        return response()->json(Product::paginate(10));

    }

 

    public function show($id)

    {

        $product = Product::findOrFail($id);

        return response()->json($product);

    }

 

    public function store(Request $request)

    {

        $request->validate([

            'name'  => 'required',

            'price' => 'required|numeric',

        ]);

        $product = Product::create($request->all());

        return response()->json($product, 201);

    }

 

    public function update(Request $request, $id)

    {

        $product = Product::findOrFail($id);

        $product->update($request->all());

        return response()->json($product);

    }

 

    public function destroy($id)

    {

        Product::destroy($id);

        return response()->json(null, 204);

    }

}

 


 

Ngày 7: Triển khai & Hoàn thiện dự án

1. Triển khai ứng dụng Laravel lên server

  • Triển khai với Laravel Forge hoặc Docker:
    Đây là ví dụ sử dụng Docker.
  • Tạo file Dockerfile:

dockerfile

Sao chépChỉnh sửa

FROM php:8.1-fpm

 

RUN apt-get update && apt-get install -y \

    build-essential \

    libpng-dev \

    libjpeg-dev \

    libfreetype6-dev \

    libonig-dev \

    libxml2-dev \

    zip \

    unzip \

    git

 

# Cài đặt Composer

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

 

WORKDIR /var/www

 

COPY . /var/www

 

RUN composer install --no-dev --optimize-autoloader

 

CMD ["php-fpm"]

  • Tạo file docker-compose.yml:

yaml

Sao chépChỉnh sửa

version: '3.8'

services:

  app:

    build:

      context: .

    volumes:

      - ./:/var/www

    ports:

      - "9000:9000"

    depends_on:

      - db

 

  db:

    image: mysql:8.0

    environment:

      MYSQL_ROOT_PASSWORD: your_password

      MYSQL_DATABASE: laravel_demo

    ports:

      - "3306:3306"

Sau đó, chạy:

bash

Sao chépChỉnh sửa

docker-compose up -d

2. Viết test với PHPUnit

  • Tạo test:

Ví dụ, tạo file tests/Feature/ProductTest.php:

php

Sao chépChỉnh sửa

<?php

 

namespace Tests\Feature;

 

use Tests\TestCase;

use App\Models\Product;

use Illuminate\Foundation\Testing\RefreshDatabase;

 

class ProductTe

 

st extends TestCase

{

    use RefreshDatabase;

 

    public function test_product_can_be_created()

    {

        $response = $this->post('/products', [

            'name'  => 'Sản phẩm A',

            'price' => 100,

        ]);

 

        $response->assertRedirect('/products');

        $this->assertDatabaseHas('products', ['name' => 'Sản phẩm A']);

    }

}

  • Chạy test:

bash

Sao chépChỉnh sửa

php artisan test

3. Hoàn thiện dự án

  • Thêm tính năng bổ sung:

Ví dụ, tích hợp gửi email tự động khi có người dùng mới đăng ký hay export danh sách sản phẩm ra file Excel với package như Maatwebsite/Laravel-Excel.

KHÁCH HÀNG
LỰA CHỌN TGMSS

Partner Logo
Partner Logo
Partner Logo
Partner Logo
Partner Logo
Partner Logo
Partner Logo
Partner Logo
Partner Logo
Partner Logo

+100 doanh nghiệp khác