2010-07-28 2 views
0

J'ai un registre où je stocke mes objets de requête, de validation, de base de données et de routeur. Donc pour la validation de mes formulaires, j'utilise une méthode dans la classe MyForm, où les champs de saisie sont vérifiés. Lorsque l'entrée de l'utilisateur est incorrecte, alors Registry :: getInstance() -> validator-> setErrors ($ errors) est appelé, de sorte que les erreurs soient stockées dans le registre et soient disponibles n'importe où dans le code.étendue des objets stockés dans la classe de registre php

Voilà pourquoi j'appelle Registre :: getInstance() -> validator-> getErrors() dans 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>'; 
     } 
    } 
?> 

Bien que $ MyForm-> isValid() remplit les erreurs ici dans le Registre :: getInstance() -> validator-> setErrors ($ errors) correctement, clairement visible avec var_dump (Registry :: getInstance()), l'objet validateur est null, lorsqu'il est appelé dans MyView.php.

Donc, c'est toujours le même objet. Mais les errortexts ont disparu. Pourquoi?

Et où est le meilleur endroit pour stocker errortexts lorsque la validation dans MyForm.php est fausse, afin que je puisse saisir le texte dans MyView.php?

Edit: c'est le registre

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() { } 

}

Je suppose, il a à voir avec la communication entre la vue et le contrôleur. D'une manière ou d'une autre cela ne fonctionne pas. Je ne sais pas où inclure la vue, qui est juste html, pas généré. Ceci est mon RegistrationController

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

} Je suis toujours confondu avec la vue. Comme:

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

} Où est le lieu d'appeler une vue, lui dire que l'action a été fait avec des erreurs, donc il y a du texte dans le registre-conteneurs pour la vue de montrer?

+1

Vous devrez montrer le code de votre registre. –

Répondre

1

Alors que vos variables survivront dans une seule requête, les demandes suivantes conserveront un objet vierge Registry sans les variables définies. La solution serait de stocker (une partie de) le singleton Registry dans une session, et à la première instanciation charger ces variables. Quelque chose comme:

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

ou seulement une partie:

.... 
if(null === self::$_instance) { 
    if(!isset($_SESSION)) session_start(); 
    self::$_instance = new self(); 
    if(isset($_SESSION['RegistryPersistent'])) self::$_instance->_cache['persistent'] = &$_SESSION['RegistryPersistent']; 
} 
.... 
Questions connexes