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

  1. Tạo thư mục MyModule
  2. Tạo thư mục MyModule/src là thư mục chứa code chính của Module
  3. Tạo file MyModule/src/Module.php
  4. Tạo thư mục MyModule/config
  5. 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

  1. Tạo thư mục ZendModule
  2. Tạo thư mục ZendModule/src là thư mục chứa code chính của module
  3. Tạo file ZendModule/Module.php
  4. Tạo thư mục ZendModule/config
  5. 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;
    }
}

 
Đăng ký theo dõi ủng hộ kênh