Trong 1 ứng dụng về website việc quản lý dữ liệu là một phần không thể thiếu, để quản lý các dữ liệu thì phải xây dựng các module quản trị sẽ khá tốn thời gian. Để giải quyết điều này, Yii2 cho phép tạo ra các module CRUD qua Gii để tạo ra một hệ thống quản lý dữ liệu một cách nhanh nhất.
Hoạt động của Gii
Sử dụng Gii để tự động tạo mã nguồn thật đơn giản, các đồng code chỉ việc nhập thông tin đúng theo các hướng dẫn hiển thị trên các trang Web Gii và mã nguỗn sẽ được sinh tự động.
Yii cung cấp Gii như một module, các đồng code có thể thấy cấu hình của Gii trong frontend/config/main-local.php hoặc backend/config/main-local.php
if (!YII_ENV_TEST) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
- Như config trên thì các đồng code có thể truy cập dưới dạng http://localhost/<project>/<frontend hoặc backend>/web/index.php?r=gii, còn trong trường hợp của tại hạ khi đã viết lại đường dẫn thì sẽ có dạng http://localhost/advanced/gii (Có thể xem lại bài Route URL).
Để tùy chọn việc cho phép truy cập vào Gii, các đồng code có thể dùng thêm option allowedIPs như sau
if (!YII_ENV_TEST) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
'allowedIPs' => ['127.0.0.1','192.168.155.10'] // cho phép các IP được truy cập Gii
];
}
Sau khi chạy Gii sẽ có kết quả
Nếu không nằm trong dải IP cho phép truy cập thì sẽ có kết quả sau
Để tránh việc người khác truy cập trái phép Gii thì các đông code nên sử dụng option allowedIPs hoặc comment lại config khi deploy lên server thật.
Trên Gii có một số phần có thể sinh file code tự động như: Controller, Model, CRUD, Form Input, Module, Extension(Các phần mở rộng).
Bộ sinh mã cho Model
Để tạo ra các model từ đối tượng ActiveRecord, các đồng code chọn Model Generator sẽ được như sau
- Table Name chính là tên bảng trong cơ sở dũ liệu, cái này cữ gõ vào là nó sẽ gợi ý ra các bảng để chọn
- Model Class Name là tên model các này có thể tùy chỉnh hoặc không thì cứ để mặc định cũng được
- Standardize Capitals là các chuẩn về tên viết in hoa ví dụ tên bảng là DETAIL_USER thì tên class nó sẽ đổi thành DetailUser khi sinh code ra.
- Singularize là chuẩn về tên class Model, ví dụ tên bảng là detail_user thì sẽ được chuyển thành DetailUser giống với Standardize Capitals
- Namespace là nơi các file Model được tạo ra, mặc đinh là app\models nó nằm trong frontend/models hoặc backend/models tùy theo Gii đang chạy ở Front hay Back
- BaseClass là class được model extends (Cái này nên để mặc đinh, nếu có class riêng thì hãy thay đổi).
- Use Table Prefix sử dụng khi cấu hình dữ liệu có sử dụng prefix(Tiền tố) của bảng dữ liệu
Dưới đây tại hạ ví dụ tạo 1 model User như sau
Sau khi click Preview ở phần Code File chính là File sẽ được tạo ra khi các đồng code click tiếp Generate
Và có file User.php trong frontend Model
Việc tạo các model nhằm để chuẩn hóa code được tạo ra, quan trọng nếu trong các bảng dữ liệu nó có quan hệ thì cũng được sinh tự động ra luôn. Nhưng nếu các bảng đơn không có quan hệ dữ liệu thì ngoài cách tạo bằng Gii thì các đồng code có thể nhân bản 1 file model nào đó lên rồi đổi tên và các thông tin đi cho phù hợp là được =)).
Trong trường hợp model đã tồn tại thì nó sẽ cho phép ghi đè lại nếu muốn, chỉ cần tích chọn vào ô overwrite là được
Như trên Gii đã tạo ra 1 Model kế thừa từ ActiveRecord có đầy dủ các rules hỗ trợ việc validate dữ liệu khi thêm mới hoặc cập nhật.
Bộ sinh mã CRUD
CRUD viết tắt bởi Create(Tạo mới), Read(Xem), Update(Cập nhật), Delete(Xóa bỏ) là các chức năng không thể thiếu trong việc quản lý dữ liệu. Để tạo CRUD, các đồng code click vào CRUD Generator
Ở CRUD bạn phải tạo trước các Model cần thiết để nhập vào phần Model class
- Model Class: chính là nơi đặt model mà khi tạo Model bằng Gii các đồng code đặt ở namespace, mặc định là app\models\<Tên model>, ví dụ: app\models\User
- Search Model Class là nơi đặt model hỗ trợ việc lọc và tìm kiếm trên Gridview khi CRUD được tạo ra, mặc đinh là app\models\<Tên model> Search, ví dụ: app\models\UserSearch nhưng tại hạ khuyên nên đặt trong 1 thư mục search riêng kiểu app\models\search\UserSearch để sau dễ quản lý hơn (các đồng code nhớ tạo trước thư mục search trong models nhé :)))
- Controller Class là nơi tạo ra các controller với đầy đủ các action CRUD, mặc đinh là app\controllers\<Tên controller>Controller, ví dụ app\controllers\UserController
- View Path chính là nơi tạo ra các view của CRUD, mặc định là app\views\<Tên view>, phần này nếu dùng mặc định thì không cần nhập gì còn nếu các đồng code tùy biến đặt view ở nơi khác thì nhớ điền vào để tạo được view đúng chỗ nhé
- Base Controller Class là class được kế thừa bới các controller
- Widget Used in Index Page sẽ có 2 kiểu hiển thị ở trang index: Griview hoặc Listview
- Enable I18N có thể sử dụng với đa ngôn ngữ
- Enable Pjax hỗ trợ cho việc lọc hoặc tìm kiếm trên Gridview hoặc Listview không bị reload trang
Dưới đây tại hạ sẽ tạo CRUD cho User như sau
Ở đây các file model search, controller, view đã được hiển thị ở chế độ xem trước, nếu chưa khớp đường dẫn nào thì các đồng code fix lại rồi preview lần nữa, sau đó click Generate để tạo ra các file
Như vậy là tại hạ đã tạo ra CRUD để quản lý danh sách user, để xem kết quả -> truy cập http://localhost/advanced/user, có thể khi truy cập sẽ báo lỗi namespace ở controller, nếu controller ở frontend thì sửa lại namespace từ app\controlles thành frontend\controllers, backend thì tương tự.
CRUD bao gồm page index là page hiển thị danh sách
Page Update để cập nhật dữ liệu
Page xem chi tiết 1 row nào đó
Các đồng code có thể tinh chỉnh giao diện trong thư mục user trong frontend/views.
Bộ sinh mã cho Controller
Ngoài việc tạo controller thông qua CRUD thì các đồng code có thể tạo qua Controller Generator
- Controller Class là nơi đặt file controller tạo ra, mặc định là app\controller\<Tên controller>, ví dụ: app\controller\DemoController, để cho chắc thì nếu tạo ở frontend nên đặt là frontend\controllers\DemoController cho khỏi bị sai namspace khi tạo file
- Action IDs là actiion mặc đinh tạo ra trong controller
- View Path chính là nơi tạo ra các view, mặc định là app\views\<Tên view>, phần này nếu dùng mặc định thì không cần nhập gì còn nếu các đồng code tùy biến đặt view ở nơi khác thì nhớ điền vào để tạo được view đúng chỗ nhé
Dưới đây tại hạ tạo 1 controller như sau
và các file được tạo ra
Bộ sinh mã cho Form
Ở đây tại hạ sử dụng Form Generator để tạo 1 view có sử dụng form của user như sau
và tại hạ thu được 1 file form trong view của user như sau
Đoạn code này Gii gợi ý đặt trong UserController để xử lý việc nếu submit từ form có trong view vừa tạo
<?php
public function actionForm()
{
$model = new \app\models\User();
if ($model->load(Yii::$app->request->post())) {
if ($model->validate()) {
// form inputs are valid, do something here
return;
}
}
return $this->render('form', [
'model' => $model,
]);
}
Việc tạo form bằng gii cũng không khác gì form tạo từ CRUD
Tạo Module trong Gii
Ở đây tại hạ sẽ tạo 1 module demo
Sau khi tạo xong modules Demo, tại hạ sẽ config để gọi module trong frontend/config/main-local.php như sau
Và truy cập qua link http://localhost/advanced/demo
Việc tạo ra module giúp việc chia nhỏ ứng dụng, tạo các service riêng biệt hơn.
Tổng kết
Bài viết này tại hạ tổng hợp lại các phần mà Gii có thể sinh mã tự động cho các đồng code để tiết kiệm được thời gian phát triển sản phẩm hơn. Vẫn còn 1 phần nữa là tạo extension qua Gii thì tại hạ sẽ có 1 bài viết riêng về phần này, mong các đồng code đón đọc. Bài viết khá dài nên có chỗ nào thiếu sót mong anh em đồng code bỏ qua