2011-07-28 3 views
1

우리는 우리의 웹 애플리케이션을 위해 내 직장에서 ZendFramework를 사용하고 있습니다. 괜찮습니다. 그러나 의존성 주입과 제어 반전, a 등등과 같은 가장 현대적인 실천이 부족합니다.젠드 프레임 워크와의 통합

몇 달 동안 저는 DI 드라이브 및 AOP를 테스트 드라이브로 사용할 때 Ding 프레임 워크를 사용했습니다. 나는 그것을 정말로 좋아한다. 그래서 나는 그것을 우리 프로젝트에 가져 가고 싶다.

하지만 어떻게? 따라서 Zend Framework 어플리케이션에서 Ding을 올바르게 통합하는 방법에 대한 질문이 있습니다. ZF 컨트롤러가 bean이 될 수 없다는 것을 고려하면 (예 : 발송자가 바로 인스턴스를 생성 할 때), 모든 종속성을 효과적으로 주입하는 방법은 무엇입니까?

P.s : 젠드 프레임 워크를 사용하지 않는 것은 (적어도 중기에는) 옵션이 아닙니다. P.P.S : 누구든지 "딩 (ding)"을 새 태그로 추가하는 데주의합니까?

+0

오늘 새 Ding 프레임 워크를 발표했으며 홍보를 찾고 있습니까? –

+0

감사합니다.하지만 저자가 아니란 것을 확인할 수 있습니다. – laurac

+0

Ding Framework이란 무엇입니까? 링크, 제발? – curtisdf

답변

1

딩이 당신을 돕고있어서 기쁩니다. 이 프로젝트에 참여하고 Zend Framework 응용 프로그램과 통합해야했습니다. 이를 위해 Zend의 애플리케이션 리소스와 플러그인 시스템을 사용했습니다.

응용 프로그램 자원

<?php 
class Application_Resource_Ding extends Zend_Application_Resource_ResourceAbstract 
{ 

    protected $_options = array(
     'factory' => array(
      'bdef' => array(
       'xml' => array(
        'filename' => array('beans.xml') 
       ), 
      ), 
     ), 
     'cache' => array(
      'proxy' => array('impl' => 'dummy'), 
      'bdef' => array('impl' => 'dummy'), 
      'beans' => array('impl' => 'dummy') 
     ) 
    ); 

    public function init() 
    { 
     // set default config dir before mergin options (cant be set statically) 
     $this->_options['factory']['bdef']['xml']['directories'] = array(APPLICATION_PATH .'/configs'); 

     $options = $this->getOptions(); 

     // parse factory properties (if set) 
     if (isset($options['factory']['properties'])) { 
      $options['factory']['properties'] = parse_ini_file(
       $options['factory']['properties'] 
      ); 
     } 

     // change log4php_properties for log4php.properties (if exists) 
     if (isset($options['log4php_properties'])) { 
      $options['log4php.properties'] = $options['log4php_properties']; 
      unset($options['log4php_properties']); 
     } 
     $properties = array(
      'ding' => $options 
     ); 

     return Ding\Container\Impl\ContainerImpl::getInstance($properties); 
    } 

} 

액션 도우미는 컨트롤러 내부에서 사용하는 (당신이 프로젝트 사이에서 다시 사용할 수 있습니다)에서

<?php 

class Application_Action_Helper_Ding extends Zend_Controller_Action_Helper_Abstract 
{ 

    protected $ding = null; 

    public function init() 
    { 
     // just once... 
     if (null !== $this->ding) { 
      return; 
     } 

     // get ding bootstrapped resource 
     $bootstrap = $this->getActionController()->getInvokeArg('bootstrap'); 

     $ding = $bootstrap->getResource('ding'); 

     if (!$ding) { 
      throw new Zend_Controller_Action_Exception(
       'Ding resource not bootstrapped' 
      ); 
     } 

     $this->ding = $ding; 
    } 

    public function getBean($bean) 
    { 
     return $this->ding->getBean($bean); 
    } 

    public function direct($bean) 
    { 
     return $this->getBean($bean); 
    } 

} 

당신의 application.ini이 같은 (플러스 여분을 추가해야합니다 구성이 필요합니다)

resources.frontController.actionHelperPaths.Application_Action_Helper = "Application/Action/Helper" 

resources.ding.factory.properties = APPLICATION_PATH "/configs/ding.properties" 
resources.ding.log4php_properties = APPLICATION_PATH "/configs/log4php.properties" 

그런 다음 컨트롤 rs, 빈을 요청하는 경우 :

$service = $this->_helper->ding('someService'); 

희망이 있습니다.

+0

감사합니다! 나는이 접근법을 시도 할 것이다! – laurac

+0

Ding이 의존성 주입을 제공하는 경우 컨트롤러를 인스턴스화 한 후에 ZF에 의해 호출되는 공통 컨트롤러 수퍼 클래스의'init()'메소드에서 호출하십시오. –

+0

나는 오버 헤드를 피하면서 개발자에게 사용 편의성을 제공하기 때문에 'action helper'접근법을 선호합니다. 컨트롤러의'init()'메소드를 사용하여 모든 컨트롤러의 액션에 공통적 인 의존성을로드 할 수있다. 내 expierence, 나는 내'init()'메서드에 대해 생각하는 것보다 약간의 키 스트로크를 입력하는 것을 선호한다. – agvstin