2015-01-08 3 views
0

내 프로젝트에있는 모든 컨트롤러 동작을 꾸미고 싶습니다. 조치 방법이 호출 될 때마다 사용자 정의 로거 엔진을 시작하고 중지하려고합니다. 이처럼일반 컨트롤러 동작 꾸미기

: 나는 것을 자동화하고 싶은

class HomeController 
{ 
    public function indexAction() 
    { 
     Logger:start(); 
     someLogicInThere(); 
     ... 
     Logger:end(); 
    } 
} 

이 같은 일부 클래스 또는 일까지 연장.

내 최종 클래스 컨트롤러는 다음과 같이 표시됩니다

class HomeController extends ControllerDecorator 
{ 
    public function indexAction() 
    { 
     someLogicInThere(); 
     ... 
    } 
} 

을 BTW : 로거 물건은 정말 중요하지 않습니다. 내 질문은 더 많은 디자인 패턴 문제입니다

좋은 아이디어 있으십니까?

답변

0

ControllerDecorator 내에서 beforeAction (http://www.yiiframework.com/doc/api/1.1/CController#beforeAction-detail) 및 afterAction (http://www.yiiframework.com/doc/api/1.1/CController#afterAction-detail)의 기본 제공 메서드를 사용할 수 있습니다. 이렇게하면 ControllerDecorator를 확장 할 때마다 모든 클래스를 꾸밀 수 있습니다.

ps : 나는 Yii를 사용하고 있다고 가정합니다. 권리?

+0

저는 Yii를 사용하지 않습니다. Zend-framework 1 – Mauro

+0

그러면 다음과 같이 보셔야합니다 : http://framework.zend.com/manual/1.12/en/zend.controller.action.html. 특히 init() 메소드에주의하십시오. 그것은 당신의 컨트롤러의 모든 행동을위한 후크로 작동합니다. 그게 당신이 찾고 있던거야? – Masiorama

+0

이것은 좋은 생각이 아닙니다 (예전과 사후 파견을 사용합니다). 그러나이 방법에서는 (메서드 이름, 인자 등) 실제 액션에 대한 충분한 정보가 없습니다. – Mauro

0

Cross-cutting concern이라는 문제점이 있습니다. 이를 처리하는 한 가지 방법은 Aspect-oriented programming입니다. 5.4 Traits 때와

당신은 할 수 가짜 이것은 PHP에서> = : 나는 기본 클래스 작성이 과정을 자동화 한 실험으로

trait Logger 
{ 
    public function indexAction() 
    { 
     echo 'logging before<br>'; 

     parent::indexAction(); 

     echo 'logging after<br>'; 
    } 
} 

class HomeControllerBase 
{ 
    public function indexAction() 
    { 
     echo 'indexAction<br>'; 
    } 
} 

class HomeController extends HomeControllerBase 
{ 
    use Logger; 
} 

$homeController = new HomeController(); 
$homeController->indexAction(); 

:

https://github.com/bitworking/AOP

을 나는 않을 것 많은 리소스가 필요하기 때문에 실제로 프로덕션 환경에서 이것을 사용하십시오.

doctype을 구문 분석하고 새로 생성 된 클래스를 캐시하는 AOP 프레임 워크를 더 잘 살펴보십시오. 은 테스트되지 않음 :

http://go.aopphp.com/

https://github.com/AOP-PHP/AOP

크로스 커팅 문제를 처리 할 수있는 또 다른 방법은 event driven programming을 사용하는 것입니다. 이것은 AOP처럼 100 % 분리하지 않지만 PHP에서 특히 승인 된 디자인 패턴입니다.

+0

' 모든 컨트롤러에서 작업을 만들 때마다 그것을하고 싶지 않습니다. 특성 아이디어는 훌륭합니다. 내가 뭔가 더 '자동' – Mauro

+0

좋아, 당신이 모든 작업에 동일한 메서드를 호출해야 할 경우 [컨트롤러 플러그인] (http://framework.zend.com/manual/1.12/en/zend .controller.plugins.html) 그리고'preDispatch' ans'postDispatch' 훅을 사용하십시오. – bitWorking

+0

[여기] (http://www.masterzendframework.com/wp-content/uploads/2012/07/zenddispatch_en.png) 완벽한 디스패치 프로세스로 멋진 그래픽을 볼 수 있습니다. – bitWorking