Zend\Config là cầu nối để truy cập dữ liệu được cấu hình trong code của ứng dụng. Dữ liệu cấu hình cho ứng dụng có thể đến từ các nguồn cấp khác nhau như: .ini, JSON, YAML, XML hoặc PHP array.

Khởi tạo và đọc dữ liệu Config từ mảng dữ liệu PHP

Nếu bạn cung cấp dữ liệu config từ một mảng dữ liệu PHP thì khởi tạo đối tượng Zend\Config\Config để đọc dữ liệu như sau:

Dùng hàm tạo:

new Zend\Config\Config(array $array, $allowModifications = false)
// Mảng dữ liệu lưu giữ cấu hình
$configArray = array(
    'webhost'  => 'www.example.com',
    'database' => array(
        'adapter' => 'pdo_mysql',
        'params'  => array(
            'host'     => 'db.example.com',
            'username' => 'dbuser',
            'password' => 'secret',
            'dbname'   => 'mydatabase'
        )
    )
);

// Khởi tạo đối tượng và nạp dữ liệu $configArray
$config = new Zend\Config\Config($configArray);

//Tiến hành đọc bất kỳ dữ liệu nào bằng toán tử ->,[], hàm get() 
echo $config->webhost;
echo $config->database->params->host;
echo $config['database']['params']->dbname;
echo $config->get('webhost','myhost.vn');
echo $config->webhost;

Lưu ý khi sử dụng Zend\Config\Config

Khi cần truy cập dữ liệu \Zend\Config\Config có thể dùng một trong các cách:

  • dùng toán tử ->
  • dùng toán tử mảng []
  • dùng hàm get().
  • Zend\Config\Config kế thừa Countable và Iterator  do đó bạn có thể duyệt các thành phần bằng foreach, sử dụng hàm count ...
  • Mặc định thì dữ liệu trong Zend\Config\Config sẽ ở tình trạng chỉ đọc và bạn không thể dùng toán tử gán (ví dụ $config->database->host = 'example.com'; sẽ gây lỗi). Tuy nhiên bạn có thể chỉ ra là có phép ghi đè dữ liệu nếu khi bạn khởi tạo bạn chỉ định thuộc tính $allowModifications = true khi khởi tạo (Ví dụ $config = new Zend\Config\Config($configArray, true);
  • Nếu có 2 đối tượng Zend\Config\Config thì bạn có thể trộn chúng vào làm một bằng hàm merge() như ví dụ dưới đây:
$configLocal = new Zend\Config\Config($configArrayLocal);
$config = new Zend\Config\Config($configArray);
$config->merge($localConfig);
  • Lưu ý bạn chỉ có thể sử dụng hàm merge() nếu khi khởi tạo bạn ấn định $allowModifications = true. Sau khi trộn dữ liệu bạn có thể ngăn cản sửa đổi nó bằng hàm setReadOnly().

Nạp dữ liệu Config từ file

Zend\Config\Config cung cấp cách khởi tạo mảng dữ liêu lưu trữ từ file.  Ví dụ mảng dữ liệu trên được lưu trong file config.php như sau:

// config.php
<?php
return array(
    'webhost'  => 'www.example.com',
    'database' => array(
        'adapter' => 'pdo_mysql',
        'params'  => array(
            'host'     => 'db.example.com',
            'username' => 'dbuser',
            'password' => 'secret',
            'dbname'   => 'mydatabase'
        )
    )
);

Thì bạn có thể khởi tạo Zend\Config\Config như sau:

$config = new Zend\Config\Config(include 'config.php');

Sử dụng Zend\Config\Reader để đọc config

Phần trên là cách truy cập cơ bản cho dữ liệu config, giờ chúng chúng ta tìm hiểu các cách đọc dữ liệu khác từ file .ini, JSON, XML ... Cơ bản các đối tượng này được sử dụng với cách tương tự đã trình bày ở trên (cùng một giao diện sử dụng). Tất cả các lớp mở rộng này được định nghĩa trong namespace Zend\Config\Reader, gồm có:

Zend\Config\Reader\Ini              //để đọc file .ini
Zend\Config\Reader\Xml              //để đọc file .xml
Zend\Config\Reader\Json             //để đọc file .json
Zend\Config\Reader\Yaml             //để đọc file .yaml
Zend\Config\Reader\JavaProperties   //để đọc file định dạng thuộc tinnhs Java

Tất cả các class trên đều cùng một giao diện và cung cấp các hàm để nạp dữ liệu vào đối tượng config đó là hàm: fromFile() để nạp từ file và fromString() để nạp từ chuỗi.

Zend\Config\Reader\Ini đọc file .ini

Giả sử bạn có định dạng .ini lưu giữ thông tin như sau: (lưu trong file config.ini)

database.adapter = 'pdo_mysql'
database.params.host = 'db.example.com'
database.params.username = 'dbuser'
database.params.password = 'secret'
database.params.dbname = 'dbproduction'
@include = 'databaseextra.ini' //Gộp dữ liệu từ file khác vào nếu có

Khởi tạo và load và truy cập dữ liệu:

$reader = new Zend\Config\Reader\Ini();
$data   = $reader->fromFile('/path/to/config.ini');
echo $data['webhost'];
echo $data['database']['params']['dbname'];

Zend\Config\Reader\Xml

Tương tự, nếu dữ liệu được lưu dưới định dạng Xml trong file config.xml, có nội dụng như sau:

<?xml version="1.0" encoding="utf-8"?>
<config>
    <webhost>www.example.com</webhost>
    <database>
        <adapter value="pdo_mysql"/>
        <params>
            <host value="db.example.com"/>
            <username value="dbuser"/>
            <password value="secret"/>
            <dbname value="dbproduction"/>
        </params>
    </database>
    <xi:include href="database.xml"/> //Gộp thêm từ file xml khác
 </config>

Thì dữ liệu được nạp vào như sau:

$reader = new Zend\Config\Reader\Xml();
$data   = $reader->fromFile('/path/to/config.xml');

echo $data['webhost'];  // prints "www.example.com"
echo $data['database']['params']['dbname']['value']; 

Zend\Config\Reader\Json

Zend\Config\Reader\Yaml

Zend\Config\Reader\JavaProperties

Các định dạng Json,Yaml, JavaProperties được thực hiện tương tự.

Lưu giữ liệu config vào file

Các class trong Zend\Config\Writer gồm có:

  • Zend\Config\Writer\Ini
  • Zend\Config\Writer\Xml
  • Zend\Config\Writer\PhpArray
  • Zend\Config\Writer\Json
  • Zend\Config\Writer\Yaml

Cung cấp các chức năng để lưu config ra các file theo định dạng Ini,Xml,PhpArray, Json, Yaml. Các lớp này có giao diện tương tự nhau nên bạn chỉ cần tìm hiểu một ví dụ sau đó áp dụng cho định dạng nào là tùy thích vì chúng có hai hàm toFile() hoặc toString()

Ví dụ sử dụng lưu config dạng mảng PHP

$config = new Zend\Config\Config(array(), true);
$config->production = array();

$config->production->webhost = 'www.example.com';
$config->production->database = array();
$config->production->database->params = array();
$config->production->database->params->host = 'localhost';
$config->production->database->params->username = 'production';
$config->production->database->params->password = 'secret';
$config->production->database->params->dbname = 'dbproduction';

$writer = new Zend\Config\Writer\PhpArray();
$writer->toFile("newconfig.php",$config);

Với đoạn code trên nó xuất ra nội dung (trong file) với nội dung:

<?php
return array (
  'production' =>
  array (
    'webhost' => 'www.example.com',
    'database' =>
    array (
      'params' =>
      array (
        'host' => 'localhost',
        'username' => 'production',
        'password' => 'secret',
        'dbname' => 'dbproduction',
      ),
    ),
  ),
);

Xử lý, lọc dữ liệu cho Zend\Config

Zend Framework cung cấp thêm công cụ giúp kiểm tra tính hợp lệ, lọc, biến đổi dữ liệu trong Config đó là: Zend\Config\Processor

Gồm có: ConstantFilterQueueTokenTranslator

Ví dụ sử dụng Filter

use \Zend\Filter\StringToUpper;
use \Zend\Config\Processor\Filter as FilterProcessor;
use \Zend\Config\Config;

$config = new Config(array ('foo' => 'bar'), true);
$upper = new StringToUpper();

$upperProcessor = new FilterProcessor($upper);

echo $config->foo . ',';
$upperProcessor->process($config);
echo $config->foo;

Load Config file qua hàm Factory

//Load từ Array PHP
$config = Zend\Config\Factory::fromFile(__DIR__.'/config/my.config.php');

//Load từ xml
$config = Zend\Config\Factory::fromFile(__DIR__.'/config/my.config.xml', true);