[ZF2] Tạo module trong Zend Framework 2 – Phần 1

Việc xây dựng một dự án website bằng Zend Framework 2 không chỉ dừng lại ở việc cài đặt và chạy thành công ZendSkeletonApplication, mà điều đặc biệt chúng ta phải quan tâm tới đó là khả năng mở rộng và phân phối các lớp xử lý nghiệp vụ riêng để có thể tái sử dụng cho nhiều dự án. Để có thể đáp ứng được nhu cầu đó, trong Zend Framework 2 đã cung cấp cơ chế mở rộng dự án thông qua việc quản lý và phát triển các module hỗ trợ. Mỗi một module sẽ xử lý một nghiệp vụ riêng biệt như module hỗ trợ phân quyền, module hỗ trợ soạn thảo… chúng có thể được tái sử dụng một cách dễ dàng trong nhiều dự án khác nhau. Một dự án sẽ bao gồm nhiều module, chúng có thể tương tác cùng xử lý hỗ trợ lẫn nhau, các lớp xử lý của module này có thể sử dụng các lớp của module khác, và khi đó sẽ tạo ra một hệ thống dự án hoàn chỉnh. Bạn có thể sử dụng các module đã được phát triển và phân phối tại : http://modules.zendframework.com/ . Trong bài viết này, chúng ta sẽ cùng nhau tạo mới, cấu hình và vận hành một module hoàn chỉnh, để có thể giúp các bạn hiểu rõ hơn một trong những đặc điểm quan trọng của Zend Framework 2.

Cài đặt module Album

Trong ZendSkeletonApplication, mặc định nó cũng cung cấp một module Application được cài đặt sẵn và làm module mặc định giúp ZendSkeletonApplication khởi chạy với mô hình MVC đơn giản. Nhưng chúng ta sẽ không tiếp tục sử dụng module này, mà sẽ tạo ra một module Album tương tự  để giúp hỗ trợ quản lý album nhạc.

Cấu trúc thư mục Module trong ZF2

Cấu trúc thư mục Module trong ZF2

Chúng ta có thể đặt các module mở rộng mới trong 2 thư mục modulevendor, ZF2 chỉ có thể load các module này từ đó. Ở đây, để dễ quản lý và xây dựng các module, chúng ta sẽ đặt các module do chúng ta tự viết trong thư mục module  và các module hỗ trợ khác được lấy nguồn khác có thể đặt vào trong vendor. Bạn có thể chỉ định thư mục bạn muốn đặt module mới thông qua tập tin application.config.php :

Các bạn hãy tạo module Album mới với cấu trúc thư mục như sau:

Như bạn có thể thấy, module Album có những thư mục riêng biệt để phân loại các tập tin các năng khác nhau, giúp ta dễ quản lý và chỉnh sửa. Các tập tin PHP chứa các lớp xử lý của namspace Album được đặt trong thư mục src/Album, nên chúng ta có thể tạo nhiều thư mục con trong đó để có thể phát triển các sub-namepaces. Thư mục view chứa thư mục album tương ứng với tên module của chúng ta.

Để nạp và cấu hình các module vào dự án, Zend Framework 2 sử dụng lớp ModuleManager. Nó có nhiệm vụ xác định các tập tin Module.php trong thư mục gốc của từng module (module/Album) và cố gắng khởi tạo – sử dụng lớp Album\Module để có thể lấy được những cấu hình module thông qua mảng trả về từ phương thức getConfig().Tiếp theo, chúng ta sẽ tạo tập tin khởi tạo Module.php trong thư mục gốc của module Album với nội dung như sau:

Module Manager sẽ tự động gọi các phương thức getConfiggetAutoloaderConfig. Module Manager có thể quản lý nhiều module, và chịu trách nhiệm khởi tạo và nạp module đó vào hệ thống. Toàn bộ các module đều được duyệt qua một lượt trong quá trình khởi tạo.

Cơ chế nạp các lớp của module

Phương thức getAutoloaderConfig() trả ra một mảng cấu hình những đường dẫn chứa các tên lớp/ namsapce ánh xạ, phương thức này được khởi tạo bởi AutoloaderConfig. Chúng ta có thể nạp các lớp của module thông qua một bảng ánh xạ lớp (class map) gồm tên lớp và đường dẫn tới lớp đó, ZF2 sử dụng Zend\Loader\ClassMapAutoloader; và có thể nạp tự động các lớp thông qua việc sử dụng lớp Zend\Loader\StandardAutoloader, mặc định nó sử dụng cơ chế tự động load theo chuẩn PRS-0 (ZF2 cũng có thể sử dụng theo chuẩn PRS-4 để có thể dễ dàng hơn trong việc quản lý mã nguồn).

ClassMapAutoloader có hiệu quả làm việc cao hơn StandarAutoloader giúp tối ưu hơn cho dự án. Nhưng trong phạm vi bài viết này chúng ta sẽ không tìm hiểu kỹ về vấn đề này, mà để thuận tiện hơn khi sử dụng và tiếp cận thì chúng ta sẽ dùng StandarAutoloader để nạp các lớp của Album thông qua namespace. Tôi sẽ nhắc lại vấn đề này trong các bài viết về kỹ thuật tối ưu mã nguồn Zend Framework 2.

Cơ chế nạp các cài đặt cấu hình của module

Các cài đặt cấu hình của module được xác định thông qua phương thức getConfig(). Phương thức này sẽ trả một mảng thông qua tập tin cấu hình module.config.php. Chúng ta sẽ tạo tập tin module.config.php và đặt nó trong thư mục config của module.

Những cài đặt này sẽ được nạp vào trong ServiceManager để quản lý và tái sử dụng, ở đây chúng ta khai bảo 2 thành phần quan trọng là ‘controllers’ và ‘view_manager’. Cấu hình ‘controllers’ sẽ được merge với các cấu hình tương ứng ở các module khác, đây là nơi chứa một danh sách các controller sử dụng trong module và có thể sử dụng ở các module khác. Chúng ta cần tạo một controller xử lý  AlbumController nó sẽ được ánh xạ với tên Album\Controller\Album và Service Manager có thể khởi tạo đối tượng controller thông qua tên này. Cấu hìnhview_manager chúng ta sẽ sử dụng một đối tượng của TemplatePathStack  để có thể xác định đường dẫn nơi chứa những tập tin hiển thị của controller – action.

Hoàn tất quá trình

Chúng ta cần khai báo cho ModuleManager biết có một module mới được tạo. Để làm được điều này, bạn mở tập tin config/application.config.php ở thư mục gốc ra và chỉnh sửa lại nội dung như sau:

Như các bạn có thể thấy, chúng ta đã thêm module Album ngay sau module Application, và từ bây giờ nó có thể hoạt động mỗi khi dự án được khởi chay. Lời khuyên là không nên tạo quá nhiều module trong một dự án. Như vậy, chúng ta đã tiến hình cài đặt thành công một module mới vào trong dựa án ZF2. Chúc các bạn học tập và làm việc thành công với bộ mã nguồn thú vị này. Trong bài viết tiếp theo, chúng ta sẽ đi tìm hiểu về việc xây dựng các controller xử lý.