(Bài tiếp) Service Manager

Một ứng dụng Zend Framework thường có nhiều thành phần, chúng yêu cầu cấu hình đúng khi chạy, ví dụ như cấu hình kết nối đến CSDL, cấu hình nạp những module nào vào ứng dụng, thiết lập các tham số tùy chọn ... Bạn có thể cấu hình ở hai cấp độ, cấp độ ứng dụng và cấp độ module. Ở cấp độ module bạn định nghĩa các tham số phục vụ cho module đó.

Config cấp độ ứng dụng

Các cấu hình ứng dụng chứa trong thư mục config của ứng dụng, có nhiều file khác nhau

config
   application.config.php
   modules.config.php
    autoload
      gloabal.php
      local.php

application.config.php là file cấu hình chính, nó dùng cho ứng dụng khởi tạo và nạp các dịch vụ cần thiết. Bạn mở file này ra, nội dung chính của nó như sau:

return [
    //Danh sách các module nạp vào từ file modules.config.php
    'modules' => require __DIR__ . '/modules.config.php',

    'module_listener_options' => [
    //Các đường dẫn để ứng dụng tìm các Module
        'module_paths' => [
            './module',
            './vendor',
        ],


        //Đường dẫn đến các file config, ứng dụng tự động nạp sau khi các
        //module load xong, nếu thông số cùng tên định nghĩa bởi module có thể
        //bị ghi đè bởi thông số trong này.
        'config_glob_paths' => [
            realpath(__DIR__) . '/autoload/{{,*.}global,{,*.}local}.php',
        ],

        // Có phép tạo cache các cấu hình, lưu ở thư mục cache_dir
         // trong quá trình phát triển nên chọn false, khi deploy mới để true
        'config_cache_enabled' => true,

        // Hậu tố khi tạo tên file cache
        'config_cache_key' => 'application.config.cache',

        //Cho phép tạo cache cấu hình định nghĩa các lớp module
        'module_map_cache_enabled' => true,

        // Hậu tố khi tạo file cache cấu hình module
        'module_map_cache_key' => 'application.module.cache',

        // Đường dẫn lưu cache
        'cache_dir' => 'data/cache/',

    ],


];

Trong file trên có cấu hình cho biết lấy danh sách các module mà ứng dụng sử dụng ở file modules.config.php, bạn mở file ra, thì nội dung cơ bản như sau:

return [
    'Zend\ServiceManager\Di',
    'Zend\Session',
    'Zend\Mvc\Plugin\Prg',
    'Zend\Mvc\Plugin\Identity',
    'Zend\Mvc\Plugin\FlashMessenger',
    'Zend\Mvc\Plugin\FilePrg',
    'Zend\Mvc\I18n',
    'Zend\Mvc\Console',
    'Zend\Log',
    'Zend\Form',
    'Zend\Db',
    'Zend\Cache',
    'Zend\Router',
    'Zend\Validator',
    //'ZendDeveloperTools',
];

Ứng dụng bạn cần nạp các module nào thì thêm vào ở file này.

Cấu hình ở cấp độ module với Zend Framework

Ngoài cách sử dụng các cấu hình khai báo cấp độ ứng dụng ở trên, có thể bạn cấu hình ở cấp độ module nhằm mục đích chia nhỏ việc cấu hình theo chức năng module để dễ quản lý, thứ hai là cấu hình dành cho module chỉ được nạp khi module đó có sử dụng trong ứng dụng

Thông thường mỗi module xây dựng theo gợi ý của Zend Framework nên có một thư mục trong module tên là config trong đó chứa file tên module.config.php là nơi để thiết lập cấu hình module. Ví dụ ở chương trình Skeleton phần trước, bạn xem file cấu hình của module Application\Application\config\module.config.php, mở ra xem nó có nội dung cơ bản như:

return [
    'router' => [
        'routes' => [
            'home' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'application' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/application[/:action]',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
        ],
    ],
    'controllers' => [
        'factories' => [
            Controller\IndexController::class => InvokableFactory::class,
        ],
    ],
'view_manager' => [
    'display_not_found_reason' => true,
    'display_exceptions'       => true,
    'doctype'                  => 'HTML5',
    'not_found_template'       => 'error/404',
    'exception_template'       => 'error/index',
    'template_map' => [
        'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
        'application/index/index'
                        => __DIR__ . '/../view/application/index/index.phtml',
        'error/404'               => __DIR__ . '/../view/error/404.phtml',
        'error/index'             => __DIR__ . '/../view/error/index.phtml',
    ],
    'template_path_stack' => [
        __DIR__ . '/../view',
    ],
],
];

Đó là các cấu hình dánh cho module Application, ý nghĩa các thông số này sẽ tìm hiểu dần dần ở sau.

Kết hợp cấu hình lại với nhau

Khi ứng dụng chạy, nó sẽ đọc cấu hình từ cấp độ ứng dụng, các cấu hình mở rộng từ thư mục config\autorun, đọc cấu hình từ các module. Tất các các cấu hình đó lưu trong các mảng riêng biệt, sau khi kết thúc việc đọc cấu hình ứng dụng sẽ tiến hành trộn một số chúng vào thành một mảng để sử dụng (quá trình này đã thiết lập để ứng dụng Skeleton tự động thực hiện).

application.config.php các cấu hình trong file này cơ bản để nạp các dịch vụ, nên nó lưu ở mảng riêng, không trộn

Cấu hình từ tất cả các module sẽ trộn thành một mảng, tiếp theo cấu hình từ config\autorun trộn thành một mảng mảng này sẽ dùng trộn với mảng kết hợp của module. Như vậy giá trị trong mảng này có thể ghi đè nên mảng trộn module.

Đọc các cấu hình

Nếu có nhu cầu đọc các cấu hình này, bạn có thể thực hiện như sau:

Lấy đối tượng Service Manager (SM) của ứng dụng. SM là đối tượng quản lý các dịch vụ của ứng dụng, trong đó có lưu thông số config. SM được ứng dụng khung tạo ra mặc định. Để lấy được SM có một số cách tùy thuộc vào trường hợp lấy ở Controller hay ở View ... Các trường hợp khác ta sẽ thảo luận sau.

Ở đây ví dụ đọc config ở phương thức onBootstrap(\Zend\Mvc\MvcEvent $e) của Module.php

Mở file Module.php của module Application, cập nhật phương thức onBootstrap

public function onBootstrap(\Zend\Mvc\MvcEvent $e)
{
    //Lấy đối tượng Application
    $app    = $e->getApplication();

    //Lấy đối tượng Service Manager
    $sm = $app->getServiceManager();

    //Lấy mảng toàn bộ config ứng dụng
    $config = $sm->get('config');

    //Lấy config về router
    $router_config = $config['router'];

    var_dump($router_config);

}

Chú ý trong ứng dụng khung của Zend Framework các module có thể cấu hình rất nhiều thiết lập các dịch vụ ứng dụng, mỗi dịch vụ có một key riêng trong hệ thống config (bạn sẽ tìm hiểu sau)

ControllerPluginManager

getControllerPluginConfig()

controller_plugins

ControllerManager

getControllerConfig()

controllers

FilterManager

getFilterConfig()

filters

FormElementManager

getFormElementConfig()

form_elements

HydratorManager

getHydratorConfig()

hydrators

InputFilterManager

getInputFilterConfig()

input_filters

RoutePluginManager

getRouteConfig()

route_manager

SerializerAdapterManager

getSerializerConfig()

serializers

ServiceLocator

getServiceConfig()

service_manager

ValidatorManager

getValidatorConfig()

validators

ViewHelperManager

getViewHelperConfig()

view_helpers

LogProcessorManager

getLogProcessorConfig

log_processors

LogWriterManager

getLogWriterConfig

log_writers


Đăng ký nhận bài viết mới
(Bài tiếp) Service Manager