использование шаблона Observer с веб-сайтом MVC / Codeigniter - PullRequest
1 голос
/ 10 августа 2011

У меня есть веб-сайт, который я конвертирую в Codeigniter, и я хочу упростить и отделить его. Мне нравится то, что я читал о шаблоне Observer для таких вещей, как «новый опрос создан» (который запускает новый тикет помощи, который вызывает электронную почту и т. Д.).

Но как мне реализовать такую ​​вещь в Code Igniter? Я вижу компонент Symfony, но на данный момент меня не беспокоит понимание системы, а также выяснение того, как использовать ее в контроллерах и моделях. Я расширил и CI_Model и CI_Controller уже по другим причинам. Будет ли лучший код шаблона Observer?

Я представляю себе такую ​​ситуацию: кто-то заходит на веб-сайт и порождает запрос, который перенаправляется на контроллер / действие: 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) { ... }
}

Я вижу, насколько мощным это будет. Но я не уверен, как упростить настройку и подключение всех этих слушателей / наблюдателей.

Может быть, у меня должна быть фабрика, чтобы создать их всех? Просто кажется, что да, они будут отделены от того, как это работает в настоящее время, но кажется, что управление всеми различными объектами, которые мне нужно «прикрепить» в каждом контроллере или методе, стало бы связанным по-другому.

Спасибо, Hans

1 Ответ

0 голосов
/ 10 августа 2011

Ваша предложенная структура должна выглядеть примерно так:

$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 может справиться с ней, выполнив одно и то же?

Я думаю, что вам лучше иметь библиотеку или модель, которая знает, что она должна делать и хорошо спроектирована, а затем добавляет эту структуру классов. Я не вижу выгоды, перевешивающие затраты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...