Zend_Config


Zend_Config là 1 lớp trong ZF được thiết kế để truy cập,sử dụng,chỉnh sửa cấu hình của ứng dụng.
ta tạo ra ConfigController để test thử cách dùng Zend_Config

class ConfigController extends Zend_Controller_Action{
public function init(){
      $this->_helper->viewRenderer->setNoRender();
      $this->_helper->layout->disableLayout();
   }
}


vì chỉ để test nên ta tạo ra hàm init(hàm này chạy đầu tiên khi controller được gọi)
$this->_helper->viewRenderer->setNoRender():ko dùng view
this->_helper->layout->disableLayout(): ko load layout vào ứng dụng

1)Sử dụng Zend_Config

public function indexAction(){

      $configArray = array(
          'webhost'  => 'www.example.com',
          'database' => array(
              'adapter' => 'pdo_mysql',
              'params'  => array(
                  'host'     => 'db.example.com',
                  'username' => 'dbuser',
                  'password' => 'secret',
                  'dbname'   => 'mydatabase'
                    )
             )
      );

      $config = new Zend_Config($configArray);
      echo '<br>'.$config->webhost;//output:'www.example.com

      echo'<br>'. $config->database->adapter;//output:pdo_mysql
   }

ban đầu ta tạo ra mảng $configArray lưu trữ thông tin cấu hình ứng dụng ,sau đó khởi tạo đối tượng $config với tham số truyền vào hàm __construct của Zend_Config là mảng $configArray.Ta thử in ra các thông tin đã truyền vào như webhost,adapter
ta cũng có thể truyền thông tin kết nối database trên vào Zend_DB

$db = Zend_Db::factory($config->database);

Nhưng khi bạn thử sửa 1 thông số nào đó,chẳg hạn

$config->webhost = 'www.zendvn.com';

sẽ có lỗi được thông báo bởi vì mặc định thì Zend_Config ko cho ta sửa các thông số được truyền vào.Để làm điều này ta truyền vào tham số thứ 2 cho hàm __contruct của Zend_Config,sửa lại đọan mã trên 1 chút như sau
$config = new Zend_Config($configArray,true);

Vậy là ta đã thực hiện xong việcn truyền thông tin cấu hình vào Zend_Config.Vậy khi muốn đọc thông tin cấu hình có sẵn trong các tập tin ini hay xml trong thư mục cấu hình của ứng dụng thì làm thế nào?
Tôi có tập tin cấu hình ứng dụng application.ini trong thư mục configs

[production]

phpSettings.display_status_errors = 0
phpSettings.display_errors = 0
phpSettings.default_charset = "UTF-8"
phpSettings.date.timezone = "Asia/Ho_Chi_Minh"

//đường dẫn đến tập tion Boostrap
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
//tên tập tin Bootstrap
bootstrap.class = "Bootstrap"

autoloaderNamespaces[] = "Zendvn_"

//thu muc chua cac controller
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.layout.layout = "index"

resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password =""
resources.db.params.dbname = "zftutorial"

[developer : production]
phpSettings.display_status_errors = 1
phpSettings.display_errors = 1
phpSettings.default_charset = "UTF-8"
phpSettings.date.timezone = "Asia/Ho_Chi_Minh"

resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password =""
resources.db.params.dbname = "zftutorial1234"

tạo ra action mới để test vấn đề này

public function iniAction(){

      $filename= CONFIG_PATH.'/application.ini';

      $section = 'production';
      $options = array('allowModifications'=>true,'nestSeparator'=>'.');
      $config = new Zend_Config_Ini($filename,$section,$options);
      $config->resources->db->params->dbname = 'test';
      echo '<pre>';
      print_r($config->resources->db->toArray());
      echo '</pre>';
   }

để đọc tập tin cấu hình có sẵn ta dùng lớp Zend_Config_Ini($filename,$section,$options);
$filename: đường dẫn tuyệt đối đến tập tin cấu hình(ở đây là application.ini)
$section:phân đọan muốn sử dụng(ở đây tôi dùng phân đọan production)
$options:mảng tham số

Hẳng số CONFIG_PATH đã được tôi định nghĩa trong tập tin index.php chạy đầu tiên của ứng dụng

define('CONFIG_PATH', realpath(APPLICATION_PATH . '/configs'));

ta thử in ra mảng chứa thông tin cấu hình kết nối CSDL

echo '<pre>';
      print_r($config->resources->db->toArray());
      echo '</pre>';

tương tự như trên nếu bạn muốn chỉnh sửa thông tin trong file cấu hình đã truyền vào Zend_Config_Ini bạn phải truyền cho hàm __contruct của nó thêm mảng tham số $options

$options = array('allowModifications'=>true,'nestSeparator'=>'.');

allowModifications:cho phép chỉnh sửa
nestSeparator:mặc định là dấu chấm’.’ ,chẳng hạn trong file application.ini của tôi

phpSettings.display_status_errors = 1

ở đây dấu chấm để ngăn cách giữa phpSettings và display_status_errors,nếu trong file cấu hình bạn thích viết là
phpSettings:display_status_errors = 1
thì phải khai báo nestSeparator là dấu hai chấm(:)

Tôi đã đọc tập tin cấu hình ini,vậy nếu 1 số host ko hỗ trợ hàm để phân tích tập tin này thì sao?Thông thường ZF cho phép ta cấu hình ứng dụng bằng cả tập tin .xml
tạo ra action mới để test vấn đề này

public function xmlAction(){
      $xml = CONFIG_PATH.'/config.xml';
      $section = 'production';
      $options = true;
      $config = new Zend_Config_Xml($xml,$section,$options);
      echo $config->database->params->host;
      $config->database->params->dbname = 'testtest';
      echo '<br>'.$config->database->params->dbname;
               echo '<pre>';
      print_r($config->toArray());
      echo '</pre>';
   }

và tập tin cấu hình config.xml của tôi như sau

<?xml version="1.0" encoding="UTF-8"?>
<configdata>
   <production>
      <webhost>www.example.com</webhost>
      <database>
         <adapter>pdo_mysql</adapter>
         <params>
            <host>db.example.com</host>
            <username>dbuser</username>
            <password>secret</password>
            <dbname>dbname</dbname>
         </params>
      </database>
   </production>
   <staging extends="production">
      <database>
         <params>
            <host>dev.example.com</host>
            <username>devuser</username>
            <password>devsecret</password>
         </params>
      </database>
   </staging>
</configdata>

Tương tự như cách độc tập tin.ini
$xml: đường dẫn tuyệt đối đến tập tin cấu hình(ở đây là config.xml)
$section:phân đọan muốn sử dụng(ở đây tôi dùng phân đọan production)
$options:mảng tham số cho phép chỉnh sửa(mặc định là false)

Tiếp theo tôi hướng dẫn cách tạo 1 tập tin config cho ứng dụng hoặc ghi đè các thông tin cấu hình trong tập tin config
tạo ra writeXmlAction để test vấn đề này

public function writeXmlAction(){
      $config = new Zend_Config(array(), true);
      $config->production = array();
      $config->staging    = array();

      $config->setExtend('staging', 'production');

      $config->production->db = array();
      $config->production->db->hostname = 'localhost';
      $config->production->db->username = 'production';

      $config->staging->db = array();
      $config->staging->db->username = 'staging';

      // Write the config file in one of the following ways:
      // a)
      $filename = CONFIG_PATH.'/writeXml.xml';
      $writer = new Zend_Config_Writer_Xml(array('config'   => $config,
                                                 'filename' => $filename));
      $writer->write();

      $writer = new Zend_Config_Writer_Xml();
      $filename = $filename = CONFIG_PATH.'/writeXml2.xml';
      $writer->setConfig($config)
       ->setFilename($filename)
       ->write();

       $filename = CONFIG_PATH.'/writeXml3.xml';
      $writer = new Zend_Config_Writer_Xml();
      $writer->write($filename, $config);
      }

Ban đầu tôi tạo ra 1 đối tượng $config rỗng sau đó thiết lập các thuộc tính cho nó hoặc đơn giản hơn ta có thể tạo ra đối tượng này bằng cách truyền mảng $configArray vào hàm __contruct của Zend_Config như các ví dụ trước

$configArray = array(
          'webhost'  => 'www.example.com',
          'database' => array(
              'adapter' => 'pdo_mysql',
              'params'  => array(
                  'host'     => 'db.example.com',
                  'username' => 'dbuser',
                  'password' => 'secret',
                  'dbname'   => 'mydatabase'
                    )
             )
      );
$config = new Zend_Config($configArray);

Muốn ghi lại thông tin cấu hình ta cần cung cấp hai tham số
$filename:đường dẫn truyệt đối đến tập tin config bạn muốn tạo ra
$config: đối tượng Zend_config

ở ví dụ trên tôi đã tạo ra 3 tập tin cấu hình mới là writeXml.xml,writeXml2.xml và writeXml3.xml

Chỉnh sửa
tạo ra modifyFileAction

public function modifyFileAction(){
      $xml= CONFIG_PATH . '/writeXml2.xml';
      $section = null;
      $options=array('skipExtends'        => true,
                       'allowModifications' => true);
      $config = new Zend_Config_Xml($xml,$section,$options);
      echo '<pre>';
      print_r($config->toArray());
      echo '</pre>';
      $config->production->db->hostname = 'foobar';
      $writer = new Zend_Config_Writer_Xml(array('config'   => $config,
                                           'filename' => $xml));
      $writer->write();
   }

$xml: đường dẫn tuyệt đối đến tập tin xml muốn chỉnh sửa
$section:phân đọan muốn sử dụng
skipExtends:bỏ qua phần mở rộng.Giả sử bạn có phân đọan staging extend từ phân đọan production,khi thay đổi hostname chẳng hạn $config->production->db->hostname = ‘foobar’; nếu bạn để true thì các phân đọan extend từ phân đọan của production sẽ ko chịu sự ảnh hưởng này nhưng nếu bạn để false thì tất cả các phân đọan extend từ production sẽ tự động thiết lập lại hostname
allowModifications:cho phép chỉnh sửa

Lưu ý:muốn chỉnh sửa tập tin xml thì dùng Zend_Config_Writer_Xml còn ini thì dùng Zend_Config_Writer_Ini

ZF còn cho phép ta cấu hình bằng json và YAML .Vấn đề này sẽ đề cập sau,nó cũng tương tự như cách cấu hình ini và xml

Copy from zend.vn

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s