Tạo và chạy dự án Yii 2 trên ServBay
Tổng quan: Yii 2 là gì?
Yii 2 là một framework PHP hiệu suất cao, dựa trên kiến trúc component, dùng để phát triển ứng dụng web hiện đại một cách nhanh chóng. Framework này tuân thủ mô hình thiết kế MVC (Model-View-Controller), cung cấp bộ công cụ và tính năng vô cùng mạnh mẽ giúp lập trình viên xây dựng ứng dụng web chất lượng cao, dễ mở rộng một cách hiệu quả. Yii 2 được ưa chuộng nhờ hiệu năng xuất sắc, kiến trúc linh hoạt và các tính năng tích hợp vượt trội như cache, bảo mật, hỗ trợ phát triển RESTful API...
Tính năng nổi bật và lợi ích của Yii 2
- Hiệu suất cao: Yii 2 được tối ưu kỹ lưỡng, xử lý tốt các yêu cầu đồng thời lớn, phù hợp với các ứng dụng yêu cầu hiệu năng.
- Tính module hóa: Thiết kế framework rất linh hoạt, giúp tổ chức code và tái sử dụng các thành phần dễ dàng.
- Bảo mật: Tích hợp nhiều lớp bảo mật như xác thực đầu vào, lọc đầu ra, chống CSRF/XSS, và framework xác thực phân quyền.
- Dễ sử dụng: API đơn giản, tài liệu chi tiết giúp giảm độ khó khi tiếp cận và giúp phát triển nhanh chóng.
- Cộng đồng mạnh mẽ: Có cộng đồng lập trình viên lớn, nhiều extension bên thứ ba để hỗ trợ khi gặp vấn đề.
- Công cụ tích hợp: Có console tool phục vụ migration database, sinh code, nâng cao hiệu suất phát triển.
Yii 2 là lựa chọn lý tưởng để xây dựng ứng dụng cấp doanh nghiệp, RESTful API, web portal và nhiều loại dự án web khác.
Chạy dự án Yii 2 trên ServBay
ServBay là môi trường phát triển web local dành cho macOS và Windows, tích hợp sẵn PHP, các hệ quản trị cơ sở dữ liệu như MySQL, PostgreSQL, MongoDB, Redis, các web server (Caddy, Nginx) và nhiều công cụ dành cho lập trình viên như Composer, Node.js, Python, Go, Java... ServBay được thiết kế để bạn có thể “sử dụng ngay” mà không cần tốn nhiều thời gian cài đặt.
Tài liệu này sẽ hướng dẫn bạn sử dụng môi trường PHP, công cụ Composer và dịch vụ database của ServBay để tạo và chạy một ứng dụng Yii 2 cơ bản. Chúng ta sẽ tận dụng tính năng “Website” của ServBay để cấu hình web server local và thực hiện truy cập, demo các chức năng cơ bản thông qua các bước đơn giản.
Yêu cầu trước khi bắt đầu
Trước khi thực hiện, hãy đảm bảo rằng bạn đã:
- Cài đặt và đang chạy ServBay trên macOS hoặc Windows.
- Đã cài và bật đúng phiên bản PHP cần dùng trong ServBay (ví dụ PHP 8.3 trở lên).
- Đã cài và bật dịch vụ database (MySQL hoặc PostgreSQL) cũng như dịch vụ cache (Memcached và Redis) trong ServBay.
Bạn có thể quản lý trạng thái các package trên màn hình chính của ServBay.
Tạo dự án Yii 2
TIP
ServBay khuyến nghị lưu file dự án ở các thư mục sau. Điều này giúp quản lý file khoa học và thuận tiện cho tính năng “Website” của ServBay:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Composer: ServBay đã tích hợp Composer sẵn, bạn không cần cài thêm. Hãy dùng trực tiếp lệnh
composer
trong terminal.Tạo thư mục dự án: Mở terminal, chuyển vào thư mục gốc web của ServBay và tạo thư mục mới cho dự án.
macOS:
bashcd /Applications/ServBay/www mkdir servbay-yii2-app cd servbay-yii2-app
1
2
3Windows:
cmdcd C:\ServBay\www mkdir servbay-yii2-app cd servbay-yii2-app
1
2
3Tạo dự án Yii 2 bằng Composer: Trong thư mục
servbay-yii2-app
, chạy lệnh sau để tạo template ứng dụng cơ bản Yii 2.bashcomposer create-project --prefer-dist yiisoft/yii2-app-basic .
1Lệnh này sẽ tải template Yii 2 và các package phụ thuộc vào thư mục hiện tại (
.
). Vui lòng chờ Composer tải và cài đầy đủ.Chuyển vào thư mục dự án: Đảm bảo terminal đang đứng ở thư mục gốc dự án. Các lệnh tiếp theo đều chạy tại đây.
macOS:
bashcd /Applications/ServBay/www/servbay-yii2-app
1Windows:
cmdcd C:\ServBay\www\servbay-yii2-app
1
Cấu hình khởi tạo
Sau khi tạo dự án Yii 2, bạn cần cấu hình các kết nối cơ bản, đặc biệt là cấu hình database và các component.
Cấu hình kết nối database: Mở file
config/db.php
ở thư mục gốc dự án và cập nhật thông tin kết nối theo dịch vụ database bạn đang dùng trong ServBay (MySQL hoặc PostgreSQL), và các cấu hình (user mặc định thường làroot
, password thường làpassword
nếu bạn chưa thay đổi).Trước tiên, hãy tạo một database mới ví dụ đặt tên là
servbay_yii2_app
trong dịch vụ database của ServBay. Có thể dùng công cụ Adminer tích hợp sẵn của ServBay hoặc các client yêu thích như Sequel Ace, TablePlus... Adminer truy cập từ mục database trong giao diện ServBay.Đối với MySQL:
php<?php return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=127.0.0.1;dbname=servbay_yii2_app', // dbname là tên database vừa tạo 'username' => 'root', // Tên tài khoản database 'password' => 'password', // Mật khẩu database 'charset' => 'utf8mb4', // Nên dùng utf8mb4 để hỗ trợ đa dạng ký tự ];
1
2
3
4
5
6
7
8
9Đối với PostgreSQL:
php<?php return [ 'class' => 'yii\db\Connection', 'dsn' => 'pgsql:host=127.0.0.1;port=5432;dbname=servbay_yii2_app', // dbname là tên database vừa tạo, port mặc định là 5432 'username' => 'root', // Tên tài khoản database 'password' => 'password', // Mật khẩu database '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
15Chọn và chỉnh sửa file
config/db.php
phù hợp với thực tế.Cấu hình cache và component Redis: Mở file
config/web.php
ở thư mục gốc dự án, bổ sung/sửa phầncomponents
để cấu hình Memcached và Redis. Memcached của ServBay mặc định port là11211
, Redis là6379
.php<?php // ... các cấu hình khác 'components' => [ // ... các cấu hình component khác (request, cache, user, errorHandler, log, urlManager...) 'cache' => [ 'class' => 'yii\caching\MemCache', 'servers' => [ [ 'host' => '127.0.0.1', 'port' => 11211, // Port mặc định của Memcached 'weight' => 100, ], ], ], 'redis' => [ 'class' => 'yii\redis\Connection', 'hostname' => '127.0.0.1', 'port' => 6379, // Port mặc định của Redis 'database' => 0, // Chỉ số database Redis ], // ... component khá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 Memcached và Redis đã được bật trên ServBay. Lưu ý rằng muốn dùng Redis cho cache bạn cần cài thêm package
yiisoft/yii2-redis
(Composer sẽ cài deps cơ bản, nếu thiếu hãy chạycomposer require yiisoft/yii2-redis
). Memcached thường dùngyiisoft/yii2-memcached
. Template cơ bản có thể đã bao gồm các gói này.
Cấu hình Web Server (Website ServBay)
Dùng tính năng “Website” của ServBay để cấu hình web server local (Caddy hoặc Nginx) trỏ đến dự án Yii 2.
- Mở ứng dụng ServBay: Khởi động ServBay.
- Đi tới cấu hình Website: Trong giao diện ServBay, chuyển đến mục “Website” hoặc tên tương tự.
- Thêm website mới: Nhấn nút thêm website mới (thường là
+
hoặcThêm
). - Nhập thông tin website:
- Tên: Đặt tên dễ nhận biết, ví dụ
My First Yii 2 Dev Site
. - Domain: Gõ domain bạn muốn dùng trên trình duyệt, ví dụ
servbay-yii2-test.local
. ServBay tự động cấu hình DNS local trỏ domain về127.0.0.1
. - Loại website: Chọn
PHP
. - Phiên bản PHP: Chọn PHP phù hợp (ví dụ
8.3
). Đảm bảo đã cài và bật phiên bản đó. - Thư mục gốc website: Cực kỳ quan trọng. Với template cơ bản của Yii 2, entry-point là thư mục
web
trong dự án. Hãy nhập:- macOS:
/Applications/ServBay/www/servbay-yii2-app/web
- Windows:
C:\ServBay\www\servbay-yii2-app\web
- macOS:
- Tên: Đặt tên dễ nhận biết, ví dụ
- Lưu và áp dụng: Lưu cấu hình website. ServBay tự động reload cấu hình web server để áp dụng thay đổi.
Xem hướng dẫn chi tiết tại tài liệu ServBay: Thêm website đầu tiên.
ServBay cũng tự động cấp và tin cậy chứng chỉ SSL (bằng ServBay User CA hoặc Public CA) nên bạn có thể truy cập website qua HTTPS.
Thêm mã ví dụ minh họa chức năng
Để minh họa sử dụng database và cache, hãy thêm các action demo vào controller mặc định của Yii 2.
Mở file controllers/SiteController.php
ở thư mục gốc và bổ sung các phương thức sau vào class SiteController
:
php
<?php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use yii\web\Response;
use yii\db\Exception as DbException; // Import class ngoại lệ DB
class SiteController extends Controller
{
/**
* Hiển thị trang chủ.
*
* @return string
*/
public function actionIndex()
{
return $this->render('index');
}
/**
* Demo 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; // Cache 60 giây
if ($cache->set($key, $data, $duration)) {
$value = $cache->get($key);
return $this->asText("Lưu vào Memcached thành công. Giá trị lấy ra: " . $value);
} else {
return $this->asText("Không thể lưu dữ liệu vào Memcached. Kiểm tra dịch vụ và cấu hình Memcached.");
}
}
/**
* Demo 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("Lưu vào Redis thành công. Giá trị lấy ra: " . $value);
} else {
return $this->asText("Không thể lưu dữ liệu vào Redis. 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() . ". Kiểm tra dịch vụ và cấu hình Redis.");
}
}
/**
* Demo thêm user vào database.
* Cần có bảng 'users'.
*
* @return Response
*/
public function actionMysqlAdd() // Áp dụng cho PostgreSQL nếu cấu hình đúng
{
try {
$count = Yii::$app->db->createCommand()->insert('users', [
'name' => 'ServBay Demo User', // Tên mẫu gắn thương hiệu
'email' => 'demo-user@servbay.test', // 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() . ". Kiểm tra dịch vụ, cấu hình và bảng 'users' đã tồn tại chưa.");
}
}
/**
* Demo lấy user từ database.
* Cần có bảng 'users'.
*
* @return Response
*/
public function actionMysql() // Áp dụng cho PostgreSQL nếu cấu hình đúng
{
try {
$users = Yii::$app->db->createCommand('SELECT id, name, email FROM users')->queryAll();
// Format output tránh lộn xộn hoặc lộ thông tin nhạy cảm
$output = "Danh sách users:\n";
foreach ($users as $user) {
$output .= "- ID: {$user['id']}, Name: {$user['name']}, Email: {$user['email']}\n";
}
return $this->asText($output);
} catch (DbException $e) {
return $this->asText("Không thể lấy user từ database. Lỗi: " . $e->getMessage() . ". Kiểm tra dịch vụ, cấu hình và bảng 'users' đã tồn tại chưa.");
}
}
// Nếu dùng PostgreSQL, có thể viết hàm riêng, nhưng đa số dùng chung component db là được
// public function actionPgsqlAdd() { ... }
// public function actionPgsql() { ... }
/**
* Format output dạng text thuần.
* @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;
}
/**
* Format output dạng JSON.
* @param mixed $data
* @return Response
*/
protected function asJson($data)
{
Yii::$app->response->format = Response::FORMAT_JSON;
return $data;
}
}
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
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
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 ý: Các action actionMysqlAdd
và actionMysql
đã bổ sung xử lý lỗi và trình bày output rõ ràng hơn. Username và email mẫu đã chỉnh lại theo branding của ServBay.
Sửa tiếp file views/site/index.php
ở thư mục gốc, đây là view của actionIndex
. Bạn có thể giữ nội dung mặc định hoặc chỉnh lại như sau:
php
<?php
/* @var $this yii\web\View */
/* @var $name string */
/* @var $message string */
/* @var $exception Exception */
use yii\helpers\Html;
$this->title = 'Ứng dụng Yii2 trên ServBay'; // Đã cập nhật tiêu đề
?>
<div class="site-index">
<div class="jumbotron">
<h1>Chúc mừng!</h1>
<p class="lead">Bạn đã tạo ứng dụng Yii2 và cấu hình thành công trên 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>Demo 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 user từ DB</a> (Cần có bảng 'users')</li>
</ul>
<p>Đảm bảo Memcached, Redis và database (MySQL/PostgreSQL) đã chạy trên ServBay và cấu hình đúng trong `config/web.php` và `config/db.php`.</p>
<p>Đối với ví dụ database bạn cần tạo bảng 'users' bằng migration của Yii (xem bên dưới).</p>
</div>
</div>
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
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
View trên đã bổ sung các link giúp bạn dễ kiểm tra các action vừa thêm.
Cơ sở dữ liệu quan hệ: Tạo bảng (migration)
Để các action database hoạt động (actionMysqlAdd
, actionMysql
), bạn cần tạo bảng users
trong database. Yii khuyến nghị dùng migration để quản lý thay đổi cấu trúc cơ sở dữ liệu.
Dùng lệnh tạo file migration: Mở terminal, đảm bảo đang ở thư mục gốc dự án, chạy lệnh sau để tạo migration mới.
Đường dẫn gốc dự án:
- macOS:
/Applications/ServBay/www/servbay-yii2-app
- Windows:
C:\ServBay\www\servbay-yii2-app
bashphp yii migrate/create create_users_table
1Hệ thống sẽ hỏi xác nhận, nhập
yes
và enter. File migration sẽ được tạo ở thư mụcmigrations
với tên kiểumYYYYMMDD_HHMMSS_create_users_table.php
.- macOS:
Sửa file migration: Mở file vừa tạo, sửa phương thức
up()
để định nghĩa cấu trúc bảngusers
.php<?php use yii\db\Migration; /** * Xử lý 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 index giúp truy vấn nhanh hơn $this->createIndex( 'idx-users-email', '{{%users}}', 'email', true // true là unique index ); } /** * {@inheritdoc} */ public function down() { // Xóa index $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 class theo tên file đã tạo.
Chạy migration: Quay lại terminal ở thư mục gốc dự án, chạy lệnh dưới đây để thực thi migration, từ đó tạo bảng
users
theo hàmup()
.bashphp yii migrate
1Xác nhận bằng
yes
và enter. Nếu thành công bạn sẽ thấy thông báo đã tạo bảng.
Truy cập website và kiểm thử
Bây giờ bạn có thể mở trình duyệt và truy cập domain vừa cấu hình, ví dụ https://servbay-yii2-test.local
.
- Truy cập
https://servbay-yii2-test.local
: Sẽ thấy trang chào mừng ứng dụng Yii 2 template cơ bản và link demo chức năng đã thêm. - Nhấn "Kiểm tra Memcached" hoặc truy cập
https://servbay-yii2-test.local/index.php?r=site/memcached
: Nếu Memcached chạy đúng và cấu hình hợp lệ, sẽ hiện dòng "Lưu vào Memcached thành công..." bằng text. - Nhấn "Kiểm tra Redis" hoặc truy cập
https://servbay-yii2-test.local/index.php?r=site/redis
: Nếu Redis chạy đúng và cấu hình hợp lệ, sẽ hiện dòng "Lưu vào Redis thành công..." bằng text. - Nhấn "Thêm user vào DB" hoặc truy cập
https://servbay-yii2-test.local/index.php?r=site/mysql-add
: Nếu database chạy, cấu hình đúng và đã tạo bảngusers
, sẽ hiện thông báo thêm user thành công (mỗi lần nhấn sẽ thêm một user mới, email là unique nếu chưa tồn tại). - Nhấn "Lấy user từ DB" hoặc truy cập
https://servbay-yii2-test.local/index.php?r=site/mysql
: Nếu database chạy, cấu hình đúng và tồn tại bảng, sẽ liệt kê danh sách user từ bảngusers
.
Nếu gặp lỗi, kiểm tra dịch vụ (PHP, web server, database, Memcached, Redis) trên ServBay đã bật đầy đủ; kiểm tra cấu hình dự án (config/db.php
, config/web.php
) và đảm bảo bảng database đã tạo thành công.
Câu hỏi thường gặp (FAQ)
- Lỗi không truy cập được domain hoặc lỗi chứng chỉ? Hãy kiểm tra đã thêm đúng domain trong phần “Website” của ServBay và đảm bảo ứng dụng ServBay đang chạy. ServBay tự động cấu hình DNS và SSL cho local. Nếu lỗi chứng chỉ, hãy chắc chắn đã tin cậy ServBay User CA hoặc Public CA - xem hướng dẫn trong tài liệu ServBay.
- Không chạy được lệnh Composer? Đảm bảo đã bật package Composer trong giao diện ServBay và bạn đang chạy lệnh trong terminal trên macOS. ServBay tự gắn Composer vào PATH giúp bạn.
- Kết nối database thất bại? Kiểm tra dịch vụ database (MySQL/PostgreSQL) trên ServBay đã bật. Kiểm tra các tham số
dsn
,username
,password
trongconfig/db.php
có khớp cấu hình ServBay không. Đồng thời kiểm tra đã tạo databaseservbay_yii2_app
chưa (có thể dùng Adminer của ServBay để xác nhận). - Kết nối Memcached/Redis thất bại? Kiểm tra dịch vụ Memcached và Redis trên ServBay đã chạy chưa. Kiểm tra địa chỉ
host
vàport
trong cấu hình component Memcached/Redis ởconfig/web.php
(mặc định là127.0.0.1
và port dịch vụ tương ứng). - Migration database (
php yii migrate
) thất bại? Đảm bảo đã cấu hình đúng fileconfig/db.php
và database đã bật, đã tạo sẵn database. Migration cần kết nối database thành công mới chạy được. - Action
actionMysqlAdd
hoặcactionMysql
báo không có bảng? Hãy chạy migration bằng lệnhphp yii migrate
trước để tạo bảngusers
. - Xem log lỗi PHP như thế nào? ServBay tập hợp log PHP và web server lại một chỗ. Bạn truy cập mục “Nhật ký” (Logs) trong ServBay để xem chi tiết lỗi và debug.
Tổng kết
Với ServBay, bạn dễ dàng xây dựng môi trường phát triển local hoàn chỉnh cho dự án Yii 2 trên macOS hoặc Windows. Composer, quản lý phiên bản PHP, dịch vụ database và cache tích hợp sẵn, cùng tính năng cấu hình website tiện lợi giúp đơn giản hóa việc cài đặt và phát triển dự án Yii 2. Làm theo hướng dẫn này, bạn sẽ triển khai ứng dụng demo hoặc phát triển thực tế nhanh chóng, tận dụng tối đa các công cụ ServBay để tăng hiệu suất làm việc.
Chúc bạn lập trình vui vẻ!