Простой MVC в РНР


У меня есть очень простой PHP-библиотеки MVC для моего авто-дидактических педагогических целей. У меня возникли небольшие проблемы, выясняя, как добавить в Обозреватель моделей, как показано в этой UML-схемы из Википедии.

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

Итак, наблюдение взаимоотношений между тремя, где мое понимание ломается. У меня contrlr реализации SplOberserver и SplSubject, но как именно следует обрабатывать связь между ними? Конкатенации строк в strHtml?

Обратите внимание, что я хочу, чтобы эти классы соответствуют UML-диаграммы связаны с выше Википедии.

class model {

        private $arrValues = array();

        public function __get($var) {
                return $this->arrValues[$var];
        }

        public function __set($var, $val) {
                $this->arrValues[$var] = $val;
        }

}

class contrlr implements SplOberver, SplSubject {

        private $objModel;

        public function __construct( model $objModel ) {
                $this->objModel = $objModel;
        }

        public function parsePost( array $arrPost ) {
                foreach ( $arrPost as $key => $value ) {
                        $this->objModel->$key = $value;
                }
        }

        public function update() {
        }

        public function attach() {
        }

        public function detach() {
        }

}

class view implements SplObserver {

    private $strHtml;

    public function getHtml() {
        return $this->strHtml;
    }
}


1505
4
задан 30 января 2011 в 05:01 Источник Поделиться
Комментарии
1 ответ

В отличие от других интерфейсов шлицов, я не нахожу, что эта пара встроенных интерфейсов имеет никакой внутренней ценности, кроме как предоставить шаблон. Было бы неплохо, если бы наблюдатель может автоматически инициировать ее обновление() метод любое время субъектных свойств изменяются в любом случае, но это не тот случай. Вы должны настроить его вручную.

Поэтому для начала, вы хотите отделить contrlr на отдельные SplSubject и SplObserver классов. В противном случае, для всех намерений и целей, это только предупредив себя. модель может быть тот, который реализует SplObserver в вашем случае. Но на самом деле, что класс реализует интерфейс, который был до вас. Вот только один пример базового использования...

class Observer implements SplObserver {

function update(SplSubject $subject) {
echo "notified: " . $subject->status . "\n";
}

}

class Subject implements SplSubject {
private $status;
private $observer;

function __construct(SplObserver $observer) {
$this->attach($observer);
}

function __destruct() {
$this->detach($this->observer);
}

function __get($prop) {
return $this->$prop;
}

function __set($prop, $val) {
$this->$prop = $val;
$this->notify();
}

function notify() {
$this->observer->update($this);
}

function attach(SplObserver $observer) {
$this->observer = $observer;
$this->__set("status", "attaching");
}

function detach(SplObserver $observer) {
$this->__set("status", "detaching");
$this->observer = null;
}

}

$observer = new Observer();
$sub1 = new Subject($observer);
$sub1->status = "testing";
$sub2 = new Subject($observer);
unset($sub2);
$sub1->status = "testing again";

Редактировать: вы могли бы отделить "модель", "вид" и "контроллер" классы все расширяя абстрактный базовый класс, который реализует SplSubject, SplObserver. Таким образом все они могут общаться друг с другом и дополните свой график. Но, проблема в том, что все центры вокруг уведомить() метод, где без опции выбора наблюдателя сообщим, каждый получает сообщение Update. Решение разрешить взаимодействие только одного наблюдателя в то время, можно было бы вырвать ссылка на СПЛ интерфейсы полностью и уведомить() метод в конкретной наблюдателя аргумент, чтобы отправить.

Взгляните на следующий пример, который хотя и имеет в основном те же методы, что СПЛ интерфейсов смешанных вместе, требовать, он не реализует эти интерфейсы на всех. Вместо этого, каждый метод принимает переменное число аргументов (как ожидается, будут другие объекты SubjectObserver)...

abstract class SubjectObserver {
protected $observer_list = array(); // assoc array of classname=>object
public $status;

function update(SubjectObserver $subject) {
echo get_class($this) . " notified by " . get_class($subject) . ": " . $subject->status . "\n";
}

function __destruct() {
foreach ($this->observer_list as $observer)
{ $this->detach($observer); }
}

function notify() {
$args = func_get_args();
foreach ($args as $arg)
{ $this->observer_list[get_class($arg)]->update($this); }
}

function attach() {
$args = func_get_args();
foreach ($args as $arg) {
$this->observer_list[get_class($arg)] = $arg;
$this->status = "attaching " . get_class($arg);
$this->notify($arg);
}
}

function detach() {
$args = func_get_args();
foreach ($args as $arg) {
$this->status = "detaching " . get_class($arg);
$this->notify($arg);
unset($this->observer_list[get_class($arg)]);
}
}

}

class model extends SubjectObserver {}

class view extends SubjectObserver {}

class controller extends SubjectObserver {}

// initialize
$model = new model();
$view = new view();
$controller = new controller();

$model->attach($controller, $view);
$view->attach($controller, $model);
$controller->attach($model, $view);

// process some input
$controller->status = "input received";
$controller->notify($model);
$model->status = "data filtered";
$model->notify($controller, $view);

1
ответ дан 30 января 2011 в 08:01 Источник Поделиться