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.

Hãy để lại thông tin, chúng tôi sẽ liên hệ lại bạn sớm nhất!!

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