Khi nào cần tạo một Module mới
Trong ứng dụng Skeleton bạn đã cài đặt theo hướng dẫn từ phần đầu, bạn thấy nó có sẵn một module Application
trong ứng dụng.
Một modle trong Zend Framework chứa các model, view, controller ... (bất cứ thứ gì).
Module có file config riêng để cấu hình về route, controller, plugin, service ...
Vậy khi nào bạn cần tạo ra module mơi?
- Khi ứng dụng trở lên lớn, phức tạp việc chia nhỏ các thành phần ra để dễ bảo trì, mở rộng
- Khi có một phần nào đó độc lập với tổng thể ứng dụng (nó không cần các phần khác của ứng dụng) nhưng ứng dụng cần nó
- Việc chia nhỏ thành module có thể chia sẻ được qua các dự án khác nhau
Các bước tạo Module trong ZF3 - chuẩn PSR-4
Bước 1) Tạo cấu trúc file và thư mục
Bạn hãy chọn một cái tên cho Module ví dụ MyModule
sau đó hãy bắt trước cấu trúc của module Application
có sẵn trong Skeleton để thực hiện.
MyModule
là tên module của bạn, cũng là namespace
gốc truy cập các thành phần
Module của bạn tạo ra đặt trong thư mục module
của ứng dụng như các module khác, vậy bắt đầu từ thư mục này hãy
- Tạo thư mục
MyModule
- Tạo thư mục
MyModule/src
là thư mục chứa code chính của Module - Tạo file
MyModule/src/Module.php
- Tạo thư mục
MyModule/config
- Tạo file
MyModule/config/module.config.php
Bước 2) Cập nhật Module.php và module.config.php
module/MyModule/src/Module.php
<?php namespace MyModule; class Module { public function getConfig() { return include __DIR__ . '/../config/module.config.php'; } }
module/MyModule/config/module.config.php
<?php return [ ];
Bước 3) Cập nhật Autoload PRS-4
Mở file composer.json
cập nhật phần autoload { psr-4 {
bằng cách thêm đoạn mã "MyModule\\": "module/MyModule/src/"
, như dạng:
//.. "autoload": { "psr-4": { "Application\\": "module/Application/src/", "MyModule\\": "module/MyModule/src/" } }, //...
Bước 4) Cấu hình ứng dụng sử dụng module
Mở file config/modules.config.php
thêm MyModule
vào cuối
Như vậy bạn đã tạo ra một module có tên MyModule, MyModule được xây dựng theo chuẩn PRS-4 nên dễ dàng chia sẻ với các dự án, thậm chí chỉa sẻ đến các dự án không phải dựa trên Zend Framework
Các bước tạo Module trong ZF3 - Zend Autoloader
Loại module này không theo chuẩn PRS-4, giả sử cần tạo một Module tên ZendModule
ZendModule
là tên module của bạn, cũng là namespace
gốc truy cập các thành phần, nó cũng được đặt trong thư mục module
của ứng dụng
Bước 1) Tạo cấu trúc thư mục, file
- Tạo thư mục
ZendModule
- Tạo thư mục
ZendModule/src
là thư mục chứa code chính của module - Tạo file
ZendModule/Module.php
- Tạo thư mục
ZendModule/config
- Tạo file
ZendModule/config/module.config.php
Bước 2) Cập nhật Module.php và module.config.php
module/ZendModule/Module.php
<?php namespace ZendModule; class Module { public function getConfig() { return include __DIR__ . '/config/module.config.php'; } public function getAutoloaderConfig() { return [ \Zend\Loader\StandardAutoloader::class => [ 'namespaces' => [ __NAMESPACE__ => __DIR__.'/src/'.__NAMESPACE__, ] ], /* Sử dụng tối ưu \Zend\Loader\ClassMapAutoloader::class => [ __DIR__ . '/autoload_classmap.php', ] */ ]; } }
module/ZendModule/config/module.config.php
<?php return [ ];
Bước 3) Cấu hình ứng dụng sử dụng module
Mở file config/modules.config.php
thêm ZendModule
vào cuối
Với hai cách tạo Module, việc chọn cách nào là tùy bạn, nhưng xu hướng thì theo chuẩn PSR-4
Các phương thức trong lớp Module
Mỗi module bạn xây dựng có một lớp tên là namespace\Module
trong file Module.php
.
Lớp này chính là đối tượng được hệ thống Module Manager
của ZF3 quản lý và khởi tạo. Khi xây dựng lớp Module
cho từng module, tùy theo
nhu cầu mà bạn có thể thêm vào các phương hay dùng (nó tự động gọi bởi Module Manager và hệ thống ứng dụng) :
Phương thức này trả về mảng chứa thiết lập để Zend Loader sử dụng
public function getAutoloaderConfig() { return [ \Zend\Loader\StandardAutoloader::class => [ 'namespaces' => [ __NAMESPACE__ => __DIR__.'/src', ] ], /* Sử dụng tối ưu \Zend\Loader\ClassMapAutoloader::class => [ __DIR__ . '/autoload_classmap.php', ] */ ]; }
Phương thức này tự động gọi khi hệ thống có sự kiện bootstrap
(xem các sự kiện trong ứng dụng).
Bằng việc tạo ra hàm này, bạn có cơ hội thiết lập sớm các đoạn code như đăng ký listener ...
public function onBootstrap(\Zend\Mvc\MvcEvent $e) { $application = $e->getApplication(); $config = $application->getConfig(); $servicemanage = $application->getServiceManager(); $view = $servicemanage->get('ViewHelperManager'); //Tạo listener ... //Khai báo lắng nghe sự kiện 'route' $eventmanager->attach('route', function($e) { }); }
Trả về một mảng liên kết chứa các thiết lập cho module
public function getConfig() { return [ //...các thiết lập ]; //Hoặc //return include __DIR__ . '/config/module.config.php'; }
Gọi khi ứng dụng khởi động, bạn có để đăng ký listener ở đây. Ví dụ sau chuyển hướng sang https
public function init(ModuleManager $manager) { // Get event manager. $eventManager = $manager->getEventManager(); $sharedEventManager = $eventManager->getSharedManager(); // Register the event listener method. $sharedEventManager->attach(__NAMESPACE__, 'route', [$this, 'onRoute'], 100); } // Event listener method. public function onRoute(MvcEvent $event) { // Get request URI $uri = $event->getRequest()->getUri(); $scheme = $uri->getScheme(); // If scheme is not HTTPS, redirect to the same URI, but with // HTTPS scheme. if ($scheme != 'https'){ $uri->setScheme('https'); $response=$event->getResponse(); $response->getHeaders()->addHeaderLine('Location', $uri); $response->setStatusCode(301); $response->sendHeaders(); return $response; } }