저는 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) { ... }
}
나는 것이 그 얼마나 강력한 볼 수 있습니다. 그러나 나는이 청취자/관찰자 모두의 설치 및 연결을 단순화하는 방법을 잘 모릅니다.
어쩌면 나는 그들을 모두 만드는 공장을 가지고 있어야할까요? 그냥 네처럼 보이지만 현재 작동하는 방식과 분리되어있을 것입니다.하지만 각 컨트롤러 나 방법에서 '부착 된'모든 다른 객체를 관리하는 것이 다른 방식으로 결합 될 것입니다.
덕분에,
그래, 나는 모든 이벤트를 지시 할 수있는 앱 코어에 대한 아이디어를 좋아하지만 실제로는 그렇게 쉽게 될 것이라고 생각하지 않는다. 나는 정적 방법 경로를가는 것에 대해 생각하고 나는 Kohana가 그것을 어떻게하는지 알아 내려고 노력했다. (그러나 아직 자세하게 살펴볼 시간이 없었다) – Hans
Kohana가 3.0에서 꺼낸 것처럼 보였다. 흠. 그들이 그것이 효과가 없다고 생각한다는 것을 의미하는 것 같습니까? 사람들은 여전히 그것을 정적 클래스로 지원하고 있지만 더 이상 핵심 모듈은 아닙니다. – Hans