[ZF2] Thao tác với Database – Phần 3

Trong bài viết [ZF2] Cấu hình Routing và Controllers – Phần 2, chúng ta đã cấu hình routing và controllers cho module Album với 4 action chính giúp hiển thị, thêm, xóa, sửa toàn bộ sưu tập nhạc thông qua các view script tương ứng. Trong mô hình MVC của Zend Framework 2 thì chúng ta đã tìm hiểu và cài đặt 2 thành phần chính là Controller – View, và trong bài viết này chúng ta sẽ cài đặt cấu hình tiếp thành phần Model cho module Album để có thể tương tác với cơ sở dữ liệu thông qua các câu lệnh truy vấn. Chúng ta sẽ sử dụng lớp Zend\Db\TableGateway\TableGateway để tìm kiếm, insert, update, delete  với cơ sở dữ liệu lưu trữ bộ sưu tập nhạc.

Chúng ta sẽ sử dụng hệ quản trị cơ sở dữ liệu Mysql và dùng lớp kết nối dữ liệu PDO – PHP để tạo một database có tên zf2tutorial và chạy câu lệnh sql giúp tạo một bảng album với một số trường mẫu:

 Bây giờ, chúng ta đã có một bảng album trong database zf2tutorial và một số trường dữ liệu mẫu trong bảng album.

Xây dựng lớp Model

Bộ thư viện Zend Framework 2 không cung cấp gói/namespace Zend\Model, bởi đây xử lý nghiệp vụ logic tùy thuộc vào những yêu cầu công việc của bạn, nhưng nó có rất nhiều thành phần tương tác với database trong namespace Zend\Db. Chúng ta sẽ phải xây dựng các lớp thể hiện tương ứng với từng table trong database để thực hiện các thao tác một cách dễ dàng và hiệu quả, đây là kỹ thuật Object-relational mapping (ORM) ví dụ như Doctine, Propel…
 
Chúng ta sẽ tạo một lớp Album trong namespace Album\Model đóng vai trò như một trường dữ liệu (row) trả ra khi truy vấn database, một đối tượng Album\Model\Album sẽ chỉ chứa những thông tin cần thiết (những cột trong bảng album) như ID, tác giả, tiêu đề bộ sưu tập chứ không lấy toàn bộ thông tin về bộ sưu tập.  Trong lớp này phải nhất định có phương thức exchangeArray($data) để chuyển đổi và  gán tương ứng giá trị cho các biến thuộc tính cho lớp Album\Model\Album.

Tiếp theo, chúng ta sẽ tạo lớp AlbumTable trong tập tin AlbumTable.php được đặt trong thư mục module/Album/src/Album/Model, lớp này sẽ xây dựng các phương thức xử lý nghiệp vụ tương tác với cơ sở dữ liệu như lấy toàn bộ bộ sưu tập, thêm mới một bộ sưu tập…

Lớp AlbumTable khi khởi tạo sẽ nhận một tham số là một thể hiện của lớp Zend\Db\TableGateway\TableGateway và gán vào biến thuộc tính lớp $tableGateway, thuộc tính này sẽ được sử dụng trong các phương thức xử lý nghiệp vụ của lớp AlbumTable với cơ sở dữ liệu thông qua các phương thức select(), insert(), delete()… Các phương thức chính trong lớp AlbumTable là:

  • fecthAll() : giúp lấy ra toàn bộ dữ liệu về các bộ sưu tập có trong cơ sở dữ liệu
  • getAlbum($id): giúp lấy một bộ sưu tập chỉ định thông qua tham số đầu vào $id – số nguyên
  • saveAlbum(Album $album): giúp lưu thông tin của một album vào cơ sở dữ liệu, có thể là chỉnh sửa hoặc thêm mới
  • deleteAlbum($id): xóa bỏ một bộ sưu tâp nhạc thông qua một biến $id chỉ định

Bước tiếp theo chúng ta sẽ khai báo một factories Album\Model\AlbumTable với ServiceManager để có thể dễ dàng quản lý và khởi tạo một đối tương  Album\Model\AlbumTable. Trong tập tin module/Album/Module.php chúng ta sẽ thêm phương thức getServiceConfig() vào lớp Album\Module, phương thức này sẽ trả ra một mảng và nó sẽ được nạp vào ServiceManager khi module Album được load. Các factories như Album\Model\AlbumTableAlbumTableGateway sẽ được khởi tạo thông qua ServiceManager.

Chúng ta cần phải thiết lập một driver kết nối cơ sở dữ liệu bằng cách tạo một tập tin cấu hình db.global.php trong thư mục config/autoload với nội dung như sau:

Nhưng thông tin kết nối tới database như username và password đăng nhập sẽ được khai báo trong tập tin db.local.php đặt trong thư mục config/autoload như sau:

Lớp Zend\Db\Adapter\AdapterServiceFactory sẽ được ServiceManger sử dụng để khởi tạo đối tượng kết nối database thông qua tham số cấu hình ‘db’ . Factories này được ánh xạ với tên Zend\Db\Adapter\Apdater và ServiceManager có thể tạo một đối tượng mới thông qua tên này.

Lưu ý: Những tập tin autoload *.global.php sẽ được đồng bộ lên Github và *.local.php sẽ được bỏ qua. Để đảm bảo tính bảo mật các bạn nên để các thông tin như username và passwork trong tập tin *.local.php

Xử lý dữ liệu trong Contrller

Lớp Album\Controller\AlbumController sẽ chịu trách nhiệm tương tác với Model, và chúng ta sử dụng các phương thức đã xây dựng ở lớp Album\Model\AlbumTable để thực hiện xử lý một cách dễ dàng. Chúng ta sẽ thêm phương thức getAlbumTable() để có thể lấy ra được đối tượng của lớp Album\Model\AlbumTable.

$sm->get(‘Album\Model\AlbumTable’);  sẽ trả ra một đối tượng của lớp Album\Model\AlbumTable và nó sẽ được gán vào thuộc tính $albumTable của lớp AlbumController.

Hiển thị toàn bộ bộ sưu tập

Chúng ta sẽ sử dụng action ‘index‘ trong lớp AlbumController để lấy toàn bộ bộ sưu tập có trong cơ sở dữ liệu, và đẩy các dữ liệu đó ra thành phần view thông qua việc trả ra một đối tượng lớp Zend\View\ViewModel.

Nhận toàn bộ dữ liệu thông qua biến $this->albums, chúng ta sẽ sử dụng một vòng lặp để duyệt qua các trường dữ liệu và hiển thị chúng ra màn hình với các thẻ html.

Các phương thức headTitle(), escapeHtml(), url() trong tập tin hiển thị module/Album/view/album/album/index.phtml là các view helper hỗ trợ được ZF2 xây dựng sẵn và nạp khi dự án khởi chạy. 

Và thành quả chúng ta nhận được khi truy nhập đường dẫn : http://zf2-tutorial.localhost/album

kết nối database trong zf2

Kết nối database trong zf2