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:
- 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.
Tin tức liên quan
KHÁCH HÀNG
LỰA CHỌN TGMSS










và +100 doanh nghiệp khác