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ừaCountable
vàIterator
do đó bạn có thể duyệt các thành phần bằngforeach
, sử dụng hàmcount
...- 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àmsetReadOnly()
.
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ó: Constant
, Filter
, Queue
, Token
, Translator
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);