2011-08-10 5 views
1

저는 Codeigniter로 변환 중이며 단순화 및 분리하려고하는 웹 사이트가 있습니다. 나는 "새로운 설문지가 만들어졌다"(이메일을 트리거하는 새로운 도움말 티켓을 유발 함)와 같은 것들에 대해 Observer 패턴에 대해 읽은 것을 좋아합니다.MVC/Codeigniter 웹 사이트에서 옵저버 패턴을 사용합니다.

하지만 어떻게 코드 이그니 터에서 그러한 일을 구현합니까? Symfony 구성 요소를 보았지만이 시점에서 컨트롤러와 모델에서 사용하는 방법을 파악하는 것만큼이나 시스템을 이해하는 것에 관심이 없습니다. 다른 이유로 CI_Model과 CI_Controller를 이미 확장했습니다. 옵서버 패턴 코드가 최고가 되겠습니까?

나는 점 같은 상상 : 누군가가 웹 사이트를 치게되어 컨트롤러/액션로 전달됩니다 요청을 생성합니다 : http://localhost/test/save_changes

// warning, pseudo-code! 

class Test extends MY_Model 
{ 
    public function __construct() 
    { 
     // do I put this here?!? - or maybe in MY_Model? 
     // Should it be a singleton? 
     $this->load->library('dispatcher'); 
     // where do I attach what I want... here? 
     $this->load->library('emailer'); 
     $this->dispatcher->attach($this->emailer); 
     // what if I have 50 possible things that might happen 
     // based on any given event, from adding a user to 
     // deleting a survey or document? There has got to be a 
     // way to attach a bunch of observers that trickle 
     // down to each object, right? 
    } 

    public function save_changes() 
    { 
     $this->load->model('user'); 
     $this->user->init($this->session->userdata('user.id'))->save();    
    } 
} 



class User extends MY_Model 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
     // do I put this here?!? 
     $this->load->library('dispatcher'); // just something to call it 
    } 

    public function init($id) 
    { 
     if($this->_loadUser ($id)) 
     { 
      $this->dispatcher->notify($this, 'user.loaded'); 
     } 
    } 

    public function save($id) 
    { 
     if(parent::save()) 
     { 
      $this->dispatcher->notify($this, 'user.saved'); 
     } 
    } 



} 

class Emailer 
{ 
    public function update ($caller,$msg) 
    { 
     switch ($msg) 
     { 
      case 'user.saved': 
     // send user an email 
     // re-cache some stuff 
     // other things that we might want to do, including more of these: 
     $this->dispatch->notify('user-saved-email-sent'); 
      break; 
     } 
    } 
} 

class Dispatcher 
{ 
    public function notify ($caller, $msg) { ...foreach attached do $obj->update($caller,$msg) ...} 
    public function attach ($obj) { ... } 
    public function detach ($obj) { ... } 
} 

나는 것이 그 얼마나 강력한 볼 수 있습니다. 그러나 나는이 청취자/관찰자 모두의 설치 및 연결을 단순화하는 방법을 잘 모릅니다.

어쩌면 나는 그들을 모두 만드는 공장을 가지고 있어야할까요? 그냥 네처럼 보이지만 현재 작동하는 방식과 분리되어있을 것입니다.하지만 각 컨트롤러 나 방법에서 '부착 된'모든 다른 객체를 관리하는 것이 다른 방식으로 결합 될 것입니다.

덕분에,

답변

0

귀하의 제안 된 구조 한스 같은 뭔가해야 할 것 :

$this->load->library('observer_factory', 'of'); // factory for creating observers 
// Observer_factory would have knowledge/access to different classes which relate 
// to the pattern. 
$ync = $this->of->getNotifier($some_variable)); 
$ync->attach($this->of->getObserver($some_other_variable)); 
$ync->attach($this->of->getObserver($some_final_variable)); 

$ync->someMethod(); // someMethod calls notify 

을하지만 난 그것에 대해 궁금합니다. 천천히 모든 것을 알게되는 공장 수업을 가질 수 있습니다. 로더의 기능을 빼앗기 시작합니다. Observer_factory이 똑같은 작업을 수행하여 라이브러리를로드하는 이유는 무엇입니까?

나는 당신이해야 할 일을 잘 알고 있고 잘 설계되어있는 라이브러리 나 모델을 더 잘 사용한다고 생각한다. 그런 다음이 클래스 구조를 추가한다. 나는 비용을 능가하는 이득을 보지 못했다.

+0

그래, 나는 모든 이벤트를 지시 할 수있는 앱 코어에 대한 아이디어를 좋아하지만 실제로는 그렇게 쉽게 될 것이라고 생각하지 않는다. 나는 정적 방법 경로를가는 것에 대해 생각하고 나는 Kohana가 그것을 어떻게하는지 알아 내려고 노력했다. (그러나 아직 자세하게 살펴볼 시간이 없었다) – Hans

+0

Kohana가 3.0에서 꺼낸 것처럼 보였다. 흠. 그들이 그것이 효과가 없다고 생각한다는 것을 의미하는 것 같습니까? 사람들은 여전히 ​​그것을 정적 클래스로 지원하고 있지만 더 이상 핵심 모듈은 아닙니다. – Hans

관련 문제