Tạo và vận hành dự án ThinkPHP 8 trong 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à vận hành một dự án PHP dựa trên 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 việc thiết lập dự án ThinkPHP trên máy cá nhân trở nên đơn giản hơn rất nhiều.
ThinkPHP là gì?
ThinkPHP là một framework phát triển PHP mã nguồn mở, nhanh chóng, đơn giản, hướng đối tượng, bắt nguồn từ Trung Quốc. Framework này tuân thủ nguyên tắc phát triển sạch sẽ, hiệu quả, với mục tiêu cung cấp công cụ thuận tiện cho lập trình viên xây dựng ứng dụng web hiện đại. Nhờ tính dễ dùng, chức năng mạnh mẽ (như ORM, routing linh hoạt, hệ thống template có sẵn, hỗ trợ cache...), cùng cộng đồng phát triển sôi nổi, ThinkPHP trở thành lựa chọn phổ biến cho phát triển PHP tại Trung Quốc.
Các đặc điểm nổi bật và lợi thế của ThinkPHP
- Đơn giản và hiệu quả: Thiết kế tối ưu, cấu trúc rõ ràng, dễ hiểu, dễ bảo trì, giúp tăng hiệu suất phát triển.
- Tích hợp đầy đủ chức năng: Sở hữu các module cần thiết cho phát triển web như kiến trúc MVC, ORM, engine template, bộ nhớ cache, quản lý session, xác thực quyền, form token...
- ORM mạnh mẽ: Cung cấp hệ thống ánh xạ quan hệ đối tượng dễ sử dụng, giúp đơn giản hóa thao tác với cơ sở dữ liệu.
- Quản lý routing linh hoạt: Hỗ trợ nhiều kiểu định nghĩa tuyến, đáp ứng nhu cầu cấu trúc URL phức tạp.
- Hệ sinh thái phong phú: Kho thư viện và plugin đa dạng, cộng đồng lập trình đông đảo, tài nguyên hỗ trợ dồi dào.
- Liên tục cập nhật: Phiên bản framework được làm mới thường xuyên, bắt kịp sự phát triển của PHP và xu hướng phát triển web.
ThinkPHP phù hợp với tất cả quy mô dự án web, từ nhỏ đến cấp doanh nghiệp lớn.
Sử dụng ServBay để thiết lập dự án ThinkPHP 8
ServBay tạo ra môi trường lý tưởng cho phát triển dự án ThinkPHP 8 local, bao gồm:
- Hỗ trợ sẵn nhiều phiên bản PHP cùng các extension phổ biến.
- Máy chủ Web (Caddy hoặc Nginx) cài đặt sẵn, dễ dàng cấu hình website.
- Tích hợp các dịch vụ cơ sở dữ liệu như MySQL, PostgreSQL, MongoDB, Redis, Memcached.
- Composer quản lý dependency đã được tích hợp.
Tài liệu này sẽ sử dụng các tính năng trên của ServBay để thiết lập nhanh dự án ThinkPHP 8 của bạn.
Điều kiện tiên quyết
Trước khi bắt đầu, hãy đảm bảo bạn đã:
- Tải về và cài đặt ServBay trên hệ điều hành macOS hoặc Windows.
- Khởi động ServBay, bật phiên bản PHP phù hợp (ThinkPHP 8 yêu cầu PHP 8.0 trở lên) và dịch vụ cơ sở dữ liệu (MySQL, PostgreSQL, Redis, Memcached...). Các dịch vụ này có thể kiểm tra/thay đổi trong tab “Phần mềm” (Packages) của ServBay.
Tạo dự án ThinkPHP
ServBay khuyến nghị lưu các file website local của bạn tại thư mục /Applications/ServBay/www
để thuận tiện trong quản lý.
Xác nhận Composer đã được cài đặt
ServBay đã tích hợp Composer khi cài đặt, bạn không cần phải cài thêm. 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, chạy lệnh sau để tạo dự án ThinkPHP 8 mới tại thư mục gốc ServBay:
bashcd /Applications/ServBay/www composer create-project topthink/think servbay-thinkphp-app
1
2Thư mục
servbay-thinkphp-app
sẽ được tạo ra tại/Applications/ServBay/www
, chứa kernel và dependency của ThinkPHP 8.Truy cập vào thư mục dự án
Sau khi tạo xong, vào thư mục dự án:
bashcd /Applications/ServBay/www/servbay-thinkphp-app
1
Khởi tạo cấu hình dự án
Sau khi dự án đã được khởi tạo, bạn cần thực hiện một số cấu hình cơ bản.
Cấu hình thông tin kết nối cơ sở dữ liệu
File cấu hình database thường nằm tại
config/database.php
. Tùy vào dịch vụ bạn đã bật trong ServBay, hãy sửa file này để điền thông tin kết nối chính xác.Đây là ví dụ cấu hình sử dụng 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'), // Cấu hình các kết nố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'), // Nên tạo database riêng cho từng dự án // Tên đăng nhập 'username' => env('database.username', 'root'), // Mật khẩu 'password' => env('database.password', 'password'), // Mật khẩu mặc định ServBay, chỉ dùng cho local! // Cổng kết nối 'hostport' => env('database.hostport', '3306'), // ... Cấu hình thêm ... ], // ... Cấu hình các 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:
- Hãy thay giá trị
database
bằng tên database thực tế của dự án (ví dụ, tạo qua phpMyAdmin hoặc Adminer trong ServBay). - Mật khẩu
root
mặc định làpassword
. Chỉ dùng cho môi trường phát triển local, tuyệt đối không dùng trên production! Nếu triển khai sản phẩm, hãy đặt mật khẩu mạnh và chỉ cấp quyền tối thiểu. - Nếu bạn quản lý biến môi trường qua file
.env
, hãy đảm bảo cấu hình trong đó ghi đè giá trị mặc định ởconfig/database.php
.
- Hãy thay giá trị
Cấu hình máy chủ Web
File entry của ThinkPHP là public/index.php
, và nó dùng quy tắc rewrite URL để routing. Vì routing ThinkPHP khác với link file tĩnh, bạn cần dùng quy tắc Rewrite có sẵn trong ServBay.
Trong giao diện thiết lập website, chọn mục Rewrite là ThinkPHP
, rồi nhấn lưu.
Xem hướng dẫn chi tiết tại Thêm website đầu tiên.
Thêm ví dụ code
Để test cấu hình website và routing cùng tính năng cơ bản của ThinkPHP, bạn có thể thêm một route và controller đơn giản.
Sửa file /Applications/ServBay/www/servbay-thinkphp-app/route/app.php
của dự án, thêm đoạn sau để tạo route GET:
php
<?php
// route/app.php
use think\facade\Route;
// Định nghĩa route 'servbay', truy cập /servbay sẽ thực thi hàm ẩn danh này
Route::get('servbay', function () {
return 'Hello ServBay!';
});
// ... Các route khác ...
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Truy cập website
Hoàn thành bước trên, bạn mở trình duyệt và truy cập URL ứng với domain local và route thử nghiệm:
https://thinkphp.servbay.demo/servbay
Nếu mọi thứ đã cấu hình đúng, bạn sẽ thấy dòng chữ Hello ServBay!
trên trình duyệt. Nghĩa là dự án ThinkPHP 8 của bạn đã chạy thành công trên môi trường ServBay, Web server và PHP-FPM đều hoạt động.
Ví dụ về cơ sở dữ liệu NoSQL
ServBay cài sẵn nhiều loại NoSQL database như Memcached, Redis. ThinkPHP có layer trừu tượng cache tiện lợi, dễ dàng tích hợp các dịch vụ này làm driver cache.
Ví dụ Memcached
Cài extension Memcached
ServBay đã cài sẵn extension Memcached cho PHP. Chỉ cần đảm bảo dịch vụ Memcached đã khởi động trong tab “Phần mềm” của ServBay.
Cấu hình cache Memcached
Sửa file
config/cache.php
để ThinkPHP dùng Memcached làm driver cache:php<?php // config/cache.php return [ // Driver cache mặc định 'default' => env('cache.driver', 'memcached'), // Cấu hình kết nối cache 'stores' => [ 'memcached' => [ // Loại cache 'type' => 'memcached', // Danh sách server 'host' => '127.0.0.1', // Địa chỉ listen mặc định Memcached của ServBay 'port' => 11211, // Port mặc định Memcached của ServBay 'persistent' => false, 'expire' => 0, 'timeout' => 0, 'prefix' => '', ], // ... 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
Tại controller hoặc route callback của bạn, dùng Facade
Cache
của ThinkPHP để thao tác cache:php<?php use think\facade\Cache; use think\facade\Route; Route::get('/memcached-example', function () { // Thiết lập cache, thời gian sống 600 giây Cache::set('my_memcached_key', 'Giá trị này từ Memcached!', 600); // Lấy cache $value = Cache::get('my_memcached_key'); return 'Giá trị lấy từ Memcached: ' . $value; });
1
2
3
4
5
6
7
8
9
10
11
12
13Truy cập
https://thinkphp.servbay.demo/memcached-example
để thử nghiệm.
Ví dụ Redis
Cài extension Redis
Extension Redis đã được đóng gói sẵn trong ServBay. Đảm bảo dịch vụ Redis đang chạy trong tab “Phần mềm” của ServBay.
Cấu hình cache Redis
Sửa file
config/cache.php
để ThinkPHP dùng Redis làm driver cache:php<?php // config/cache.php return [ // Driver cache mặc định 'default' => env('cache.driver', 'redis'), // Cấu hình kết nối cache 'stores' => [ 'redis' => [ // Loại cache 'type' => 'redis', // Địa chỉ server 'host' => env('cache.host', '127.0.0.1'), // Địa chỉ listen mặc định Redis của ServBay // Port 'port' => env('cache.port', 6379), // Port mặc định Redis của ServBay // Mật khẩu (Mặc định không có mật khẩu trong ServBay) 'password' => env('cache.password', ''), // Không có mật khẩu theo mặc định ServBay 'select' => 0, 'timeout' => 0, 'expire' => 0, 'persistent' => false, 'prefix' => '', ], // ... 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
23
24
25
26
27Lưu ý: Redis mặc định trong ServBay không đặt mật khẩu. Nếu bạn đặt mật khẩu cho Redis, hãy cập nhật trường
password
này.Sử dụng cache Redis trong code
Tại controller hoặc route callback, dùng Facade
Cache
của ThinkPHP để thao tác Redis:php<?php use think\facade\Cache; use think\facade\Route; Route::get('/redis-example', function () { // Thiết lập cache, sống mãi (hoặc truyền tham số thứ 3 để set thời gian) Cache::set('my_redis_key', 'Xin chào từ Redis!'); // Lấy cache $value = Cache::get('my_redis_key'); return 'Giá trị lấy từ 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 MySQL, PostgreSQL...—các database quan hệ phổ biến nhất hiện nay. ThinkPHP cung cấp ORM để thao tác thuận tiện với các loại database này.
Sử dụng công cụ migration của ThinkPHP
Thông thường, bạn nên dùng công cụ migration để quản lý thay đổi cấu trúc database, giúp phối hợp nhóm và kiểm soát phiên bản.
Cài đặt công cụ migration
Ở thư mục gốc dự án, cài extension migration của ThinkPHP:
bashcd /Applications/ServBay/www/servbay-thinkphp-app composer require topthink/think-migration
1
2Tạo file migration
Dùng CLI của ThinkPHP tạo file migration mới, ví dụ tạo bảng
users
:bashphp think migrate:create CreateUserTable
1File mới sẽ được tạo ở
database/migrations
, tên file gồm timestamp và tên bạn chọn (ví dụ20231027100000_create_user_table.php
).Sửa file migration
Vào thư mục migration, sửa hàm
up()
để định nghĩa cấu trúc bảngusers
:php<?php // database/migrations/YYYYMMDDHHMMSS_create_user_table.php use think\migration\Migrator; use think\migration\db\Column; class CreateUserTable extends Migrator { /** * Change Method. * * Viết migration đảo ngược được tại đây. * * Xem thêm hướng dẫn tại: * http://docs.phinx.org/en/latest/migrations.html#the-change-method * * Các lệnh sau có thể sử dụng trong method này và sẽ tự động rollback khi cần: * * createTable * renameTable * addColumn * addCustomColumn * renameColumn * addIndex * addForeignKey * createDatabase * renameDatabase * dropTable * dropColumn * dropIndex * dropForeignKey */ public function change() { // Tạo bảng bằng phương thức createTable $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 unique cho email ->addTimestamps() // Tạo trường created_at, updated_at ->create(); // Thực thi tạo bảng } // Nếu không dùng phương thức change, bạn có thể định nghĩa một cách riêng biệt /* 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
61Chạy migration tạo bảng database
Đảm bảo terminal ServBay ở thư mục gốc dự án, chạy lệnh tạo bảng
users
:bashphp think migrate:run
1Nếu thành công, database sẽ xuất hiện bảng
users
.
Ví dụ MySQL
Giả sử bạn đã bật MySQL trong ServBay và cấu hình kết nối MySQL ở config/database.php
.
Cấu hình kết nối MySQL
Tham khảo mẫu cấu hình MySQL ở phần "Khởi tạo cấu hình dự án" phía trên, đảm bảo thông tin chính xác.
Ghi dữ liệu người dùng vào code
Dùng Facade
Db
hoặc model ORM của ThinkPHP để chèn dữ liệu. Đây là ví dụ với FacadeDb
:php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-add-user', function () { try { Db::table('users')->insert([ 'name' => 'Người dùng demo ServBay', 'email' => 'demo@servbay.demo', // Email ví dụ theo thương hiệu 'created_at' => date('Y-m-d H:i:s'), // Thêm timestamp nếu addTimestamps() không tự động điền 'updated_at' => date('Y-m-d H:i:s'), ]); return 'Thêm người dùng thành công!'; } catch (\Exception $e) { return 'Lỗi thêm người dùng: ' . $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 người dùng bằng code
Dùng Facade
Db
hoặc model ORM để truy vấn dữ liệu:php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-users', function () { $users = Db::table('users')->select(); // Lấy danh sách user 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ảngusers
.
Ví dụ PostgreSQL
Giả sử bạn đã bật PostgreSQL trong ServBay và cấu hình kết nối trong config/database.php
.
Cấu hình kết nối PostgreSQL
Trong file
config/database.php
, hãy thêm cấu hình phù hợp:php<?php // config/database.php (phần dữ liệu) return [ // ... Các cấu hình khác ... 'connections' => [ // ... 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 database riêng cho từng dự án // Tên đăng nhập 'username' => env('database.username', 'root'), // Mật khẩu 'password' => env('database.password', 'password'), // Mật khẩu mặc định ServBay, chỉ dùng local! // Port 'hostport' => env('database.hostport', '5432'), // Port mặc định PostgreSQL // ... Cấu hình khác ... ], // ... Kết nối 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:
- Gợi ý tạo database riêng cho mỗi dự án, điền chính xác tên trong cấu hình.
- Tài khoản
root
cho PostgreSQL mặc định cũng dùng passwordpassword
. Chỉ dùng cho phát triển local.
Ghi dữ liệu người dùng bằng code
Dùng Facade
Db
hoặc ORM, nhớ chọn kết nốipgsql
:php<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-add-user', function () { try { Db::connect('pgsql')->table('users')->insert([ 'name' => 'Người dùng ServBay PgSQL', 'email' => 'pgsql-demo@servbay.demo', // Email ví dụ theo thương hiệu // Có thể cần tự điền timestamp, tùy vào định nghĩa migration và version ThinkPHP 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ]); return 'Thêm người dùng PostgreSQL thành công!'; } catch (\Exception $e) { return 'Lỗi thêm người dùng PostgreSQL: ' . $e->getMessage(); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18Truy cập
https://thinkphp.servbay.demo/pgsql-add-user
để thử thêm dữ liệu.Đọc dữ liệu người dùng
Truy vấn từ database PostgreSQL:
php<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-users', function () { $users = Db::connect('pgsql')->table('users')->select(); 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 người dùng từ PostgreSQL.
Tổng kết
Bằng những bước trên, bạn đã hoàn thành việc tạo, cấu hình và vận hành dự án ThinkPHP 8 trên môi trường phát triển local ServBay. Bạn đã biết cách sử dụng Composer tạo dự án, cấu hình máy chủ web Caddy để routing ThinkPHP, và kết nối cùng sử dụng các loại database MySQL, PostgreSQL, Memcached, Redis có sẵn trong ServBay.
ServBay đã đơn giản hóa quá trình thiết lập môi trường local cho framework PHP như ThinkPHP, giúp bạn tập trung phát triển nghiệp vụ. Hãy tiếp tục mở rộng ứng dụng ThinkPHP của bạn và tận dụng tối đa các phần mềm, dịch vụ ServBay cung cấp!