Welcome to Abdul Malik Ikhsan's Blog

Zend Framework 2 : ServiceLocator ControllerLoader – Get Module Configuration from Controller

Posted in Teknologi, Tutorial PHP, Zend Framework 2 by samsonasik on July 12, 2012

Zend Framework 2, dengan segala fiturnya, telah mengubah pola pikir dalam membuat aplikasi secara modular. Dalam setiap module yang kita buat, kita mempunyai file konfigurasi yang bernama module.config.php yang nantinya akan di-merge dengan file-file konfigurasi di module lain.

Misalkan, dalam module.config.php sebagian konfigurasi bertuliskan seperti berikut :

return array(
    'Test' => array(
        'moduletitle' => 'ini title module test',
        'moduledesc' => 'Ini desc module test'
    ),
    /*........other config : route, view_manager , controllers invokables, etc............*/
);

Nah, untuk ‘membaca’ file konfigurasi tersebut. kita perlu mendaftarkan factory yang nanti bisa diakses dari Controller.

namespace Test;

use Zend\Mvc\ModuleRouteListener,
    Zend\ModuleManager\ModuleManager;

class Module {

    public function init(ModuleManager $moduleManager){ /* code ....*/}
    public function getConfig(){ /* other code ... */}
    public function getAutoloaderConfig(){ /* other code ... */}
    public function onBootstrap($e){ /* other code ... */ }

    public function getControllerConfig()
    {
        return array(
            'factories' => array(
                'testfactory' => function($sm)  {
                    $config = $sm->get('Configuration');
                    $testcontroller = new Controller\TestController;
                    $testcontroller->setTestParam($config);
                    return $testcontroller->getTestParam();
                }
            ),
        );
    }
}

Kalau sudah, kita bisa membaca deh itu file konfigurasi seperti berikut di Controller kita :

namespace Test\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class TestController extends AbstractActionController
{
    protected $param;
    
    public function indexAction()
    {
        $loc =  $this->getServiceLocator()->get('ControllerLoader');
        $config =  $loc->get('testfactory')  ;

      // Print it for Testing ... ūüėČ
      // print_r($config);

        $loc->get('ViewHelperManager')
                ->get('headtitle')->set($config['Test']['moduletitle']);
        $loc->get('ViewHelperManager')
                ->get('headmeta')->appendName('description', $config['Test']['moduledesc']);

        return array();
    }
    
    public function setTestParam($param)
    {
        $this->param  = $param;
    }
    
    public function getTestParam()
    {
        return $this->param;
    }
}

Cara di atas nampaknya begitu kompleks, saya memberikan contoh tersebut sebagai pendekatan pemahaman bahwa kita bisa mendaftarkan factory-factory dalam Module.php yang bisa melakukan “sesuatu” terhadap Controller. Apabila hal yang ingin di-“sesuatu” kan itu bukan Controller, -Model misalnya-. Kita bisa mendaftarkan factory pada getServiceConfiguration seperti berikut :

public function getServiceConfig()
{ 
     return array(
            'factories' => array(
                'testmodel' => function($sm)  {
                     $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                     $testmodel = new Model\Testmodel($dbAdapter);

                     return $testmodel;
                }
            ),           
        );
}

Sehingga tinggal kita Get di sisi Controller tanpa instansi atau setValue secara eksplisit seperti :

$this->getServiceLocator()->get('testmodel');

Hehehe :D. Sebenarnya, untuk sekadar mendapatkan nilai dari file konfigurasi yang telah dimerge, kita bisa menyingkat menjadi langsung panggil get(‘Configuration’) melalui ServiceLocator di Controller seperti berikut :

$config =  $this->getServiceLocator()->get('Configuration');

Sebagai catatan, yang dihasilkan di atas adalah Configurasi Merge All Module. Nah, kalau kita hanya ingin membaca file module.config.php di module current saja, maka bisa menggunakan shortcut sebagai berikut di dalam Controller :

$config =  Module::getConfig();

Done !

NB :
Sebenarnya, untuk setting headtitle dan headmeta sebaiknya dilakukan di Module.php. Contoh di atas hanyalah penjabaran kalau misalnya kita hendak memanggil file konfigurasi kita.

Referensi :
1. http://blog.evan.pro/module-specific-layouts-in-zend-framework-2
2. http://stackoverflow.com/questions/8957274/access-to-module-config-in-zend-framework-2

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

%d bloggers like this: