Routing
Author: | ADMIN |
---|
# Basic Routing
1. Khái niệm về Route
Route trong Laravel là cách bạn định nghĩa URL cho ứng dụng của mình. Route giúp bạn chỉ định URL nào sẽ gọi đến Controller nào hoặc thực hiện hành động gì.
2. Định nghĩa Route Cơ Bản
Tất cả các route của Laravel được định nghĩa trong các file nằm trong thư mục routes
. Các file này được tự động tải bởi App\Providers\RouteServiceProvider
của ứng dụng của bạn. Có bốn file route chính:
web.php
: Định nghĩa các route cho web application.api.php
: Định nghĩa các route cho API.console.php
: Định nghĩa các route cho console commands.channels.php
: Định nghĩa các route cho event broadcasting channels.
Định nghĩa route trong web.php
Dưới đây là một ví dụ đơn giản về cách định nghĩa một route trong file web.php
:
Route::get('/', function () {
return view('welcome');
});
Trong ví dụ trên:
Route::get('/')
: Định nghĩa một route sử dụng phương thức GET cho URL/
.function () { return view('welcome'); }
: Định nghĩa hành động sẽ thực hiện khi người dùng truy cập vào URL/
. Ở đây, Laravel sẽ trả về viewwelcome
.
3. Các Phương Thức Route
Laravel hỗ trợ nhiều phương thức HTTP khác nhau, bao gồm:
GET
: Dùng để truy xuất dữ liệu từ server.POST
: Dùng để gửi dữ liệu lên server.PUT
: Dùng để cập nhật dữ liệu trên server.PATCH
: Dùng để cập nhật một phần tài nguyên trên server. Tương tự nhưPUT
nhưng chỉ cập nhật các phần cụ thể của tài nguyên.DELETE
: Dùng để xóa dữ liệu từ server.OPTIONS
: Dùng để truy vấn các phương thức HTTP mà server hỗ trợ cho một URL cụ thể. Thường được sử dụng trong các ứng dụng RESTful API để kiểm tra các tùy chọn giao tiếp.
Ví dụ về các phương thức khác nhau:
Route::get('/products', function () {
return 'Get all products';
});
Route::post('/products', function () {
return 'Create a new product';
});
Route::put('/products/{id}', function ($id) {
return 'Update the product with ID ' . $id;
});
Route::patch('/products/{id}', function ($id) {
return 'Partially update the product with ID ' . $id;
});
Route::delete('/products/{id}', function ($id) {
return 'Delete the product with ID ' . $id;
});
Route::options('/products', function () {
return response()->json(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
});
4. Route với Tham Số
Bạn có thể định nghĩa route có tham số như sau:
Route::get('/user/{id}', function ($id) {
return 'User '.$id;
});
Trong ví dụ này, {id}
là một tham số động. Khi người dùng truy cập vào URL user/1
, Laravel sẽ gán giá trị 1
vào biến $id
và trả về User 1
.
5. Route Groups
Bạn có thể nhóm các route lại với nhau bằng cách sử dụng Route::group
. Điều này giúp bạn dễ dàng áp dụng middleware hoặc tiền tố URL cho một nhóm route.
Route::group(['prefix' => 'admin'], function () {
Route::get('/users', function () {
// Matches The "/admin/users" URL
});
Route::get('/settings', function () {
// Matches The "/admin/settings" URL
});
});
Trong ví dụ trên, tất cả các route trong nhóm này sẽ có tiền tố admin
.
6. Middleware
Middleware là các lớp trung gian mà HTTP request phải đi qua trước khi đến Controller. Bạn có thể áp dụng middleware cho route như sau:
Route::get('/profile', function () {
// Only authenticated users may enter...
})->middleware('auth');
Trong ví dụ này, middleware auth
sẽ kiểm tra xem người dùng có được xác thực hay không trước khi cho phép truy cập vào route /profile
.
Laravel cung cấp hai nhóm middleware chính cho các file route:
- web middleware group: Được áp dụng cho các route trong
routes/web.php
. Middleware nhóm này bao gồm các tính năng như:- Session state
- CSRF protection
- Cookie encryption
- ...
- api middleware group: Được áp dụng cho các route trong
routes/api.php
. Middleware nhóm này bao gồm các tính năng như:- Stateless (không trạng thái)
- Token-based authentication
- Rate limiting
- ...
7. CSRF Protection
Hãy nhớ rằng, bất kỳ biểu mẫu HTML nào trỏ tới các route sử dụng phương thức POST, PUT, PATCH, hoặc DELETE được định nghĩa trong file route web cần phải bao gồm trường token CSRF. Nếu không, yêu cầu sẽ bị từ chối. Bạn có thể đọc thêm về bảo vệ CSRF trong tài liệu CSRF:
<form method="POST" action="/profile">
@csrf
<!-- Các trường input khác -->
<button type="submit">Submit</button>
</form>
Việc bảo vệ CSRF rất quan trọng để ngăn chặn các tấn công giả mạo yêu cầu từ trang chéo, đảm bảo rằng các yêu cầu tới server đến từ nguồn đáng tin cậy.
8. Redirect Routes
Nếu bạn định nghĩa một route để chuyển hướng đến một URI khác, bạn có thể sử dụng phương thức Route::redirect
. Phương thức này cung cấp một cách tắt thuận tiện để bạn không phải định nghĩa một route hoặc controller đầy đủ cho việc thực hiện chuyển hướng đơn giản.
Ví dụ:
Route::redirect('/here', '/there');
Mặc định, Route::redirect
sẽ trả về mã trạng thái 302. Mã trạng thái 302 cho biết rằng tài nguyên đã được di chuyển tạm thời đến một vị trí mới.
Tuỳ Chỉnh Mã Trạng Thái
Bạn có thể tuỳ chỉnh mã trạng thái bằng cách sử dụng tham số thứ ba tùy chọn:
Route::redirect('/here', '/there', 301);
Trong ví dụ này, mã trạng thái 301 được sử dụng để chỉ ra rằng tài nguyên đã được di chuyển vĩnh viễn đến một vị trí mới.
Sử Dụng Route::permanentRedirect
Hoặc, bạn có thể sử dụng phương thức Route::permanentRedirect
để trả về mã trạng thái 301:
Route::permanentRedirect('/here', '/there');
9. The Route List
Lệnh Artisan route:list
là một công cụ mạnh mẽ giúp bạn dễ dàng xem tất cả các route đã được định nghĩa trong ứng dụng của bạn. Dưới đây là các cách sử dụng lệnh route:list
cùng với giải thích chi tiết:
Hiển Thị Danh Sách Các Route
Để xem tất cả các route được định nghĩa trong ứng dụng của bạn, bạn có thể sử dụng lệnh:
php artisan route:list
Lệnh này hiển thị một bảng tổng quan của tất cả các route trong ứng dụng, bao gồm các thông tin như phương thức HTTP, URI, tên route, và hành động (action) của route đó. Đây là cách nhanh chóng để bạn kiểm tra cấu hình các route hiện tại của ứng dụng.
Hiển Thị Middleware và Tên Các Nhóm Middleware
Mặc định, lệnh route:list
không hiển thị các middleware gán cho mỗi route. Để hiển thị các middleware và tên các nhóm middleware, bạn có thể sử dụng tùy chọn -v
:
php artisan route:list -v
Thêm -v
(verbose) vào lệnh sẽ hiển thị thêm các thông tin về các middleware áp dụng cho từng route. Nếu bạn muốn mở rộng thêm thông tin về các nhóm middleware, bạn có thể sử dụng -vv
:
php artisan route:list -vv
Tùy chọn -vv
cung cấp một cái nhìn chi tiết hơn về các nhóm middleware và các middleware cá nhân được gán cho các route, giúp bạn thấy rõ hơn cách các route được xử lý.
Hiển Thị Các Route Bắt Đầu Với Một URI Cụ Thể
Để chỉ hiển thị các route bắt đầu với một URI cụ thể, bạn có thể sử dụng tùy chọn --path
:
php artisan route:list --path=api
Thêm tùy chọn --path=api
sẽ lọc các route và chỉ hiển thị các route có URI bắt đầu bằng /api
. Đây là cách hữu ích để bạn chỉ xem các route liên quan đến API của bạn.
Ẩn Các Route Được Định Nghĩa Bởi Các Gói Thứ Ba
Để ẩn bất kỳ route nào được định nghĩa bởi các gói bên ngoài, bạn có thể sử dụng tùy chọn --except-vendor
:
php artisan route:list --except-vendor
Tùy chọn --except-vendor
sẽ loại bỏ các route đến từ các gói bên ngoài, giúp bạn tập trung vào các route được định nghĩa trong ứng dụng của bạn.
Chỉ Hiển Thị Các Route Được Định Nghĩa Bởi Các Gói Thứ Ba
Ngược lại, để chỉ hiển thị các route được định nghĩa bởi các gói bên ngoài, bạn có thể sử dụng tùy chọn --only-vendor
:
php artisan route:list --only-vendor
Tùy chọn --only-vendor
sẽ lọc các route và chỉ hiển thị các route đến từ các gói bên ngoài, giúp bạn xem xét các route của bên thứ ba mà không bị phân tâm bởi các route của ứng dụng của bạn.
Tóm Tắt Các Tùy Chọn Của route:list
php artisan route:list
: Hiển thị danh sách tất cả các route.php artisan route:list -v
: Hiển thị danh sách route kèm theo thông tin về middleware và nhóm middleware.php artisan route:list -vv
: Hiển thị thông tin chi tiết về middleware và nhóm middleware.php artisan route:list --path=api
: Hiển thị các route có URI bắt đầu bằng/api
.php artisan route:list --except-vendor
: Ẩn các route từ các gói bên ngoài.php artisan route:list --only-vendor
: Chỉ hiển thị các route từ các gói bên ngoài.
Tóm lại
Route là một phần không thể thiếu trong bất kỳ ứng dụng Laravel nào. Việc hiểu rõ và sử dụng thành thạo các route cơ bản sẽ giúp bạn xây dựng ứng dụng một cách hiệu quả và dễ dàng. Hy vọng bài viết này đã giúp bạn có cái nhìn tổng quan về hệ thống routing trong Laravel.
# Optional Parameters
Khi làm việc với các route trong Laravel, đôi khi bạn cần định nghĩa một tham số route mà không phải lúc nào cũng có mặt trong URI. Bạn có thể thực hiện điều này bằng cách đặt dấu ?
sau tên tham số và cung cấp một giá trị mặc định cho biến tương ứng trong route. Dưới đây là cách làm việc với tham số route tùy chọn, cùng với các ví dụ và giải thích chi tiết.
Route::get('/user/{name?}', function (?string $name = null) {
return $name;
});
Route::get('/user/{name?}', function (?string $name = 'John') {
return $name;
});
1. Ràng Buộc Định Dạng Tham Số Route
Dưới đây là tổng hợp các cách sử dụng ràng buộc biểu thức chính quy cho tham số route trong Laravel:
// Ràng buộc tham số phải chỉ chứa các ký tự chữ cái
Route::get('/user/{name}', function (string $name) {
// ...
})->where('name', '[A-Za-z]+');
// Ràng buộc tham số phải chỉ chứa các chữ số
Route::get('/user/{id}', function (string $id) {
// ...
})->where('id', '[0-9]+');
// Ràng buộc nhiều tham số với các biểu thức chính quy khác nhau
Route::get('/user/{id}/{name}', function (string $id, string $name) {
// ...
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
// Sử dụng các phương thức tiện ích để thêm ràng buộc
Route::get('/user/{id}/{name}', function (string $id, string $name) {
// ...
})->whereNumber('id')->whereAlpha('name');
Route::get('/user/{name}', function (string $name) {
// ...
})->whereAlphaNumeric('name');
Route::get('/user/{id}', function (string $id) {
// ...
})->whereUuid('id');
Route::get('/user/{id}', function (string $id) {
//
})->whereUlid('id');
Route::get('/category/{category}', function (string $category) {
// ...
})->whereIn('category', ['movie', 'song', 'painting']);
// Ràng buộc toàn cục cho tham số route
public function boot(): void
{
Route::pattern('id', '[0-9]+');
}
// Cho phép ký tự '/' trong giá trị tham số
Route::get('/search/{search}', function (string $search) {
return $search;
})->where('search', '.*');
# Route Naming
Trong Laravel, bạn có thể đặt tên cho các route để tiện lợi hơn trong việc tạo URL hoặc chuyển hướng. Điều này giúp quản lý và tham chiếu đến các route dễ dàng hơn. Dưới đây là cách sử dụng route được đặt tên và các ví dụ cụ thể.
1. Đặt Tên Cho Route
Bạn có thể đặt tên cho một route bằng cách sử dụng phương thức name
sau khi định nghĩa route.
Ví Dụ
Route::get('/user/profile', function () {
// ...
})->name('profile');
Giải Thích
->name('profile')
: Đặt tênprofile
cho route/user/profile
.
2. Đặt Tên Cho Route Trong Controller
Bạn cũng có thể đặt tên cho các route trỏ tới các action trong controller:
Ví Dụ
Route::get('/user/profile', [UserProfileController::class, 'show'])->name('profile');
Giải Thích
[UserProfileController::class, 'show']
: Định nghĩa route trỏ tới phương thứcshow
trong controllerUserProfileController
.->name('profile')
: Đặt tênprofile
cho route này.
3. Tạo URL Từ Route Được Đặt Tên
Sau khi đã đặt tên cho một route, bạn có thể sử dụng tên của route để tạo URL hoặc chuyển hướng bằng các hàm trợ giúp của Laravel như route
và redirect
.
Tạo URL
$url = route('profile');
// Chuyển hướng
return redirect()->route('profile');
return to_route('profile');
Giải Thích
route('profile')
: Tạo URL tới route có tênprofile
.redirect()->route('profile')
: Chuyển hướng tới route có tênprofile
.to_route('profile')
: Một cách khác để chuyển hướng tới route có tênprofile
.
4. Truyền Tham Số Cho Route Được Đặt Tên
Nếu route có các tham số, bạn có thể truyền các tham số này như một mảng đối số thứ hai cho hàm route
.
Ví Dụ
Route::get('/user/{id}/profile', function (string $id) {
// ...
})->name('profile');
$url = route('profile', ['id' => 1]);
Giải Thích
['id' => 1]
: Tham sốid
được truyền vào URL.
5. Thêm Tham Số Vào Query String
Nếu bạn truyền thêm các tham số vào mảng, các cặp key/value này sẽ tự động được thêm vào query string của URL.
Ví Dụ
Route::get('/user/{id}/profile', function (string $id) {
// ...
})->name('profile');
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
// Kết quả: /user/1/profile?photos=yes
Giải Thích
['id' => 1, 'photos' => 'yes']
: Tham sốphotos
được thêm vào query string của URL.
6. Thiết Lập Giá Trị Mặc Định Cho Tham Số URL
Bạn có thể thiết lập các giá trị mặc định cho tham số URL sử dụng phương thức URL::defaults
.
7. Kiểm Tra Route Hiện Tại
Bạn có thể kiểm tra xem request hiện tại có được định tuyến tới một route cụ thể hay không bằng phương thức named
trên một instance của Route. Điều này hữu ích khi làm việc với middleware.
Ví Dụ Trong Middleware
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
public function handle(Request $request, Closure $next): Response
{
if ($request->route()->named('profile')) {
// ...
}
return $next($request);
}
Giải Thích
$request->route()->named('profile')
: Kiểm tra nếu route hiện tại có tênprofile
.
# Route Caching
Khi triển khai ứng dụng Laravel lên môi trường sản xuất, bạn nên tận dụng khả năng cache route của Laravel để tăng tốc độ xử lý. Việc sử dụng cache route sẽ giảm đáng kể thời gian cần thiết để đăng ký tất cả các route của ứng dụng. Dưới đây là cách tạo và quản lý cache route trong Laravel.
1. Tạo Route Cache
Để tạo cache cho các route, bạn sử dụng lệnh Artisan route:cache
:
php artisan route:cache
Giải Thích
- Lệnh
php artisan route:cache
: Tạo một file cache chứa tất cả các route của ứng dụng. Sau khi lệnh này được thực thi, file cache sẽ được tải lên mỗi khi có yêu cầu đến ứng dụng, giúp tăng tốc độ xử lý route.
2. Lưu Ý Khi Sử Dụng Route Cache
Sau khi chạy lệnh route:cache
, file cache sẽ được tải mỗi khi có yêu cầu đến ứng dụng. Tuy nhiên, nếu bạn thêm hoặc thay đổi bất kỳ route nào, bạn cần tạo lại cache mới. Do đó, bạn chỉ nên chạy lệnh route:cache
trong quá trình triển khai (deployment) của dự án.
3. Xóa Route Cache
Nếu bạn cần xóa cache route, bạn có thể sử dụng lệnh Artisan route:clear
:
php artisan route:clear
Giải Thích
- Lệnh
php artisan route:clear
: Xóa bỏ file cache route hiện tại. Điều này hữu ích khi bạn muốn cập nhật route mà không cần tạo cache mới ngay lập tức.
Quy Trình Sử Dụng Route Cache Trong Deployment
- Triển khai ứng dụng lên môi trường sản xuất.
- Chạy lệnh
php artisan route:cache
để tạo file cache cho route. - Khi cần cập nhật hoặc thêm route mới, hãy chạy lệnh
php artisan route:clear
để xóa cache hiện tại và sau đó tạo lại cache bằng lệnhphp artisan route:cache
.
Ví Dụ Quy Trình Deployment
# Bước 1: Triển khai ứng dụng
# (Thực hiện các bước triển khai thông thường như kéo code mới, cài đặt dependency, v.v.)
# Bước 2: Tạo route cache
php artisan route:cache
# Sau khi thêm hoặc thay đổi route
# Bước 3: Xóa route cache hiện tại
php artisan route:clear
# Bước 4: Tạo lại route cache mới
php artisan route:cache
Tóm Tắt
Việc sử dụng cache route trong Laravel giúp cải thiện hiệu suất của ứng dụng khi triển khai lên môi trường sản xuất. Tuy nhiên, bạn cần nhớ rằng mỗi khi thay đổi hoặc thêm mới route, bạn phải xóa cache cũ và tạo lại cache mới. Điều này đảm bảo rằng ứng dụng của bạn luôn sử dụng các route mới nhất mà bạn đã định nghĩa.
# Tạo cache cho route php artisan route:cache # Xóa cache route hiện tại php artisan route:clear
Bằng cách tuân thủ quy trình trên, bạn sẽ có thể tận dụng tối đa hiệu quả của tính năng route cache trong Laravel, giúp ứng dụng của bạn hoạt động nhanh hơn và hiệu quả hơn.
Blade Basics
Author: | ADMIN |
---|
# Blade Basics
Blade là một công cụ tạo template (template engine) mạnh mẽ được tích hợp sẵn trong Laravel. Nó cho phép bạn sử dụng các cấu trúc điều khiển như if, for, while,... ngay trong các file template của bạn. Dưới đây là một số khái niệm cơ bản và ví dụ minh họa để bạn có thể bắt đầu sử dụng Blade.
1. Tạo Và Sử Dụng File Blade
Các file Blade có đuôi mở rộng là .blade.php
. Ví dụ, bạn có thể tạo một file Blade cho trang chủ của ứng dụng như sau:
<!-- resources/views/home.blade.php -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home Page</title>
</head>
<body>
<h1>Welcome to My Laravel Application</h1>
</body>
</html>
Để trả về view này từ một route, bạn có thể sử dụng phương thức view
của Laravel:
Route::get('/', function () {
return view('home');
});
2. Các Cấu Trúc Điều Khiển
If Statements
Blade hỗ trợ các cấu trúc điều khiển như if
, elseif
, else
, và endif
:
<!-- resources/views/home.blade.php -->
@if ($name == 'John')
<p>Hello, John!</p>
@elseif ($name == 'Jane')
<p>Hello, Jane!</p>
@else
<p>Hello, Stranger!</p>
@endif
Loops
Blade cũng hỗ trợ các cấu trúc lặp như for
, foreach
, forelse
, và while
:
<!-- resources/views/home.blade.php -->
@foreach ($users as $user)
<p>This is user {{ $user->name }}</p>
@endforeach
3. Echoing Data
Blade cung cấp cú pháp đơn giản để hiển thị dữ liệu từ các biến PHP:
<!-- resources/views/home.blade.php -->
<p>{{ $name }}</p>
<p>{{ $age }}</p>
Bạn cũng có thể sử dụng hàm @php
để nhúng mã PHP trực tiếp vào file Blade:
<!-- resources/views/home.blade.php -->
@php
$name = 'John';
@endphp
<p>{{ $name }}</p>
4. Escape HTML
Blade sẽ tự động escape các biến để bảo vệ ứng dụng của bạn khỏi các lỗ hổng XSS. Nếu bạn muốn hiển thị dữ liệu mà không escape, bạn có thể sử dụng cú pháp sau:
<!-- resources/views/home.blade.php -->
{!! $unescapedData !!}
5. Kế Thừa Layouts
Blade cung cấp cơ chế kế thừa layout giúp bạn tạo ra các template có cấu trúc lặp lại một cách dễ dàng.
Tạo Layout
<!-- resources/views/layouts/app.blade.php -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>@yield('title')</title>
</head>
<body>
<div class="container">
@yield('content')
</div>
</body>
</html>
Sử Dụng Layout
<!-- resources/views/home.blade.php -->
@extends('layouts.app')
@section('title', 'Home Page')
@section('content')
<h1>Welcome to My Laravel Application</h1>
@endsection
6. Bao Gồm Các View Con (Including Sub-Views)
Bạn có thể chia nhỏ view thành các phần nhỏ hơn và bao gồm chúng vào view chính:
<!-- resources/views/includes/header.blade.php -->
<header>
<h1>Header Content</h1>
</header>
<!-- resources/views/home.blade.php -->
@include('includes.header')
Hiển thị giá trị trong Blade
Author: | ADMIN |
---|
# Hiển Thị Biến Trong Blade
Trong Laravel Blade, việc hiển thị biến rất đơn giản và trực quan. Blade cung cấp cú pháp dễ đọc và sử dụng để nhúng các biến PHP vào trong HTML.
Cú Pháp Cơ Bản
Sử Dụng Cặp Dấu Ngoặc Nhanh {{ }}
Để hiển thị giá trị của một biến trong Blade, bạn chỉ cần sử dụng cặp dấu ngoặc nhanh {{ }}
.
Ví Dụ
Giả sử bạn có một biến $name
được truyền từ controller đến view:
public function show()
{
$name = 'John Doe';
return view('greeting', compact('name'));
}
Trong file view greeting.blade.php
, bạn có thể hiển thị giá trị của biến $name
như sau:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Greeting Page</title>
</head>
<body>
<h1>Hello, {{ $name }}!</h1>
</body>
</html>
Escape HTML Đầu Vào
Khi sử dụng cặp dấu ngoặc nhanh {{ }}
, Blade sẽ tự động escape (chuyển đổi các ký tự đặc biệt thành các thực thể HTML) để bảo vệ chống lại các cuộc tấn công XSS.
Ví Dụ
<?php $name = '<script>alert("XSS")</script>'; ?>
<h1>Hello, {{ $name }}!</h1>
Kết quả hiển thị sẽ là:
<h1>Hello, <script>alert("XSS")</script>!</h1>
Hiển Thị Biến Mà Không Escape HTML
Nếu bạn muốn hiển thị giá trị của biến mà không escape HTML, bạn có thể sử dụng cú pháp {!! !!}
.
<?php $name = '<strong>John Doe</strong>'; ?>
<h1>Hello, {!! $name !!}!</h1>
Kết quả hiển thị sẽ là:
<h1>Hello, <strong>John Doe</strong>!</h1>
Hiển Thị Các Giá Trị Mặc Định
Bạn có thể hiển thị các giá trị mặc định khi biến không tồn tại hoặc rỗng bằng cách sử dụng toán tử null coalescing ??
.
Ví Dụ
<h1>Hello, {{ $name ?? 'Guest' }}!</h1>
Nếu biến $name
không tồn tại hoặc có giá trị là null, chuỗi 'Guest'
sẽ được hiển thị.
Hiển Thị Mảng và Đối Tượng
Bạn có thể truy cập và hiển thị các phần tử của mảng hoặc thuộc tính của đối tượng một cách dễ dàng.
Ví Dụ Mảng
<?php $user = ['name' => 'John Doe', 'email' => 'john@example.com']; ?>
<h1>Name: {{ $user['name'] }}</h1>
<p>Email: {{ $user['email'] }}</p>
Ví Dụ Đối Tượng
<?php $user = (object) ['name' => 'John Doe', 'email' => 'john@example.com']; ?>
<h1>Name: {{ $user->name }}</h1>
<p>Email: {{ $user->email }}</p>
Tóm Tắt
- Cú pháp cơ bản: Sử dụng
{{ $variable }}
để hiển thị giá trị của biến và tự động escape HTML.- Không escape HTML: Sử dụng
{!! $variable !!}
để hiển thị giá trị của biến mà không escape HTML.- Giá trị mặc định: Sử dụng
{{ $variable ?? 'default' }}
để hiển thị giá trị mặc định khi biến không tồn tại hoặc rỗng.- Mảng và đối tượng: Truy cập và hiển thị các phần tử của mảng hoặc thuộc tính của đối tượng bằng cú pháp
{{ $array['key'] }}
và{{ $object->property }}
.Việc sử dụng các cú pháp này giúp bạn dễ dàng và an toàn khi hiển thị dữ liệu trong các view Blade của Laravel.
Layout: @include, @extends, @section, @yield
Author: | ADMIN |
---|
# @include, @extends, @section, và @yield
Laravel Blade cung cấp các từ khóa @include
, @extends
, @section
, và @yield
để giúp bạn tái sử dụng và tổ chức mã HTML một cách hiệu quả. Dưới đây là cách sử dụng từng từ khóa này với các ví dụ cụ thể.
@include
@include
cho phép bạn nhúng một view Blade khác vào trong view hiện tại. Đây là cách tuyệt vời để tái sử dụng các phần tử HTML như header, footer, hoặc sidebar.
Ví Dụ
Giả sử bạn có một view header.blade.php
:
<!-- resources/views/header.blade.php -->
<header>
<h1>My Website Header</h1>
</header>
Bạn có thể nhúng view này vào view chính của bạn như sau:
<!-- resources/views/welcome.blade.php -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome</title>
</head>
<body>
@include('header')
<div class="content">
<p>Welcome to the homepage!</p>
</div>
</body>
</html>
@extends
@extends
được sử dụng để chỉ định layout mà view hiện tại sẽ kế thừa. Layout này thường chứa các cấu trúc HTML cơ bản mà các view khác có thể sử dụng lại.
Ví Dụ
Giả sử bạn có một layout app.blade.php
:
<!-- resources/views/layouts/app.blade.php -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>@yield('title')</title>
</head>
<body>
@include('header')
<div class="content">
@yield('content')
</div>
@include('footer')
</body>
</html>
Trong view cụ thể của bạn, bạn có thể kế thừa layout này như sau:
<!-- resources/views/home.blade.php -->
@extends('layouts.app')
@section('title', 'Home Page')
@section('content')
<h2>Welcome to the Home Page</h2>
<p>This is the home page content.</p>
@endsection
@section và @yield
@section
được sử dụng để xác định nội dung mà view con sẽ cung cấp cho các vùng nội dung được định nghĩa trong layout bằng @yield
.
Ví Dụ
Trong layout app.blade.php
, bạn có thể có các vùng nội dung:
<!-- resources/views/layouts/app.blade.php -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>@yield('title')</title>
</head>
<body>
@include('header')
<div class="content">
@yield('content')
</div>
@include('footer')
</body>
</html>
Trong view con home.blade.php
, bạn có thể định nghĩa các phần nội dung cho các vùng đó:
<!-- resources/views/home.blade.php -->
@extends('layouts.app')
@section('title', 'Home Page')
@section('content')
<h2>Welcome to the Home Page</h2>
<p>This is the home page content.</p>
@endsection
Tóm Tắt
- @include: Nhúng một view Blade khác vào view hiện tại.
- @extends: Kế thừa layout từ một view khác.
- @section: Định nghĩa một phần nội dung trong view con.
- @yield: Đánh dấu vị trí mà nội dung của view con sẽ được chèn vào trong layout.
Việc sử dụng @include
, @extends
, @section
, và @yield
giúp bạn tổ chức mã nguồn của mình một cách rõ ràng và tái sử dụng được các phần tử giao diện, làm cho việc phát triển và bảo trì ứng dụng trở nên dễ dàng hơn.
Blade Components
Author: | ADMIN |
---|
# Blade Components
Laravel Blade Components cung cấp một cách tiện lợi để xây dựng các phần tử HTML tái sử dụng, giúp bạn tổ chức mã nguồn một cách rõ ràng và hiệu quả hơn. Blade Components cho phép bạn tách biệt logic và giao diện, giúp việc phát triển và bảo trì ứng dụng trở nên dễ dàng hơn.
1. Tạo Blade Components
Tạo Component Bằng Lệnh Artisan
Bạn có thể sử dụng lệnh Artisan để tạo một component:
php artisan make:component Alert
Lệnh này sẽ tạo hai file:
- Một class component tại
app/View/Components/Alert.php
- Một view Blade tại
resources/views/components/alert.blade.php
File Class Component
File: app/View/Components/Alert.php
<?php
namespace App\View\Components;
use Illuminate\View\Component;
class Alert extends Component
{
public $type;
/**
* Create a new component instance.
*
* @return void
*/
public function __construct($type)
{
$this->type = $type;
}
/**
* Get the view / contents that represent the component.
*
* @return \Illuminate\Contracts\View\View|\Closure|string
*/
public function render()
{
return view('components.alert');
}
}
File View Component
File: resources/views/components/alert.blade.php
<div class="alert alert-{{ $type }}">
{{ $slot }}
</div>
2. Sử Dụng Blade Components
Nhúng Component Trong View
Bạn có thể nhúng component trong view Blade bằng cú pháp <x-component-name>
:
File: resources/views/welcome.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome</title>
</head>
<body>
<x-alert type="success">
This is a success alert.
</x-alert>
<x-alert type="danger">
This is a danger alert.
</x-alert>
</body>
</html>
3. Truyền Dữ Liệu Cho Component
Bạn có thể truyền dữ liệu cho component thông qua các thuộc tính:
File: app/View/Components/Alert.php
public $type;
public function __construct($type)
{
$this->type = $type;
}
File: resources/views/components/alert.blade.php
<div class="alert alert-{{ $type }}">
{{ $slot }}
</div>
File: resources/views/welcome.blade.php
<x-alert type="success">
This is a success alert.
</x-alert>
<x-alert type="danger">
This is a danger alert.
</x-alert>
4. Slots
Slots cho phép bạn xác định các phần nội dung động trong component. Mặc định, tất cả nội dung được truyền vào component sẽ nằm trong biến $slot
.
Slots Mặc Định
File: resources/views/components/alert.blade.php
<div class="alert alert-{{ $type }}">
{{ $slot }}
</div>
File: resources/views/welcome.blade.php
<x-alert type="success">
This is a success alert.
</x-alert>
Named Slots
Bạn có thể tạo nhiều slots với tên khác nhau.
File: resources/views/components/alert.blade.php
<div class="alert alert-{{ $type }}">
<div class="alert-title">{{ $title }}</div>
{{ $slot }}
</div>
File: resources/views/welcome.blade.php
<x-alert type="success">
<x-slot name="title">
Success
</x-slot>
This is a success alert.
</x-alert>
5. Inline Components
Nếu component của bạn đơn giản và không yêu cầu logic phức tạp, bạn có thể sử dụng Inline Components mà không cần tạo file class riêng.
File: resources/views/components/button.blade.php
<button {{ $attributes->merge(['class' => 'btn btn-primary']) }}>
{{ $slot }}
</button>
File: resources/views/welcome.blade.php
<x-button>
Click Me
</x-button>
Tóm Tắt
- Tạo Component: Sử dụng lệnh Artisan để tạo component.
- Nhúng Component: Sử dụng cú pháp
<x-component-name>
để nhúng component trong view. - Truyền Dữ Liệu: Truyền dữ liệu cho component thông qua các thuộc tính.
- Slots: Sử dụng slots để xác định nội dung động trong component.
- Inline Components: Sử dụng Inline Components cho các component đơn giản.
Blade Components giúp mã nguồn của bạn trở nên sạch sẽ, dễ đọc và dễ bảo trì hơn. Việc tách biệt giao diện và logic giúp bạn tập trung vào từng khía cạnh riêng biệt của ứng dụng, làm cho quá trình phát triển trở nên hiệu quả hơn.
Route Resource and Resourceful Controllers
Author: | ADMIN |
---|
# Resource Controllers
Resource Controllers trong Laravel cung cấp một cách thuận tiện để xử lý các hành động CRUD (Create, Read, Update, Delete) cho các tài nguyên của bạn. Khi bạn tạo một Resource Controller, Laravel sẽ tự động tạo ra các phương thức xử lý các hành động CRUD tiêu chuẩn. Điều này giúp bạn giảm bớt việc phải viết mã thủ công cho các hành động lặp đi lặp lại.
1. Tạo Resource Controller
Để tạo một Resource Controller, bạn sử dụng lệnh Artisan sau:
php artisan make:controller UserController --resource
Lệnh này sẽ tạo ra một controller mới tên là UserController
với các phương thức mặc định cho các hành động CRUD. Đây là các phương thức được tạo ra:
index()
: Hiển thị danh sách tài nguyên.create()
: Hiển thị form để tạo tài nguyên mới.store()
: Lưu trữ tài nguyên mới vào cơ sở dữ liệu.show($id)
: Hiển thị chi tiết một tài nguyên cụ thể.edit($id)
: Hiển thị form để chỉnh sửa một tài nguyên cụ thể.update(Request $request, $id)
: Cập nhật tài nguyên cụ thể trong cơ sở dữ liệu.destroy($id)
: Xóa một tài nguyên cụ thể khỏi cơ sở dữ liệu.
2. Route Resource
Để định tuyến đến Resource Controller, bạn có thể sử dụng phương thức Route::resource
. Ví dụ:
use Illuminate\Support\Facades\Route;
Route::resource('users', UserController::class);
Lệnh này sẽ tự động tạo ra tất cả các tuyến đường cần thiết cho các hành động CRUD tương ứng với các phương thức trong UserController
.
# Actions Handled by Resource Controllers
Verb | URI | Action | Route Name |
GET | /photos |
index | photos.index |
GET | /photos/create |
create | photos.create |
POST | /photos |
store | photos.store |
GET | /photos/{photo} |
show | photos.show |
GET | /photos/{photo}/edit |
edit | photos.edit |
PUT/PATCH | /photos/{photo} |
update | photos.update |
DELETE | /photos/{photo} |
destroy | photos.destroy |
# Tùy Chỉnh Hành Vi Khi Model Không Tồn Tại với Phương Thức missing
Thường thì, một phản hồi HTTP 404 sẽ được tạo ra nếu một resource model không được tìm thấy. Tuy nhiên, bạn có thể tùy chỉnh hành vi này bằng cách gọi phương thức missing
khi xác định resource route của bạn. Phương thức missing chấp nhận một closure sẽ được gọi nếu một Model được ràng buộc một cách ngầm định không thể tìm thấy cho bất kỳ resource's routes nào:
use App\Http\Controllers\UserController;
use App\Models\User;
use Illuminate\Support\Facades\Route;
Route::resource('users', UserController::class)
->missing(function (Request $request) {
return response()->view('errors.custom', [], 404);
});
Trong ví dụ trên, nếu một mô hình User
không được tìm thấy khi truy cập bất kỳ tuyến đường tài nguyên nào của users
, Laravel sẽ trả về một view tùy chỉnh errors.custom
với mã trạng thái 404.
Trong Laravel, tính năng Soft Deletes cho phép bạn "xóa" các bản ghi khỏi cơ sở dữ liệu mà không thực sự xóa chúng. Thay vì bị xóa, một bản ghi sẽ được đánh dấu là đã xóa bằng cách thiết lập giá trị của cột deleted_at
thành thời điểm hiện tại. Điều này giúp bạn dễ dàng khôi phục các bản ghi đã bị xóa nếu cần thiết.
1. Thiết lập Soft Deletes cho một Model
Để sử dụng Soft Deletes, bạn cần làm theo các bước sau:
Thêm cột deleted_at
vào bảng
Bạn có thể sử dụng migration để thêm cột deleted_at
vào bảng của bạn:
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddDeletedAtToUsersTable extends Migration
{
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->softDeletes();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropSoftDeletes();
});
}
}
Sử dụng trait SoftDeletes
trong model
Bạn cần thêm trait SoftDeletes
vào model của bạn:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
}
2. Sử dụng Soft Deletes
Xóa mềm một bản ghi
Để xóa mềm một bản ghi, bạn chỉ cần gọi phương thức delete
:
$user = User::find(1);
$user->delete();
Khôi phục một bản ghi đã bị xóa mềm
Bạn có thể khôi phục một bản ghi đã bị xóa mềm bằng phương thức restore
:
$user = User::withTrashed()->find(1);
$user->restore();
Xóa vĩnh viễn một bản ghi
Để xóa vĩnh viễn một bản ghi, bạn có thể sử dụng phương thức forceDelete
:
$user = User::withTrashed()->find(1);
$user->forceDelete();
3. Truy vấn với Soft Deletes
Lấy các bản ghi chưa bị xóa
Mặc định, các truy vấn Eloquent sẽ chỉ lấy các bản ghi chưa bị xóa:
$users = User::all();
Lấy tất cả các bản ghi, bao gồm cả bản ghi đã bị xóa
Bạn có thể sử dụng phương thức withTrashed
để lấy tất cả các bản ghi, bao gồm cả những bản ghi đã bị xóa:
$users = User::withTrashed()->get();
Chỉ lấy các bản ghi đã bị xóa
Bạn có thể sử dụng phương thức onlyTrashed
để chỉ lấy những bản ghi đã bị xóa mềm:
$users = User::onlyTrashed()->get();
4. Các phương thức bổ sung
Kiểm tra xem một bản ghi đã bị xóa hay chưa
Bạn có thể sử dụng phương thức trashed
để kiểm tra xem một bản ghi đã bị xóa mềm hay chưa:
$user = User::withTrashed()->find(1);
if ($user->trashed()) {
// Bản ghi đã bị xóa mềm
}
Nested Resources (tài nguyên lồng nhau) cho phép bạn định nghĩa các tuyến đường tài nguyên lồng nhau để biểu diễn mối quan hệ giữa các mô hình. Điều này thường được sử dụng khi một mô hình có mối quan hệ với một mô hình khác, ví dụ như Post
và Comment
.
1. Định Nghĩa Nested Resources
Bạn có thể định nghĩa các nested resources trong tệp định tuyến của mình (routes/web.php
). Dưới đây là một ví dụ về cách định nghĩa nested resources cho Post
và Comment
:
use App\Http\Controllers\PostController;
use App\Http\Controllers\CommentController;
use Illuminate\Support\Facades\Route;
Route::resource('posts', PostController::class);
Route::resource('posts.comments', CommentController::class);
2. URL và Tên Định Tuyến cho Nested Resources
Khi bạn định nghĩa nested resources, Laravel sẽ tự động tạo ra các tuyến đường với các URL và tên định tuyến tương ứng.
Ví dụ URL và tên định tuyến:
GET /posts
-posts.index
GET /posts/{post}
-posts.show
GET /posts/{post}/comments
-posts.comments.index
GET /posts/{post}/comments/{comment}
-posts.comments.show
3. Sử Dụng Nested Resources trong Controller
Bạn có thể sử dụng nested resources trong controller của bạn để quản lý các hành động liên quan đến mô hình lồng nhau.
namespace App\Http\Controllers;
use App\Models\Post;
use App\Models\Comment;
use Illuminate\Http\Request;
class CommentController extends Controller
{
public function index(Post $post)
{
$comments = $post->comments;
return view('comments.index', compact('comments'));
}
public function show(Post $post, Comment $comment)
{
return view('comments.show', compact('post', 'comment'));
}
public function create(Post $post)
{
return view('comments.create', compact('post'));
}
public function store(Request $request, Post $post)
{
$validatedData = $request->validate([
'body' => 'required|max:255',
]);
$post->comments()->create($validatedData);
return redirect()->route('posts.comments.index', $post);
}
public function edit(Post $post, Comment $comment)
{
return view('comments.edit', compact('post', 'comment'));
}
public function update(Request $request, Post $post, Comment $comment)
{
$validatedData = $request->validate([
'body' => 'required|max:255',
]);
$comment->update($validatedData);
return redirect()->route('posts.comments.index', $post);
}
public function destroy(Post $post, Comment $comment)
{
$comment->delete();
return redirect()->route('posts.comments.index', $post);
}
}
4. Ràng Buộc Ngầm Định và Nested Resources
Laravel tự động ràng buộc các Model cho các nested resources. Khi bạn định nghĩa một nested resource, Laravel sẽ tự động ràng buộc các Model cha cho các tuyến đường con. Ví dụ, trong CommentController
, mô hình Post
sẽ tự động được ràng buộc trước khi mô hình Comment
.
Nested resources cung cấp một cách rõ ràng và dễ dàng để quản lý mối quan hệ giữa các mô hình trong ứng dụng Laravel của bạn. Bằng cách sử dụng nested resources, bạn có thể tạo ra các tuyến đường và controller hành động cho các mô hình lồng nhau một cách trực quan và dễ dàng.
Validation
Author: | ADMIN |
---|
# Laravel Validation
Laravel cung cấp một hệ thống kiểm tra dữ liệu mạnh mẽ và dễ sử dụng. Bạn có thể thực hiện kiểm tra dữ liệu (validation) trong các controller, form request, hoặc thậm chí là trực tiếp trong các model. Dưới đây là hướng dẫn cơ bản về cách sử dụng hệ thống kiểm tra dữ liệu của Laravel.
1. Validation trong Controller
Bạn có thể thực hiện kiểm tra dữ liệu trực tiếp trong các phương thức của controller bằng cách sử dụng phương thức validate
:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function store(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8|confirmed',
]);
// Nếu dữ liệu hợp lệ, bạn có thể tiếp tục xử lý dữ liệu ở đây.
// User::create($validatedData);
return response('User created successfully.');
}
}
name
phải có giá trị và không được vượt quá 255 ký tự.email
phải là một địa chỉ email hợp lệ và duy nhất trong bảngusers
.password
phải có ít nhất 8 ký tự và được xác nhận (có một trườngpassword_confirmation
khớp vớipassword
).
2. Validation trong Form Request
Bạn có thể tách logic kiểm tra dữ liệu ra khỏi controller bằng cách sử dụng Form Request. Điều này giúp mã nguồn của bạn sạch hơn và dễ bảo trì hơn.
Tạo một Form Request:
php artisan make:request StoreUserRequest
Sử dụng Form Request:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required|max:255',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8|confirmed',
];
}
}
Sử dụng Form Request trong Controller:
namespace App\Http\Controllers;
use App\Http\Requests\StoreUserRequest;
class UserController extends Controller
{
public function store(StoreUserRequest $request)
{
$validatedData = $request->validated();
// Nếu dữ liệu hợp lệ, bạn có thể tiếp tục xử lý dữ liệu ở đây.
// User::create($validatedData);
return response('User created successfully.');
}
}
3. Custom Messages
Bạn có thể tùy chỉnh các thông báo lỗi kiểm tra dữ liệu bằng cách sử dụng phương thức messages
trong Form Request hoặc bằng cách truyền mảng thứ ba vào phương thức validate
.
Tùy chỉnh thông báo lỗi trong Form Request:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => 'required|max:255',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8|confirmed',
];
}
public function messages()
{
return [
'name.required' => 'Vui lòng nhập tên.',
'email.required' => 'Vui lòng nhập địa chỉ email.',
'email.email' => 'Địa chỉ email không hợp lệ.',
'email.unique' => 'Địa chỉ email đã tồn tại.',
'password.required' => 'Vui lòng nhập mật khẩu.',
'password.min' => 'Mật khẩu phải có ít nhất 8 ký tự.',
'password.confirmed' => 'Xác nhận mật khẩu không khớp.',
];
}
}
Tùy chỉnh thông báo lỗi trong Controller:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function store(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|max:255',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8|confirmed',
], [
'name.required' => 'Vui lòng nhập tên.',
'email.required' => 'Vui lòng nhập địa chỉ email.',
'email.email' => 'Địa chỉ email không hợp lệ.',
'email.unique' => 'Địa chỉ email đã tồn tại.',
'password.required' => 'Vui lòng nhập mật khẩu.',
'password.min' => 'Mật khẩu phải có ít nhất 8 ký tự.',
'password.confirmed' => 'Xác nhận mật khẩu không khớp.',
]);
// Nếu dữ liệu hợp lệ, bạn có thể tiếp tục xử lý dữ liệu ở đây.
// User::create($validatedData);
return response('User created successfully.');
}
}
4. Custom Validation Rules
Bạn có thể tạo các quy tắc kiểm tra dữ liệu tùy chỉnh nếu cần.
Tạo Custom Validation Rule:
php artisan make:rule Uppercase
Sử dụng Custom Validation Rule:
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Uppercase implements Rule
{
public function passes($attribute, $value)
{
return strtoupper($value) === $value;
}
public function message()
{
return 'The :attribute must be uppercase.';
}
}
Sử dụng Custom Validation Rule trong Controller hoặc Form Request:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use App\Rules\Uppercase;
class StoreUserRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'name' => ['required', 'max:255', new Uppercase],
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8|confirmed',
];
}
}
Trong Laravel, khi thực hiện kiểm tra dữ liệu (validation), đôi khi bạn muốn tách biệt các thông báo lỗi thành nhiều túi (bag) khác nhau. Điều này có thể hữu ích khi bạn có nhiều form trên cùng một trang và bạn muốn quản lý thông báo lỗi riêng biệt cho từng form. Laravel cung cấp phương thức validateWithBag
để thực hiện điều này.
Sử dụng validateWithBag
Phương thức validateWithBag
cho phép bạn chỉ định một túi lỗi cụ thể cho các lỗi kiểm tra dữ liệu. Đây là cách sử dụng cơ bản:
Controller:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class UserController extends Controller
{
public function store(Request $request)
{
$validatedData = $request->validateWithBag('storeUser', [
'name' => 'required|max:255',
'email' => 'required|email|unique:users,email',
'password' => 'required|min:8|confirmed',
]);
// Nếu dữ liệu hợp lệ, bạn có thể tiếp tục xử lý dữ liệu ở đây.
// User::create($validatedData);
return response('User created successfully.');
}
public function update(Request $request, $id)
{
$validatedData = $request->validateWithBag('updateUser', [
'name' => 'required|max:255',
'email' => 'required|email|unique:users,email,' . $id,
]);
// Nếu dữ liệu hợp lệ, bạn có thể tiếp tục xử lý dữ liệu ở đây.
// User::find($id)->update($validatedData);
return response('User updated successfully.');
}
}
Trong ví dụ trên, phương thức validateWithBag
được sử dụng với túi lỗi storeUser
cho phương thức store
và túi lỗi updateUser
cho phương thức update
.
Hiển thị lỗi trong Blade
Để hiển thị các thông báo lỗi cho từng túi lỗi riêng biệt trong Blade, bạn có thể sử dụng phương thức hasBag
và getBag
của đối tượng $errors
.
Ví dụ trong Blade template:
<!-- Form tạo người dùng mới -->
<form action="{{ route('user.store') }}" method="POST">
@csrf
<div>
<label for="name">Name</label>
<input type="text" id="name" name="name">
@if ($errors->storeUser->has('name'))
<div>{{ $errors->storeUser->first('name') }}</div>
@endif
</div>
<div>
<label for="email">Email</label>
<input type="email" id="email" name="email">
@if ($errors->storeUser->has('email'))
<div>{{ $errors->storeUser->first('email') }}</div>
@endif
</div>
<div>
<label for="password">Password</label>
<input type="password" id="password" name="password">
@if ($errors->storeUser->has('password'))
<div>{{ $errors->storeUser->first('password') }}</div>
@endif
</div>
<button type="submit">Create User</button>
</form>
<!-- Form cập nhật người dùng -->
<form action="{{ route('user.update', ['id' => 1]) }}" method="POST">
@csrf
@method('PUT')
<div>
<label for="name">Name</label>
<input type="text" id="name" name="name">
@if ($errors->updateUser->has('name'))
<div>{{ $errors->updateUser->first('name') }}</div>
@endif
</div>
<div>
<label for="email">Email</label>
<input type="email" id="email" name="email">
@if ($errors->updateUser->has('email'))
<div>{{ $errors->updateUser->first('email') }}</div>
@endif
</div>
<button type="submit">Update User</button>
</form>
Trong ví dụ trên, các thông báo lỗi cho từng form được hiển thị riêng biệt dựa trên túi lỗi tương ứng (storeUser
và updateUser
).
Kết luận
Phương thức
validateWithBag
của Laravel giúp bạn dễ dàng tách biệt và quản lý các thông báo lỗi cho nhiều form trên cùng một trang. Bằng cách sử dụng túi lỗi riêng biệt, bạn có thể đảm bảo rằng mỗi form chỉ hiển thị các thông báo lỗi liên quan, giúp giao diện người dùng trở nên rõ ràng và dễ hiểu hơn.
# Dừng Lại Khi Gặp Lỗi Đầu Tiên
Trong Laravel, để dừng kiểm tra dữ liệu khi gặp lỗi đầu tiên, bạn có thể sử dụng quy tắc bail
. Quy tắc này sẽ yêu cầu Laravel dừng quá trình kiểm tra dữ liệu đối với thuộc tính cụ thể ngay khi phát hiện ra lỗi đầu tiên.
Sử Dụng Quy Tắc bail
Bạn có thể gán quy tắc bail
cho thuộc tính cần kiểm tra. Khi một thuộc tính có quy tắc bail
và Laravel phát hiện ra lỗi đầu tiên trên thuộc tính đó, các quy tắc kiểm tra còn lại sẽ không được thực thi.
$request->validate([
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
Ngoài ra, bạn có thể sử dụng method stopOnFirstFailure
if ($validator->stopOnFirstFailure()->fails()) {
// ...
}
# Lưu Ý Về Các Thuộc Tính Lồng Nhau
Trong Laravel, khi yêu cầu HTTP chứa dữ liệu trường "lồng nhau", bạn có thể chỉ định các trường này trong các quy tắc kiểm tra dữ liệu (validation rules) bằng cú pháp "dot". Ngoài ra, nếu tên trường của bạn chứa một dấu chấm thực sự, bạn có thể ngăn chặn việc này bị hiểu sai thành cú pháp "dot" bằng cách sử dụng dấu gạch chéo ngược để thoát khỏi dấu chấm.
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
// Nếu dữ liệu hợp lệ, bạn có thể tiếp tục xử lý dữ liệu ở đây.
// Post::create($validatedData);
return response('Post created successfully.');
}
}
title
là một trường thông thường với các quy tắcrequired
,unique:posts
, vàmax:255
.author.name
vàauthor.description
là các thuộc tính lồng nhau trong trườngauthor
.
Tránh Nhầm Lẫn Với Tên Trường Chứa Dấu Chấm Thực Sự
Nếu tên trường của bạn chứa một dấu chấm thực sự, bạn có thể ngăn chặn việc này bị hiểu sai thành cú pháp "dot" bằng cách sử dụng dấu gạch chéo ngược để thoát khỏi dấu chấm. Điều này hữu ích khi bạn có các phiên bản hoặc các tên trường đặc biệt.
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class VersionController extends Controller
{
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'v1\.0' => 'required',
]);
// Nếu dữ liệu hợp lệ, bạn có thể tiếp tục xử lý dữ liệu ở đây.
// Version::create($validatedData);
return response('Version created successfully.');
}
}
title
là một trường thông thường với các quy tắcrequired
,unique:posts
, vàmax:255
.v1\.0
là một tên trường chứa dấu chấm thực sự và được thoát bằng dấu gạch chéo ngược.
Tham khảo
# Available Validation Rules
Trong Laravel, việc tái tạo dữ liệu cho các form rất quan trọng để giữ lại thông tin đã nhập vào khi có lỗi xảy ra hoặc khi cần hiển thị lại dữ liệu đã lưu trước đó. Laravel cung cấp nhiều cách để thực hiện việc này một cách dễ dàng và hiệu quả.
Sử Dụng old()
Helper
Khi một yêu cầu HTTP POST không thành công do lỗi kiểm tra dữ liệu, Laravel sẽ tự động chuyển hướng người dùng trở lại trang trước đó với dữ liệu cũ (old input) và các thông báo lỗi. Bạn có thể sử dụng helper old()
để lấy lại dữ liệu này và hiển thị trong form.
<form action="{{ route('post.store') }}" method="POST">
@csrf
<div>
<label for="title">Title</label>
<input type="text" id="title" name="title" value="{{ old('title') }}">
@error('title')
<div class="error">{{ $message }}</div>
@enderror
</div>
<div>
<label for="content">Content</label>
<textarea id="content" name="content">{{ old('content') }}</textarea>
@error('content')
<div class="error">{{ $message }}</div>
@enderror
</div>
<button type="submit">Submit</button>
</form>
Trong ví dụ này, nếu kiểm tra dữ liệu không thành công, giá trị của các trường title
và content
sẽ được tái tạo lại trong form bằng cách sử dụng old('title')
và old('content')
.
File Uploads
Author: | ADMIN |
---|
# File Uploads
Trong ứng dụng web, một trong những trường hợp sử dụng phổ biến nhất để lưu trữ tệp là lưu trữ các tệp được người dùng tải lên như hình ảnh và tài liệu. Laravel làm cho việc lưu trữ các files được upload rất dễ dàng bằng cách sử dụng phương thức store với tệp đã được upload. Gọi phương thức store với đường dẫn mà bạn muốn lưu trữ tệp được tải lên:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserAvatarController extends Controller
{
/**
* Update the avatar for the user.
*/
public function update(Request $request): string
{
$path = $request->file('avatar')->store('avatars');
return $path;
}
}
Có một số điều quan trọng cần lưu ý về ví dụ này. Lưu ý rằng chúng ta chỉ chỉ định tên thư mục, không phải tên tệp. Theo mặc định, phương thức store sẽ tạo ra một ID duy nhất để làm tên tệp. Phần mở rộng của tệp sẽ được xác định bằng cách kiểm tra loại MIME của tệp. Đường dẫn đến tệp sẽ được trả về bởi phương thức store để bạn có thể lưu trữ đường dẫn, bao gồm tên tệp được tạo ra, trong cơ sở dữ liệu của bạn. Bạn cũng có thể gọi phương thức putFile trên Storage facade để thực hiện cùng một hoạt động lưu trữ tệp như ví dụ trên:
$path = Storage::putFile('avatars', $request->file('avatar'));
# Chỉ định một tên tệp
Nếu bạn không muốn tự động gán tên tệp cho tệp đã lưu của mình, bạn có thể sử dụng phương thức storeAs
, nhận đường dẫn, tên tệp và ổ đĩa (tùy chọn) là đối số của nó:
$path = $request->file('avatar')->storeAs(
'avatars', $request->user()->id
);
Bạn cũng có thể sử dụng phương thức putFileAs
trên Storage facade, sẽ thực hiện cùng một hoạt động lưu trữ tập tin như ví dụ trên:
$path = Storage::putFileAs(
'avatars', $request->file('avatar'), $request->user()->id
);
# Chỉ định một ổ đĩa
Theo mặc định, phương thức lưu trữ của tệp tải lên này sẽ sử dụng ổ đĩa mặc định của bạn. Nếu bạn muốn chỉ định một ổ đĩa khác, hãy truyền tên ổ đĩa như là đối số thứ hai cho phương thức lưu trữ:
$path = $request->file('avatar')->store(
'avatars/'.$request->user()->id, 's3'
);
// or
$path = $request->file('avatar')->storeAs(
'avatars',
$request->user()->id,
's3'
);
# Thông tin file đã upload
// Lấy tên gốc của tập tin
$originalName = $file->getClientOriginalName();
// Lấy phần mở rộng của tập tin
$extension = $file->getClientOriginalExtension();
// Lấy kích thước của tập tin (đơn vị: byte)
$size = $file->getSize();
// Lấy MIME type của tập tin
$mimeType = $file->getMimeType();
// Lưu tập tin
$path = $file->store('uploads', 'public');
Tuy nhiên, hãy nhớ rằng các phương thức getClientOriginalName
và getClientOriginalExtension
được coi là không an toàn, vì tên tập tin và phần mở rộng có thể bị người dùng độc hại can thiệp. Vì lý do này, bạn nên thường chọn phương thức hashName và phần mở rộng để có được tên và phần mở rộng cho tệp tải lên cụ thể:
$file = $request->file('avatar');
$name = $file->hashName(); // Generate a unique, random name...
$extension = $file->extension(); // Determine the file's extension based on the file's MIME type...
# File Visibility
Trong tích hợp Flysystem của Laravel, "visibility" là một sự trừu tượng hóa của các quyền tập tin trên nhiều nền tảng khác nhau. Các tập tin có thể được khai báo là công khai (public) hoặc riêng tư (private). Khi một tập tin được khai báo là công khai, bạn đang chỉ định rằng tập tin đó thường nên được truy cập bởi những người khác. Ví dụ, khi sử dụng driver S3, bạn có thể lấy URL cho các tập tin công khai.
Thiết Lập Tính Năng Hiển Thị Tập Tin
Lưu Trữ Tập Tin Công Khai
Bạn có thể lưu trữ một tập tin và chỉ định nó là công khai như sau:
use Illuminate\Support\Facades\Storage;
$content = 'Nội dung của tập tin';
Storage::put('file.jpg', $content, 'public');
Nếu tập tin đã được lưu trữ, bạn có thể lấy và thiết lập tính năng hiển thị của nó thông qua các phương thức getVisibility
và setVisibility
.
$visibility = Storage::getVisibility('file.jpg');
Storage::setVisibility('file.jpg', 'public');
Khi làm việc với các tập tin được tải lên, bạn có thể sử dụng các phương thức storePublicly
và storePubliclyAs
để lưu trữ tập tin với tính năng hiển thị công khai.
Phương Thức storePublicly
Phương thức storePublicly
sẽ lưu trữ tập tin được tải lên với tính năng hiển thị công khai.
$path = $request->file('avatar')->storePublicly('avatars', 's3');
Phương Thức storePubliclyAs
Phương thức storePubliclyAs
cho phép bạn chỉ định tên tập tin khi lưu trữ với tính năng hiển thị công khai.
$path = $request->file('avatar')->storePubliclyAs(
'avatars',
$request->user()->id,
's3'
);
Tập Tin Cục Bộ và Tính Năng Hiển Thị
Khi sử dụng driver cục bộ (local
), tính năng hiển thị công khai được dịch thành quyền 0755 cho thư mục và 0644 cho tập tin. Bạn có thể chỉnh sửa các phép ánh xạ quyền này trong tệp cấu hình filesystems
của ứng dụng của bạn.
Cấu Hình filesystems.php
Trong tệp config/filesystems.php
, bạn có thể cấu hình quyền truy cập cho driver cục bộ như sau:
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
'permissions' => [
'file' => [
'public' => 0644,
'private' => 0600,
],
'dir' => [
'public' => 0755,
'private' => 0700,
],
],
],
Giải Thích
- Driver:
local
là driver cục bộ mà Laravel cung cấp để lưu trữ tập tin trên hệ thống tệp cục bộ. - Root: Đường dẫn gốc nơi các tập tin sẽ được lưu trữ. Mặc định là
storage_path('app')
, nghĩa là thư mụcstorage/app
trong ứng dụng của bạn. - Permissions: Đây là nơi bạn có thể chỉ định quyền truy cập cho tập tin và thư mục dựa trên tính năng hiển thị của chúng.
- File:
public
(0644): Quyền truy cập công khai cho tập tin, cho phép chủ sở hữu có thể đọc và ghi, trong khi người dùng khác chỉ có thể đọc.private
(0600): Quyền truy cập riêng tư cho tập tin, chỉ cho phép chủ sở hữu có thể đọc và ghi.
- Dir:
public
(0755): Quyền truy cập công khai cho thư mục, cho phép chủ sở hữu có thể đọc, ghi và thực thi, trong khi người dùng khác chỉ có thể đọc và thực thi.private
(0700): Quyền truy cập riêng tư cho thư mục, chỉ cho phép chủ sở hữu có thể đọc, ghi và thực thi.
- File:
# Deleting Files
Trong Laravel, bạn có thể dễ dàng xóa các tập tin đã được lưu trữ bằng cách sử dụng các phương thức được cung cấp bởi Storage
facade. Dưới đây là các phương pháp phổ biến để xóa tập tin trong Laravel.
Xóa Tập Tin Đơn Lẻ
Để xóa một tập tin đơn lẻ, bạn có thể sử dụng phương thức delete
:
use Illuminate\Support\Facades\Storage;
Storage::delete('path/to/file.jpg');
Xóa Nhiều Tập Tin
Nếu bạn cần xóa nhiều tập tin cùng lúc, bạn có thể truyền một mảng các đường dẫn tập tin vào phương thức delete
:
use Illuminate\Support\Facades\Storage;
Storage::delete([
'path/to/file1.jpg',
'path/to/file2.jpg',
'path/to/file3.jpg'
]);
Kiểm Tra Tập Tin Trước Khi Xóa
Bạn có thể kiểm tra xem tập tin có tồn tại hay không trước khi xóa bằng cách sử dụng phương thức exists
:
use Illuminate\Support\Facades\Storage;
if (Storage::exists('path/to/file.jpg')) {
Storage::delete('path/to/file.jpg');
}
Xóa Tập Tin Cục Bộ
Nếu bạn đang làm việc với các tập tin cục bộ và muốn xóa chúng, bạn có thể sử dụng phương thức unlink
của PHP. Tuy nhiên, sử dụng Storage
facade của Laravel là cách tiếp cận tốt hơn vì nó trừu tượng hóa các chi tiết của hệ thống tập tin cơ bản:
use Illuminate\Support\Facades\Storage;
Storage::disk('local')->delete('path/to/file.jpg');
Xóa Thư Mục
Bạn có thể xóa cả một thư mục và tất cả các tập tin trong đó bằng phương thức deleteDirectory
:
use Illuminate\Support\Facades\Storage;
Storage::deleteDirectory('path/to/directory');
Lấy Tất Cả Các Tập Tin Trong Một Thư Mục
Để lấy danh sách tất cả các tập tin trong một thư mục, bạn có thể sử dụng phương thức files
của Storage
facade:
use Illuminate\Support\Facades\Storage;
$files = Storage::files('path/to/directory');
Phương thức này sẽ trả về một mảng chứa các đường dẫn của tất cả các tập tin trong thư mục được chỉ định.
Lấy Tất Cả Các Tập Tin Kể Cả Trong Các Thư Mục Con
Nếu bạn muốn lấy tất cả các tập tin bao gồm cả trong các thư mục con, bạn có thể sử dụng phương thức allFiles
:
use Illuminate\Support\Facades\Storage;
$allFiles = Storage::allFiles('path/to/directory');
Phương thức này sẽ trả về một mảng chứa các đường dẫn của tất cả các tập tin, kể cả trong các thư mục con của thư mục được chỉ định.
Lấy Tất Cả Các Thư Mục Con Trong Một Thư Mục
Để lấy danh sách tất cả các thư mục con trong một thư mục, bạn có thể sử dụng phương thức directories
:
use Illuminate\Support\Facades\Storage;
$directories = Storage::directories('path/to/directory');
Phương thức này sẽ trả về một mảng chứa các đường dẫn của tất cả các thư mục con trong thư mục được chỉ định.
Lấy Tất Cả Các Thư Mục Con Bao Gồm Cả Trong Các Thư Mục Con Khác
Nếu bạn muốn lấy tất cả các thư mục con bao gồm cả trong các thư mục con khác, bạn có thể sử dụng phương thức allDirectories
:
use Illuminate\Support\Facades\Storage;
$allDirectories = Storage::allDirectories('path/to/directory');
Phương thức này sẽ trả về một mảng chứa các đường dẫn của tất cả các thư mục con, kể cả trong các thư mục con khác của thư mục được chỉ định.
Tạo Một Thư Mục
Để tạo một thư mục mới, bạn có thể sử dụng phương thức makeDirectory
:
use Illuminate\Support\Facades\Storage;
Storage::makeDirectory('path/to/directory');
-----------------------------------------------------------------------------------------------------------------------------------------
# Example:
Trước khi bắt đầu, hãy chắc chắn rằng thư mục lưu trữ tập tin tải lên có quyền ghi. Thư mục mặc định là storage/app/public
.
Tạo symbolic link: Chạy lệnh sau để tạo một symbolic link từ public/storage
tới storage/app/public
:
php artisan storage:link
Tạo Form Để Tải Lên Tập Tin
Đầu tiên, bạn cần tạo một form để người dùng có thể chọn tập tin để tải lên.
Ví Dụ Form Trong Blade:
<form action="{{ route('upload') }}" method="POST" enctype="multipart/form-data">
@csrf
<div>
<label for="file">Choose file</label>
<input type="file" id="file" name="file">
@error('file')
<div class="error">{{ $message }}</div>
@enderror
</div>
<button type="submit">Upload</button>
</form>
Lưu ý rằng bạn cần sử dụng enctype="multipart/form-data"
trong thẻ <form>
để có thể tải lên tập tin.
Xử Lý Yêu Cầu Tải Lên Trong Controller
Tiếp theo, tạo một phương thức trong controller để xử lý việc tải lên tập tin.
Ví Dụ Trong Controller:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class FileUploadController extends Controller
{
public function upload(Request $request)
{
// Kiểm tra dữ liệu
$request->validate([
'file' => 'required|file|mimes:jpg,png,pdf|max:2048',
]);
// Lưu tập tin
if ($request->file('file')->isValid()) {
$path = $request->file('file')->store('uploads', 'public');
return back()->with('success', 'File uploaded successfully.')->with('file', $path);
}
return back()->with('error', 'There was an error uploading your file.');
}
}
Cấu Hình Route
Cuối cùng, cấu hình route để xử lý form upload.
Ví Dụ Trong web.php
:
use App\Http\Controllers\FileUploadController;
Route::get('/upload', function () {
return view('upload');
})->name('upload.form');
Route::post('/upload', [FileUploadController::class, 'upload'])->name('upload');
Một số lệnh Artisan Make với các tham số
Author: | ADMIN |
---|
Laravel cung cấp nhiều lệnh Artisan để tạo các thành phần khác nhau trong ứng dụng. Dưới đây là danh sách các lệnh make
cùng với các tham số phổ biến mà bạn có thể sử dụng.
1. Make Controller
php artisan make:controller {name} [--resource] [--api] [--invokable] [--model[=MODEL]] [--parent] [--requests] [--singleton] [--force]
--resource
: Controller sẽ chứa một phương thức cho mỗi hoạt động tài nguyên có sẵn - index(), create(), store(), show(), edit(), update(), destroy().--api
: Tương tự như -resource ở trên, nhưng chỉ tạo ra 5 phương thức: index(), store(), show(), update(), destroy(). Bởi vì các biểu mẫu tạo/sửa không cần thiết cho API.--invokable
: Tạo một controller với một phương thức __invoke duy nhất.--model[=MODEL]
: Tạo controller với mô hình được liên kết.--requests
: Tạo các lớp request form cho controller.
2. Make Model
php artisan make:model {name} [--migration] [--controller] [--resource] [--factory] [--seed] [--policy] [--all] [--pivot]
--migration
: Tạo migration cho mô hình.--controller
: Tạo controller cho mô hình.--resource
: Tạo controller tài nguyên cho mô hình.--factory
: Tạo factory cho mô hình.--seed
: Tạo seeder cho mô hình.--policy
: Tạo policy cho mô hình.--all
: Tạo migration, factory, seeder, policy, và controller cho mô hình.--pivot
: Tạo mô hình pivot.
3. Make Migration
php artisan make:migration {name} [--create[=TABLE]] [--table[=TABLE]] [--path[=PATH]] [--realpath] [--fullpath]
--create[=TABLE]
: Tạo migration cho bảng mới.--table[=TABLE]
: Tạo migration để cập nhật bảng hiện có.
4. Make Seeder
php artisan make:seeder {name}
5. Make Factory
php artisan make:factory {name} [--model[=MODEL]]
--model[=MODEL]
: Liên kết factory với mô hình.
6. Make Middleware
php artisan make:middleware {name}
7. Make Request
php artisan make:request {name}
8. Make Event
php artisan make:event {name}
9. Make Listener
php artisan make:listener {name} [--event[=EVENT]]
--event[=EVENT]
: Liên kết listener với sự kiện.
10. Make Job
php artisan make:job {name} [--sync]
--sync
: Tạo job đồng bộ.
11. Make Notification
php artisan make:notification {name}
12. Make Mail
php artisan make:mail {name} [--markdown[=MARKDOWN]]
--markdown[=MARKDOWN]
: Tạo email với template markdown.
13. Make Command
php artisan make:command {name} [--command[=COMMAND]]
--command[=COMMAND]
: Tên của lệnh console.
14. Make Policy
php artisan make:policy {name} [--model[=MODEL]]
--model[=MODEL]
: Liên kết policy với mô hình.
15. Make Provider
php artisan make:provider {name}
16. Make Test
php artisan make:test {name} [--unit] [--pest]
--unit
: Tạo test đơn vị.--pest
: Tạo test Pest.
17. Make Rule
php artisan make:rule {name}
18. Make Observer
php artisan make:observer {name} [--model[=MODEL]]
--model[=MODEL]
: Liên kết observer với mô hình.
19. Make Channel
php artisan make:channel {name}
20. Make Resource
php artisan make:resource {name}
Trên đây là một số command mà tôi hay sử dụng, ngoài các command này, bạn có thể sử dụng command php artisan list để liệt kê tất cả command artisan tính đến thời điểm hiện tại
Database: Seeding
Author: | ADMIN |
---|
Seeding trong Laravel là một cách để tự động thêm dữ liệu mẫu vào cơ sở dữ liệu của bạn. Điều này hữu ích khi bạn cần tạo ra dữ liệu thử nghiệm hoặc khởi tạo dữ liệu mặc định cho ứng dụng.
Tạo Seeder
Bạn có thể tạo một seeder mới bằng cách sử dụng lệnh Artisan:
php artisan make:seeder UsersTableSeeder
Lệnh này sẽ tạo một file seeder mới trong thư mục database/seeders
.
Định Nghĩa Seeder
Khi bạn mở file seeder, nó sẽ trông giống như sau:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// Đoạn mã để chèn dữ liệu mẫu vào bảng users
}
}
Bạn có thể sử dụng phương thức DB::table
hoặc các phương thức của Eloquent để chèn dữ liệu vào bảng:
public function run()
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => bcrypt('password'),
]);
}
Hoặc sử dụng model Eloquent:
public function run()
{
\App\Models\User::create([
'name' => 'John Doe',
'email' => 'johndoe@example.com',
'password' => bcrypt('password'),
]);
}
Gọi Seeder
Sau khi định nghĩa seeder, bạn cần gọi nó trong lớp DatabaseSeeder
để nó được chạy khi bạn chạy lệnh seed:
// database/seeders/DatabaseSeeder.php
public function run()
{
$this->call(UsersTableSeeder::class);
}
Chạy Seeder
Bạn có thể chạy tất cả các seeder bằng lệnh Artisan:
php artisan db:seed
Hoặc chạy một seeder cụ thể:
php artisan db:seed --class=UsersTableSeeder
Tái Tạo Cơ Sở Dữ Liệu
Nếu bạn muốn làm mới cơ sở dữ liệu và chạy lại các seeder, bạn có thể sử dụng lệnh migrate:fresh
:
php artisan migrate:fresh --seed
Lệnh này sẽ xóa tất cả các bảng trong cơ sở dữ liệu của bạn và chạy lại tất cả các migration và seeder.
Tùy chọn --seeder có thể được sử dụng để chỉ định một seeder cụ thể để chạy:
php artisan migrate:fresh --seed --seeder=UserSeeder
Sử Dụng Factory trong Seeder
Laravel có thể tích hợp factory với seeder để tạo ra dữ liệu mẫu phong phú hơn. Ví dụ, bạn có thể sử dụng factory để tạo nhiều người dùng một cách dễ dàng:
public function run()
{
\App\Models\User::factory(10)->create();
}
Forcing Seeders to Run in Production
Khi làm việc với Laravel, bạn có thể muốn chạy seeder (tạo dữ liệu mẫu) ngay cả khi ứng dụng đang ở môi trường production. Điều này thường bị ngăn chặn để tránh nguy cơ làm hỏng dữ liệu thực tế. Tuy nhiên, đôi khi bạn vẫn cần phải chạy seeder trong môi trường production, và Laravel cung cấp cách để làm điều này một cách an toàn.
php artisan db:seed --force
Cờ --force
sẽ bỏ qua cảnh báo và cho phép seeder chạy ngay cả khi ứng dụng đang ở môi trường production.
Ví dụ Thực Tế
Giả sử bạn có một seeder gọi là DatabaseSeeder
và bạn muốn chạy nó trong môi trường production. Bạn chỉ cần chạy lệnh sau từ dòng lệnh:
php artisan db:seed --class=DatabaseSeeder --force
Lệnh trên sẽ thực hiện seeding dữ liệu từ DatabaseSeeder
vào cơ sở dữ liệu hiện tại, ngay cả khi ứng dụng đang ở môi trường production.
Chạy Seeder Cụ Thể
Nếu bạn chỉ muốn chạy một seeder cụ thể trong môi trường production, bạn có thể chỉ định seeder đó với cờ --class
cùng với --force
. Ví dụ:
php artisan db:seed --class=UsersTableSeeder --force
Điều này sẽ chỉ chạy seeder UsersTableSeeder
.
Sử Dụng Migrate với Seeder
Nếu bạn muốn chạy migration kèm theo seeder trong môi trường production, bạn có thể sử dụng lệnh migrate:fresh
hoặc migrate
cùng với cờ --seed
và --force
:
php artisan migrate:fresh --seed --force
// or
php artisan migrate --seed --force
Cả hai lệnh trên sẽ chạy migration để tạo lại hoặc cập nhật các bảng trong cơ sở dữ liệu và sau đó chạy seeder.