Tạo và Vận hành Dự án Yii 2 trên ServBay
Giới thiệu: Yii 2 là gì?
Yii 2 là một framework PHP hiệu suất cao, dựa trên thành phần (component-based), dành cho việc phát triển nhanh các ứng dụng web hiện đại. Framework này tuân thủ mô hình thiết kế MVC (Model-View-Controller), mang lại bộ tính năng và công cụ phong phú giúp lập trình viên xây dựng ứng dụng web linh hoạt, dễ mở rộng và chất lượng cao một cách hiệu quả. Yii 2 nổi bật nhờ hiệu năng mạnh mẽ, kiến trúc linh hoạt cùng hệ thống tính năng tích hợp sẵn mạnh như cache, bảo mật, hỗ trợ phát triển API RESTful,...
Tính năng nổi bật và ưu điểm của Yii 2
- Hiệu năng cao: Yii 2 được tối ưu kỹ lưỡng, có khả năng xử lý số lượng lớn truy vấn đồng thời, phù hợp xây dựng ứng dụng cần hiệu suất cao.
- Tính mô-đun: Cấu trúc framework được thiết kế mô-đun hóa linh hoạt, dễ tổ chức code và tái sử dụng thành phần.
- Bảo mật: Tích hợp các tính năng bảo mật chuẩn như xác thực dữ liệu đầu vào, lọc đầu ra, chống CSRF/XSS, framework xác thực và phân quyền,...
- Dễ sử dụng: API rõ ràng, trực quan, tài liệu phong phú giúp tiếp cận nhanh chóng.
- Cộng đồng mạnh mẽ: Cộng đồng lập trình viên đông đảo, nhiều thư viện mở rộng hỗ trợ, dễ tìm kiếm sự trợ giúp khi gặp vấn đề.
- Công cụ hỗ trợ phát triển: Tích hợp CLI cho các tác vụ như migration cơ sở dữ liệu, sinh code mẫu,... giúp nâng cao hiệu suất dev.
Yii 2 là sự lựa chọn lý tưởng cho các dự án ứng dụng doanh nghiệp, API RESTful, portal website,... và nhiều loại ứng dụng web khác.
Chạy Dự án Yii 2 với ServBay
ServBay là môi trường phát triển web cục bộ cho macOS, tích hợp sẵn PHP, các hệ cơ sở dữ liệu (MySQL, PostgreSQL, MongoDB, Redis), web server (Caddy, Nginx) và nhiều công cụ developer khác (Composer, Node.js, Python, Go, Java...), hướng đến trải nghiệm "cài là chạy".
Bài hướng dẫn này sẽ chỉ bạn tận dụng môi trường PHP, công cụ Composer, và dịch vụ database trong ServBay để tạo & chạy dự án Yii 2. Chúng ta sẽ sử dụng tính năng “Website” của ServBay để định cấu hình web server truy cập local và trình diễn các tính năng cơ bản.
Điều kiện cần
Trước khi bắt đầu, hãy đảm bảo bạn đã:
- Cài đặt và mở ServBay thành công trên hệ điều hành macOS.
- Đã cài đặt và kích hoạt phiên bản PHP phù hợp (ví dụ: PHP 8.3 hoặc cao hơn) trong ServBay.
- Đã cài đặt và kích hoạt dịch vụ cơ sở dữ liệu phù hợp (MySQL hoặc PostgreSQL) và dịch vụ cache (Memcached và Redis) trong ServBay.
Bạn có thể kiểm tra, quản lý các thành phần trên ngay tại giao diện chính của ServBay.
Tạo Dự án Yii 2
TIP
ServBay khuyến nghị lưu mã nguồn của bạn trong thư mục /Applications/ServBay/www
. Cách này giúp cấu trúc dự án rõ ràng, dễ tận dụng tính năng “Website” của ServBay để quản lý.
Composer: ServBay đã tích hợp sẵn Composer, bạn không cần cài đặt riêng. Có thể sử dụng lệnh
composer
trực tiếp trong Terminal.Tạo thư mục dự án: Mở Terminal, chuyển đến thư mục root của website ServBay và tạo thư mục mới cho dự án Yii 2:
bashcd /Applications/ServBay/www mkdir servbay-yii2-app cd servbay-yii2-app
1
2
3Tạo dự án Yii 2 bằng Composer: Tại thư mục
servbay-yii2-app
, chạy lệnh Composer để thiết lập template ứng dụng cơ bản của Yii 2:bashcomposer create-project --prefer-dist yiisoft/yii2-app-basic .
1Lệnh này sẽ tải về template và các package phụ thuộc cần thiết vào thư mục hiện tại (
.
). Quá trình sẽ mất vài phút, vui lòng chờ Composer tải và cài đặt.Truy cập thư mục dự án: Xác nhận Terminal hiện tại đang ở root dự án
/Applications/ServBay/www/servbay-yii2-app
. Các lệnh tiếp theo cần thực thi tại đây.bashcd /Applications/ServBay/www/servbay-yii2-app
1
Cấu Hình Khởi Tạo
Sau khi tạo xong dự án Yii 2, bạn cần cấu hình kết nối database và các component thiết yếu.
Cấu hình kết nối cơ sở dữ liệu: Mở file
config/db.php
tại thư mục gốc dự án. Tùy loại database đang sử dụng trong ServBay (MySQL hoặc PostgreSQL) và thông tin tài khoản (bình thườngroot
/password
nếu bạn chưa thay đổi), cập nhật lại các thông số kết nối.Đầu tiên, hãy tạo một database mới trong dịch vụ database của ServBay, ví dụ đặt tên là
servbay_yii2_app
. Bạn có thể dùng công cụ Adminer (có sẵn trong ServBay) hoặc các client ưa thích khác (Sequel Ace, TablePlus, ...). Adminer truy cập được từ khu vực database của giao diện ServBay.Với MySQL:
php<?php return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=127.0.0.1;dbname=servbay_yii2_app', // dbname: tên database vừa tạo 'username' => 'root', // Tên đăng nhập database 'password' => 'password', // Mật khẩu database 'charset' => 'utf8mb4', // Nên để utf8mb4 để hỗ trợ bộ ký tự mở rộng ];
1
2
3
4
5
6
7
8
9Với PostgreSQL:
php<?php return [ 'class' => 'yii\db\Connection', 'dsn' => 'pgsql:host=127.0.0.1;port=5432;dbname=servbay_yii2_app', // dbname: tên database vừa tạo, port mặc định là 5432 'username' => 'root', 'password' => 'password', 'charset' => 'utf8', 'schemaMap' => [ 'pgsql' => [ 'class' => 'yii\pgsql\Schema', 'defaultSchema' => 'public', // Schema mặc định của PostgreSQL ], ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15Hãy lựa chọn mẫu file phù hợp với thực tế và điều chỉnh nội dung
config/db.php
.Cấu hình cache và Redis: Mở file
config/web.php
tại thư mục gốc dự án. Cập nhật mụccomponents
để cấu hình Memcached và Redis. Cổng mặc định của Memcached trong ServBay là11211
, Redis là6379
.php<?php // ... Các cấu hình khác 'components' => [ // ... Các cấu hình components khác (request, cache, user, errorHandler, log, urlManager ...) 'cache' => [ 'class' => 'yii\caching\MemCache', 'servers' => [ [ 'host' => '127.0.0.1', 'port' => 11211, // Cổng mặc định Memcached 'weight' => 100, ], ], ], 'redis' => [ 'class' => 'yii\redis\Connection', 'hostname' => '127.0.0.1', 'port' => 6379, // Cổng mặc định Redis 'database' => 0, // Chỉ mục database Redis mặc định ], // ... Các thành phần khác ], // ... Các cấu hình 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
27
28Hãy đảm bảo bạn đã khởi động dịch vụ Memcached & Redis trong ServBay. Lưu ý, để dùng Redis làm cache, phải cài gói
yiisoft/yii2-redis
(Composer cài các phụ thuộc cơ bản tự động, nhưng nếu thiếu cần tự dùngcomposer require yiisoft/yii2-redis
). Tương tự với Memcached làyiisoft/yii2-memcached
. Template cơ bản có thể đã sẵn những phụ thuộc này.
Cấu Hình Web Server (Website của ServBay)
Sử dụng tính năng “Website” của ServBay để cấu hình web server (Caddy hoặc Nginx) trỏ vào dự án Yii 2 của bạn.
- Mở ứng dụng ServBay: Khởi động ServBay.
- Truy cập cài đặt Website: Chọn mục “Website” tại giao diện ServBay.
- Thêm website mới: Bấm nút thêm website (thường là dấu
+
hoặc nútThêm
). - Điền thông tin website:
- Tên: Đặt tên dễ nhớ, ví dụ
My First Yii 2 Dev Site
. - Tên miền: Chọn tên miền bạn muốn sử dụng trong trình duyệt, ví dụ
servbay-yii2-test.local
. ServBay tự động cấu hình DNS trỏ tên miền này về127.0.0.1
. - Loại website: Chọn
PHP
. - Phiên bản PHP: Chọn đúng phiên bản PHP bạn đã cài & kích hoạt (ví dụ
8.3
). - Thư mục gốc website: BƯỚC QUAN TRỌNG! Với template basic của Yii 2, entry point là thư mục
web
trong root dự án. Vậy nên PATH thư mục phải là:/Applications/ServBay/www/servbay-yii2-app/web
.
- Tên: Đặt tên dễ nhớ, ví dụ
- Lưu và áp dụng thay đổi: Lưu cấu hình. ServBay tự reload cấu hình web server để website hoạt động ngay.
Tham khảo hướng dẫn chi tiết tại tài liệu ServBay: Thêm website đầu tiên.
ServBay sẽ tự động cấp và tin cậy chứng chỉ SSL cho tên miền local bạn vừa thiết lập (thông qua ServBay User CA hoặc ServBay Public CA), giúp bạn truy cập website an toàn qua HTTPS.
Thêm Code Mẫu Để Minh Họa Chức Năng
Để minh họa sử dụng database và cache, hãy thêm một số action ví dụ vào controller mặc định của Yii 2.
Mở file controllers/SiteController.php
ở thư mục gốc, thêm các phương thức sau vào class SiteController
:
<?php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use yii\web\Response;
use yii\db\Exception as DbException; // Import class Exception DB
class SiteController extends Controller
{
/**
* Hiển thị trang chủ.
*
* @return string
*/
public function actionIndex()
{
return $this->render('index');
}
/**
* Ví dụ sử dụng Memcached.
*
* @return Response
*/
public function actionMemcached()
{
$cache = Yii::$app->cache;
$key = 'my_memcached_test_key';
$data = 'Hello Memcached from ServBay!';
$duration = 60; // Lưu cache 60 giây
if ($cache->set($key, $data, $duration)) {
$value = $cache->get($key);
return $this->asText("Memcached đã ghi dữ liệu thành công. Giá trị truy xuất: " . $value);
} else {
return $this->asText("Không thể ghi dữ liệu vào Memcached. Vui lòng kiểm tra dịch vụ Memcached và cấu hình.");
}
}
/**
* Ví dụ sử dụng Redis.
*
* @return Response
*/
public function actionRedis()
{
$redis = Yii::$app->redis;
$key = 'my_redis_test_key';
$data = 'Hello Redis from ServBay!';
try {
if ($redis->set($key, $data)) {
$value = $redis->get($key);
return $this->asText("Redis đã ghi dữ liệu thành công. Giá trị truy xuất: " . $value);
} else {
return $this->asText("Không thể ghi dữ liệu vào Redis. Vui lòng kiểm tra dịch vụ và cấu hình Redis.");
}
} catch (\yii\base\Exception $e) {
return $this->asText("Lỗi Redis: " . $e->getMessage() . ". Vui lòng kiểm tra dịch vụ và cấu hình Redis.");
}
}
/**
* Ví dụ thêm user vào database.
* Giả sử đã có bảng 'users'.
*
* @return Response
*/
public function actionMysqlAdd() // Có thể dùng cho PostgreSQL nếu config đúng
{
try {
$count = Yii::$app->db->createCommand()->insert('users', [
'name' => 'ServBay Demo User', // Tên mẫu gắn thương hiệu
'email' => '[email protected]', // Email mẫu gắn thương hiệu
])->execute();
return $this->asText("Thêm user thành công. Số dòng ảnh hưởng: " . $count);
} catch (DbException $e) {
return $this->asText("Không thể thêm user vào database. Lỗi: " . $e->getMessage() . ". Vui lòng kiểm tra dịch vụ database, cấu hình, và chắc chắn đã có bảng 'users'.");
}
}
/**
* Ví dụ truy vấn user từ database.
* Giả sử đã có bảng 'users'.
*
* @return Response
*/
public function actionMysql() // Có thể dùng cho PostgreSQL nếu config đúng
{
try {
$users = Yii::$app->db->createCommand('SELECT id, name, email FROM users')->queryAll();
// Định dạng output, tránh trả về data rối hoặc nhạy cảm
$output = "Danh sách user:\n";
foreach ($users as $user) {
$output .= "- ID: {$user['id']}, Tên: {$user['name']}, Email: {$user['email']}\n";
}
return $this->asText($output);
} catch (DbException $e) {
return $this->asText("Không thể truy vấn user. Lỗi: " . $e->getMessage() . ". Vui lòng kiểm tra dịch vụ database, cấu hình và đảm bảo đã có bảng 'users'.");
}
}
// Nếu dùng PostgreSQL, bạn có thể thêm action phương thức riêng, nhưng thông thường chỉ cần dùng chung component db
// public function actionPgsqlAdd() { ... }
// public function actionPgsql() { ... }
/**
* Trả kết quả dạng văn bản thuần túy.
* @param string $text
* @return Response
*/
protected function asText($text)
{
Yii::$app->response->format = Response::FORMAT_RAW;
Yii::$app->response->getHeaders()->add('Content-Type', 'text/plain');
return $text;
}
/**
* Trả kết quả dạng JSON.
* @param mixed $data
* @return Response
*/
protected function asJson($data)
{
Yii::$app->response->format = Response::FORMAT_JSON;
return $data;
}
}
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
Lưu ý, action actionMysqlAdd
và actionMysql
đã được bổ sung xử lý lỗi, điều chỉnh output cho rõ ràng. Tên người dùng và email demo cũng mang tính thương hiệu ServBay.
Mở file view views/site/index.php
, file này là template cho actionIndex. Bạn có thể giữ nội dung mặc định hoặc chỉnh sửa:
<?php
/* @var $this yii\web\View */
/* @var $name string */
/* @var $message string */
/* @var $exception Exception */
use yii\helpers\Html;
$this->title = 'My Yii2 Application on ServBay'; // Cập nhật tiêu đề
?>
<div class="site-index">
<div class="jumbotron">
<h1>Congratulations!</h1>
<p class="lead">Bạn đã tạo thành công ứng dụng Yii2 và cấu hình nó với ServBay!</p>
<p><a class="btn btn-lg btn-success" href="https://www.yiiframework.com">Bắt đầu với Yii</a></p>
</div>
<div class="body-content">
<h2>Trình diễn chức năng</h2>
<ul>
<li><a href="<?= Html::toRoute('site/memcached') ?>">Kiểm tra Memcached</a></li>
<li><a href="<?= Html::toRoute('site/redis') ?>">Kiểm tra Redis</a></li>
<li><a href="<?= Html::toRoute('site/mysql-add') ?>">Thêm user vào DB</a> (cần có bảng 'users')</li>
<li><a href="<?= Html::toRoute('site/mysql') ?>">Lấy danh sách user từ DB</a> (cần có bảng 'users')</li>
</ul>
<p>Vui lòng đảm bảo Memcached, Redis và dịch vụ cơ sở dữ liệu (MySQL/PostgreSQL) đều đang chạy trong ServBay và đã cấu hình đúng trong `config/web.php` và `config/db.php`.</p>
<p>Để chạy ví dụ với database, bạn cần tạo bảng 'users' bằng migration (hướng dẫn bên dưới).</p>
</div>
</div>
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
Trong view này đã bổ sung các liên kết tiện lợi để test các action controller vừa tạo.
Database Quan Hệ: Tạo Bảng Bằng Migration
Để chạy ví dụ database (actionMysqlAdd
, actionMysql
), bạn cần tạo bảng users
trong database. Yii khuyến nghị sử dụng migration để kiểm soát sự thay đổi cấu trúc DB.
Tạo file migration với Gii tool: Mở terminal, kiểm tra vị trí đang ở thư mục dự án
/Applications/ServBay/www/servbay-yii2-app
, chạy lệnh sau để tạo file migration mới.bashphp yii migrate/create create_users_table
1Bạn sẽ được hỏi xác nhận, nhập
yes
. File PHP mới sẽ được sinh ra trong thư mụcmigrations
, tên file dạngmYYYYMMDD_HHMMSS_create_users_table.php
.Chỉnh sửa file migration: Mở file vừa tạo, cập nhật hàm
up()
để định nghĩa cấu trúc bảngusers
.php<?php use yii\db\Migration; /** * Tạo bảng `{{%users}}`. */ class mXXXXXXXXXXXXXX_create_users_table extends Migration // XXXXXXXXXXXXXX là timestamp { /** * {@inheritdoc} */ public function up() { $this->createTable('{{%users}}', [ // Dùng {{%users}} để hỗ trợ table prefix nếu có 'id' => $this->primaryKey(), 'name' => $this->string()->notNull(), 'email' => $this->string()->notNull()->unique(), 'created_at' => $this->timestamp()->defaultExpression('CURRENT_TIMESTAMP'), 'updated_at' => $this->timestamp()->defaultExpression('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), ]); // Tùy chọn: Tạo chỉ mục để tăng hiệu suất truy vấn $this->createIndex( 'idx-users-email', '{{%users}}', 'email', true // true tức là unique index ); } /** * {@inheritdoc} */ public function down() { // Xóa chỉ mục $this->dropIndex( 'idx-users-email', '{{%users}}' ); // Xóa bảng $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Đổi tên
mXXXXXXXXXXXXXX_create_users_table
thành tên file thực tế bạn vừa tạo.Chạy migration: Đảm bảo bạn đang ở đúng directory dự án, chạy lệnh sau để tạo bảng theo định nghĩa trong migration:
bashphp yii migrate
1Xác nhận thực thi khi được hỏi. Nếu tất cả chính xác, bạn sẽ thấy thông báo tạo bảng thành công.
Truy Cập Website và Kiểm Tra
Bây giờ bạn có thể mở trình duyệt và truy cập tên miền vừa tạo, ví dụ: https://servbay-yii2-test.local
.
- Truy cập
https://servbay-yii2-test.local
: Hiện trang chào mừng của Yii 2 cùng các link trình diễn vừa thêm tại viewindex.php
. - Click "Kiểm tra Memcached" hoặc truy cập
https://servbay-yii2-test.local/index.php?r=site/memcached
: Nếu dịch vụ Memcached hoạt động, bạn sẽ thấy "Memcached đã ghi dữ liệu thành công..." - Click "Kiểm tra Redis" hoặc
https://servbay-yii2-test.local/index.php?r=site/redis
: Nếu cấu hình đúng, bạn sẽ thấy "Redis đã ghi dữ liệu thành công..." - Click "Thêm user vào DB" hoặc
https://servbay-yii2-test.local/index.php?r=site/mysql-add
: Nếu database đã tạo bảngusers
, bạn sẽ nhận được thông báo "Thêm user thành công..." (mỗi lần click sẽ cố gắng thêm một user mới, trừ trường hợp trùng email). - Click "Lấy danh sách user từ DB" hoặc
https://servbay-yii2-test.local/index.php?r=site/mysql
: Nếu database đã có bảngusers
, bạn sẽ nhận được danh sách user truy vấn được.
Nếu gặp lỗi, kiểm tra các dịch vụ tương ứng (PHP, web server, database, Memcached, Redis) trong ServBay đã chạy chưa, đồng thời kiểm tra lại cấu hình các file (config/db.php
, config/web.php
) và đảm bảo đã tạo thành công bảng database.
Câu Hỏi Thường Gặp (FAQ)
- Tại sao truy cập tên miền báo “Không thể truy cập website này” hoặc lỗi chứng chỉ? Hãy chắc chắn đã thêm tên miền vào mục “Website” của ServBay và ứng dụng ServBay vẫn đang hoạt động. ServBay sẽ tự động cấu hình DNS local và SSL certificate. Nếu lỗi chứng chỉ, xác minh bạn đã “Trust” ServBay User CA hoặc ServBay Public CA theo hướng dẫn trong tài liệu ServBay.
- Không chạy được lệnh Composer? Hãy kiểm tra package Composer đã bật trong giao diện ServBay và bạn đang ở trong Terminal của macOS. ServBay tự động thêm Composer vào PATH.
- Database không kết nối được? Xác nhận dịch vụ database (MySQL/PostgreSQL) đã chạy trong ServBay. Kiểm tra lại các trường
dsn
,username
,password
trongconfig/db.php
phải đúng với thông tin database. Và nhớ tạo databaseservbay_yii2_app
trước (có thể dùng Adminer để kiểm tra). - Memcached/Redis không kết nối được? Đảm bảo hai dịch vụ này đã khởi động trong ServBay. Kiểm tra thông tin
host
vàport
ởconfig/web.php
có chính xác chưa (thường là127.0.0.1
, port mặc định tương ứng). - Chạy migration (
php yii migrate
) báo lỗi? Xác nhận cấu hìnhconfig/db.php
đã đúng, dịch vụ database chạy ổn và database đã tạo xong. - Action
MysqlAdd
/Mysql
báo thiếu bảng? Hãy chắc chắn đã chạyphp yii migrate
để tạo bảngusers
. - Xem log lỗi PHP ở đâu? ServBay quản lý tập trung log PHP, web server,... Bạn có thể xem các log này tại mục “Log” trong ứng dụng ServBay, rất tiện cho việc dò lỗi.
Tổng Kết
Với ServBay, việc thiết lập môi trường phát triển cục bộ đầy đủ tính năng để chạy dự án Yii 2 trên macOS trở nên đơn giản. ServBay mang đến Composer tích hợp, quản lý phiên bản PHP, các dịch vụ database/cache xây dựng sẵn cùng tính năng tạo website local trực quan, giúp quá trình phát triển và triển khai Yii 2 cực kỳ thuận tiện. Làm theo hướng dẫn trên, bạn sẽ nhanh chóng bắt đầu được hành trình lập trình với Yii 2, tận dụng thế mạnh công cụ ServBay để tối ưu hiệu suất công việc.
Chúc bạn code vui và hiệu quả!