Tạo và Chạy Dự Án ThinkPHP 8 trên ServBay
Bài viết này sẽ hướng dẫn bạn cách sử dụng ServBay – một môi trường phát triển Web local mạnh mẽ – để nhanh chóng tạo, cấu hình và chạy một dự án PHP sử dụng framework ThinkPHP 8. ServBay cung cấp sẵn môi trường PHP, máy chủ web (Caddy hoặc Nginx) và nhiều loại cơ sở dữ liệu, giúp đơn giản hoá tối đa quá trình thiết lập dự án ThinkPHP trên máy local.
ThinkPHP là gì?
ThinkPHP là một framework PHP mã nguồn mở, hướng đối tượng, đơn giản và nhanh chóng, được phát triển tại Trung Quốc. Nó tuân thủ các nguyên tắc phát triển tinh gọn và hiệu quả, hướng tới việc cung cấp bộ công cụ tiện ích hiện đại cho các nhà phát triển xây dựng ứng dụng Web. Nhờ tính dễ sử dụng, giàu tính năng (như ORM mạnh mẽ, routing linh hoạt, engine mẫu dựng sẵn, hỗ trợ cache...) và cộng đồng sôi động, ThinkPHP rất phổ biến trong giới phát triển PHP tại Trung Quốc.
Các đặc điểm và lợi ích chính của ThinkPHP
- Đơn giản & Hiệu quả: Thiết kế framework gọn nhẹ, cấu trúc code rõ ràng, dễ hiểu và bảo trì, giúp tăng tốc độ phát triển.
- Chức năng toàn diện: Trang bị đầy đủ các thành phần thiết yếu cho phát triển Web như mô hình MVC, ORM, engine template, cache, session, xác thực quyền, và bảo vệ form bằng token...
- ORM mạnh mẽ: Hệ thống mapping đối tượng - quan hệ (ORM) dễ dùng, giảm tải thao tác với cơ sở dữ liệu.
- Routing linh hoạt: Hỗ trợ nhiều cách định nghĩa route để đáp ứng các URL phức tạp.
- Hệ sinh thái phong phú: Có nhiều thư viện mở rộng, plugin và cộng đồng lớn với nguồn tài nguyên dồi dào.
- Cập nhật liên tục: Framework luôn cập nhật theo sự phát triển của PHP và xu hướng mới của Web.
ThinkPHP phù hợp với các dự án đủ mọi quy mô, từ nhỏ tới cấp doanh nghiệp lớn.
Xây dựng Dự Án ThinkPHP 8 trên ServBay
ServBay cung cấp mọi thứ cần thiết để phát triển ThinkPHP 8 trên máy local, bao gồm:
- Các phiên bản PHP cùng các extension cần thiết đã được cài sẵn.
- Máy chủ web tích hợp (Caddy hoặc Nginx), tiện cho việc cấu hình website.
- Các dịch vụ cơ sở dữ liệu như MySQL, PostgreSQL, MongoDB, Redis, Memcached...
- Trình quản lý phụ thuộc Composer được tích hợp sẵn.
Bài hướng dẫn này sẽ tận dụng mọi tính năng đó để bạn nhanh chóng khởi tạo dự án ThinkPHP 8.
Yêu cầu chuẩn bị
Trước khi bắt đầu, hãy đảm bảo bạn đã hoàn tất những bước sau:
- Đã tải về và cài đặt ServBay trên macOS.
- ServBay đã được khởi động, bạn đã bật phiên bản PHP tối thiểu 8.0 (ThinkPHP 8 yêu cầu PHP 8.0 trở lên) cùng các dịch vụ database cần thiết (MySQL, PostgreSQL, Redis, Memcached...). Bạn kiểm tra và bật các dịch vụ này ở tab “Phần mềm” trên bảng điều khiển của ServBay.
Tạo Dự Án ThinkPHP
ServBay khuyến khích bạn lưu toàn bộ mã nguồn website tại thư mục /Applications/ServBay/www
để dễ quản lý.
Kiểm tra Composer đã cài đặt
ServBay đã tích hợp Composer sẵn, thường không cần cài đặt lại. Bạn có thể kiểm tra bằng lệnh
composer --version
trong terminal của ServBay.Tạo dự án ThinkPHP bằng Composer
Mở Terminal trên macOS và thực hiện các lệnh sau để tạo một dự án ThinkPHP 8 mới vào thư mục webroot của ServBay:
bashcd /Applications/ServBay/www composer create-project topthink/think servbay-thinkphp-app
1
2Lệnh trên sẽ tạo thư mục
servbay-thinkphp-app
bên trong/Applications/ServBay/www
và tải ThinkPHP 8 cùng các phụ thuộc cần thiết.Vào thư mục dự án
Sau khi hoàn thành bước tạo dự án:
bashcd /Applications/ServBay/www/servbay-thinkphp-app
1
Khởi tạo cấu hình dự án
Sau khi tạo dự án, bạn cần cấu hình một số thông tin cần thiết.
Cấu hình kết nối Database
Thông tin cấu hình database nằm ở file
config/database.php
. Hãy sửa các thông số hợp lý ứng với dịch vụ database bạn đã khởi động trên ServBay.Ví dụ cấu hình cho MySQL mặc định của ServBay:
php<?php // config/database.php return [ // Cấu hình kết nối database mặc định 'default' => env('database.driver', 'mysql'), // DANH SÁCH cấu hình kết nối các loại database 'connections' => [ 'mysql' => [ // Loại database 'type' => 'mysql', // Địa chỉ server 'hostname' => env('database.hostname', '127.0.0.1'), // Tên database 'database' => env('database.database', 'servbay_thinkphp_app'), // Khuyên tạo database riêng cho dự án // Tên người dùng 'username' => env('database.username', 'root'), // Mật khẩu 'password' => env('database.password', 'password'), // Mật khẩu mặc định của ServBay, chỉ dùng cho local! // Port 'hostport' => env('database.hostport', '3306'), // ... Các cài đặt khác ... ], // ... Các cài đặt database khác ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27Lưu ý quan trọng:
- Nhớ sửa
database
thành tên database bạn thực tế tạo cho dự án (có thể dùng phpMyAdmin hoặc Adminer trên ServBay để tạo). - Tài khoản
root
trên ServBay mặc định có mật khẩupassword
. Chỉ nên dùng cho môi trường phát triển, không dùng ở sản xuất! Khi triển khai sản xuất, hãy dùng mật khẩu mạnh và tài khoản có quyền tối thiểu. - Nếu bạn dùng file
.env
để quản lý biến môi trường, hãy đảm bảo cấu hình trong.env
sẽ lấn át giá trị mặc định trongconfig/database.php
.
- Nhớ sửa
Cấu hình Máy chủ Web
Tập tin vào của ThinkPHP là public/index.php
và framework này bắt buộc dùng rewrite (URL thân thiện). Hãy dùng quy tắc rewrite dựng sẵn của ServBay.
Ở màn hình cấu hình website, tại mục Quy tắc Rewrite chọn ThinkPHP
, rồi bấm lưu lại.
Chi tiết về cấu hình website, xem tại Thêm website đầu tiên.
Thêm mã ví dụ để kiểm tra
Để test xem việc cấu hình website có thành công và routing ThinkPHP hoạt động tốt chưa, hãy thêm một route đơn giản.
Mở file /Applications/ServBay/www/servbay-thinkphp-app/route/app.php
trong dự án và thêm đoạn code sau để định nghĩa một route GET:
<?php
// route/app.php
use think\facade\Route;
// Định nghĩa route servbay, khi truy cập /servbay sẽ chạy hàm dưới
Route::get('servbay', function () {
return 'Hello ServBay!';
});
// ... Các route khác ...
2
3
4
5
6
7
8
9
10
11
Truy cập website
Sau khi đã hoàn tất, hãy mở trình duyệt và truy cập vào domain local mà bạn cấu hình với route ví dụ:
https://thinkphp.servbay.demo/servbay
Nếu cấu hình đúng, bạn sẽ thấy dòng Hello ServBay!
xuất hiện. Như vậy dự án ThinkPHP 8 đã vận hành thành công trên môi trường ServBay, và server PHP-FPM đã sẵn sàng.
Ví dụ về NoSQL database
ServBay đã cài sẵn nhiều NoSQL như Memcached, Redis. ThinkPHP trang bị lớp cache trừu tượng, việc tích hợp các dịch vụ cache rất thuận tiện.
Ví dụ về Memcached
Cài đặt extension Memcached
Extension Memcached đã được tích hợp trong các gói PHP của ServBay. Chỉ cần kiểm tra trong tab “Phần mềm” của ServBay để chắc chắn Memcached đã bật.
Cấu hình cache Memcached
Mở file
config/cache.php
và chỉnh cho ThinkPHP dùng Memcached:php<?php // config/cache.php return [ // Driver cache mặc định 'default' => env('cache.driver', 'memcached'), // Cấu hình kết nối từng loại cache 'stores' => [ 'memcached' => [ // Loại cache 'type' => 'memcached', // Danh sách server 'host' => '127.0.0.1', // Địa chỉ default của Memcached trên ServBay 'port' => 11211, // Port default Memcached 'persistent' => false, 'expire' => 0, 'timeout' => 0, 'prefix' => '', ], // ... Các cấu hình cache khác ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Sử dụng cache Memcached trong code
Dùng Facade
Cache
của ThinkPHP ngay trong controller hoặc callback route:php<?php use think\facade\Cache; use think\facade\Route; Route::get('/memcached-example', function () { // Đặt cache, thời gian sống 600 giây Cache::set('my_memcached_key', 'This value is from Memcached!', 600); // Đọc giá trị cache $value = Cache::get('my_memcached_key'); return 'Value from Memcached: ' . $value; });
1
2
3
4
5
6
7
8
9
10
11
12
13Truy cập
https://thinkphp.servbay.demo/memcached-example
để kiểm tra.
Ví dụ về Redis
Cài đặt extension Redis
PHP trên ServBay đã cài sẵn extension Redis. Đảm bảo Redis đã bật bằng cách kiểm tra ở tab “Phần mềm” trên ServBay.
Cấu hình Redis
Sửa file
config/cache.php
để dùng Redis:php<?php // config/cache.php return [ // Driver cache mặc định 'default' => env('cache.driver', 'redis'), // Kết nối các loại cache 'stores' => [ 'redis' => [ // Loại cache 'type' => 'redis', // Địa chỉ server 'host' => env('cache.host', '127.0.0.1'), // Địa chỉ Redis trên ServBay // Port 'port' => env('cache.port', 6379), // Port mặc định Redis // Mật khẩu (mặc định không có) 'password' => env('cache.password', ''), // Redis mặc định không có mật khẩu 'select' => 0, 'timeout' => 0, 'expire' => 0, 'persistent' => false, 'prefix' => '', ], // ... Các config cache khác ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27Lưu ý: Redis mặc định trên ServBay không có mật khẩu. Nếu bạn tự thêm mật khẩu, nhớ cập nhật trường
password
này.Sử dụng cache Redis trong code
Dùng Facade
Cache
để thao tác với Redis:php<?php use think\facade\Cache; use think\facade\Route; Route::get('/redis-example', function () { // Thiết lập giá trị cache, có thể dùng tham số thứ ba để chỉ định TTL Cache::set('my_redis_key', 'Hello from Redis!'); // Đọc giá trị $value = Cache::get('my_redis_key'); return 'Value from Redis: ' . $value; });
1
2
3
4
5
6
7
8
9
10
11
12
13Truy cập
https://thinkphp.servbay.demo/redis-example
để thử nghiệm.
Ví dụ về Cơ sở dữ liệu quan hệ
ServBay tích hợp sẵn MySQL, PostgreSQL và nhiều hệ CSDL phổ biến khác. ThinkPHP ORM giúp thao tác giữa framework và database rất dễ dàng.
Sử dụng công cụ Migration của ThinkPHP
Công cụ migration giúp quản lý sự thay đổi của cấu trúc database – rất cần thiết cho teamwork và kiểm soát phiên bản.
Cài đặt bộ migration
Ở thư mục gốc của dự án, dùng Composer để cài extension migration của ThinkPHP:
bashcd /Applications/ServBay/www/servbay-thinkphp-app composer require topthink/think-migration
1
2Tạo file migration
Tạo file migration cho bảng
users
(ví dụ):bashphp think migrate:create CreateUserTable
1File migration sẽ xuất hiện trong
database/migrations
với format định danh gồm timestamp và tên bạn chỉ định (vd:20231027100000_create_user_table.php
).Chỉnh sửa file migration
Mở file vừa tạo và khai báo cấu trúc bảng
users
ở hàmup()
:php<?php // database/migrations/YYYYMMDDHHMMSS_create_user_table.php use think\migration\Migrator; use think\migration\db\Column; class CreateUserTable extends Migrator { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * http://docs.phinx.org/en/latest/migrations.html#the-change-method * * The following commands can be used in this method and Phinx will * automatically reverse them when rolling back: * * createTable * renameTable * addColumn * addCustomColumn * renameColumn * addIndex * addForeignKey * createDatabase * renameDatabase * dropTable * dropColumn * dropIndex * dropForeignKey */ public function change() { // Tạo bảng 'users' $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 50, 'comment' => 'Tên người dùng']) ->addColumn('email', 'string', ['limit' => 100, 'comment' => 'Địa chỉ email']) ->addIndex(['email'], ['unique' => true]) // Tạo chỉ mục duy nhất ->addTimestamps() // Thêm trường created_at, updated_at ->create(); // Tạo bảng } // Có thể dùng up() & down() nếu không sử dụng change() /* public function up() { $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 50, 'comment' => 'Tên người dùng']) ->addColumn('email', 'string', ['limit' => 100, 'comment' => 'Địa chỉ email']) ->addIndex(['email'], ['unique' => true]) ->addTimestamps() ->create(); } public function down() { $this->dropTable('users'); } */ }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62Chạy migration để tạo bảng
Trên terminal ServBay, tại thư mục gốc dự án, chạy:
bashphp think migrate:run
1Nếu thành công, database sẽ xuất hiện bảng mới
users
.
Ví dụ với MySQL
Giả sử bạn đã bật MySQL trên ServBay và config kết nối ở config/database.php
như đã hướng dẫn.
Kiểm tra cấu hình MySQL
Kiểm tra lại file
config/database.php
, đảm bảo thông tin kết nối chính xác.Thêm dữ liệu user vào MySQL
Có thể dùng Facade
Db
hoặc model ORM của ThinkPHP. Ví dụ dùngDb
:php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-add-user', function () { try { Db::table('users')->insert([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', // Email mẫu cho thương hiệu 'created_at' => date('Y-m-d H:i:s'), // Thêm time nếu addTimestamps() chưa tự thêm 'updated_at' => date('Y-m-d H:i:s'), ]); return 'User added successfully!'; } catch (\Exception $e) { return 'Error adding user: ' . $e->getMessage(); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Truy cập
https://thinkphp.servbay.demo/mysql-add-user
để thử thêm dữ liệu.Đọc dữ liệu từ bảng users
Dùng
Db
hoặc ORM để truy vấn như sau:php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-users', function () { $users = Db::table('users')->select(); return json($users); // Trả về dưới dạng JSON });
1
2
3
4
5
6
7
8Truy cập
https://thinkphp.servbay.demo/mysql-users
để xem dữ liệu bảng users.
Ví dụ với PostgreSQL
Giả sử dịch vụ PostgreSQL đã được bật và config trong config/database.php
.
Cấu hình kết nối PostgreSQL
Trong file
config/database.php
, đảm bảo có config sau (hoặc tuỳ chỉnh theo thực tế):php<?php // config/database.php (phần) return [ // ... các cấu hình khác ... 'connections' => [ // ... phần MySQL ... 'pgsql' => [ // Loại database 'type' => 'pgsql', // Địa chỉ server 'hostname' => env('database.hostname', '127.0.0.1'), // Tên database 'database' => env('database.database', 'servbay_thinkphp_app'), // Nên tạo riêng database // Tên người dùng 'username' => env('database.username', 'root'), // Mật khẩu 'password' => env('database.password', 'password'), // Mặc định của ServBay, chỉ dùng local // Port 'hostport' => env('database.hostport', '5432'), // Port mặc định // ... các config khác ... ], // ... các kênh kết nối khác ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27Lưu ý quan trọng:
- Hãy tạo database riêng cho dự án giống như với MySQL và chỉ dùng mật khẩu mặc định cho local.
Thêm user mẫu vào PostgreSQL
Dùng Facade
Db
, chỉ định kết nốipgsql
khi thao tác:php<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-add-user', function () { try { Db::connect('pgsql')->table('users')->insert([ 'name' => 'ServBay PgSQL User', 'email' => '[email protected]', // Email mẫu cho thương hiệu 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ]); return 'PostgreSQL User added successfully!'; } catch (\Exception $e) { return 'Error adding PostgreSQL user: ' . $e->getMessage(); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Truy cập
https://thinkphp.servbay.demo/pgsql-add-user
để kiểm tra.Đọc dữ liệu user từ PostgreSQL
Cũng dùng kết nối
pgsql
để truy vấn:php<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-users', function () { $users = Db::connect('pgsql')->table('users')->select(); // Dùng kênh pgsql return json($users); });
1
2
3
4
5
6
7
8Truy cập
https://thinkphp.servbay.demo/pgsql-users
để xem dữ liệu bảng users trong PostgreSQL.
Tổng kết
Sau các bước trên, bạn đã tự tin tạo, cấu hình và chạy thành công một dự án ThinkPHP 8 trong môi trường phát triển local của ServBay. Bạn biết cách dùng Composer để khởi tạo dự án, cấu hình máy chủ Web Caddy xử lý routing của ThinkPHP, kết nối và khai thác các cơ sở dữ liệu mạnh mẽ do ServBay cung cấp như MySQL, PostgreSQL, Memcached, Redis...
ServBay giúp thiết lập môi trường phát triển cho các framework PHP như ThinkPHP trở nên cực kỳ đơn giản, để bạn có thể tập trung tối đa cho việc xây dựng nghiệp vụ. Hãy tận dụng các phần mềm và tính năng ServBay cung cấp để phát triển ứng dụng ThinkPHP của bạn!