объем объектов, хранящихся в реестре класса php - PullRequest
0 голосов
/ 28 июля 2010

У меня есть реестр, в котором я храню объекты запроса, валидатора, базы данных и маршрутизатора. Поэтому для проверки моих форм я использую метод в классе MyForm, где проверяются поля ввода. Если пользовательский ввод неправильный, вызывается Registry :: getInstance () -> validator-> setErrors ($ errors), так что ошибки сохраняются в реестре и становятся доступными в любом месте кода.

Вот почему я вызываю Registry :: getInstance () -> validator-> getErrors () в MyView.php

</head><body>
<form accept-charset="utf-8" action="newuser.php" method="post">
<?php
    $errors = Registry::getInstance()->validator->getErrors();
    if($errors) {
        foreach($errors as $error) {
            echo '<p>'. $error . '</p>';
        }
    }
?>

Несмотря на то, что $ MyForm-> isValid () заполняет ошибки здесь в Registry :: getInstance () -> validator-> setErrors ($ errors) правильно, что ясно видно с помощью var_dump (Registry :: getInstance ()), объект-валидатор имеет значение null при вызове в MyView.php.

Так что это все тот же объект. Но ошибки пропали. Почему?

А где лучше всего хранить тексты ошибок, когда проверка в MyForm.php ложна, чтобы я мог получить текст в MyView.php?

Edit: это реестр

class Registry {
private static $_instance = null;
private $_cache = array();

public static function getInstance()
{
    if(null === self::$_instance) {
        self::$_instance = new self;
    }
    return self::$_instance;
}


public function __set($index, $value) {

    if(!empty($index) && is_string($index)  && !array_key_exists($index, $this->_cache)) {
        $this->_cache[$index] = $value;
    }
    else {
        // Errorhandling here ...
    }
}

public function __get($name)
{
    if(array_key_exists($name, $this->_cache) && !empty($this->_cache[$name])) {
        return $this->_cache[$name];
    }
    else {
        return null;
    }
}

public function __unset($index)
{
    unset($this->_cache[$index]);
}


private function __construct() {}
private function __clone() { }

}

Полагаю, это связано с обменом данными между View и Controller. Как-то не работает. Я не знаю, где включить представление, которое просто HTML, а не генерируется. Это мой регистрационный контроллер

class RegistrationController extends Controller {
public function execute()
{
    $form = new RegistrationForm;
    if($this->request->issetPost()) {
        $posts = $this->request->getPosts();
        if($form->isValid($posts)) {
            // [..save .]
        }
    }
}

} Я все еще смущен с представлением. Как:

switch($page) {
case 'index':
    // ..
    break;
case 'news':
    // ..
    break;
case 'register_new_user':
    $newuser = new RegistrationController;
    $newuser->sign();
    break;

} Где находится место для вызова представления, скажите ему, что действие было выполнено с ошибками, так что в Registry-Container есть текст для отображения представления?

1 Ответ

1 голос
/ 28 июля 2010

В то время как ваши переменные выживут в одном запросе, последующие запросы все равно будут иметь объект Registry без установленных переменных. Решением было бы сохранить (часть) синглтона Registry в сеансе и при первом запуске загрузить эти переменные. Что-то вроде:

....
if(null === self::$_instance) {
    if(!isset($_SESSION)) session_start();
    self::$_instance = isset($_SESSION['Registry']) ? $_SESSION['Registry'] : new self();
    $_SESSION['Registry'] = self::$_instance;
}
....

Или просто порция:

....
if(null === self::$_instance) {
    if(!isset($_SESSION)) session_start();
    self::$_instance = new self();
    if(isset($_SESSION['RegistryPersistent'])) self::$_instance->_cache['persistent'] = &$_SESSION['RegistryPersistent'];
}
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...