2009-11-27 4 views
0

J'ai un problème que je n'arrive pas à comprendre.Méthode de chargement du contrôleur actuel

Je construis un petit framework (pratique) et maintenant je construis la librairie Validator. tout fonctionne super sauf quand j'essaye de corriger la règle du "callback". La règle de rappel est utilisée lorsque le dev a besoin d'utiliser une règle qui n'existe pas dans la bibliothèque Validator.

Voici comment je le fais.

Dans le contrôleur:

$this->validator->check('req|callback:test', $_POST['module_name'], 'Module Name'); 

Validator Classe:

public function check($rules, $input, $fieldname='') { 
    $rule = explode('|', $rules); 
    foreach ($rule as $r) { 
     $request = explode(":",$r,2); 
     $method = array_shift($request); 
     $parameter = $request; 
     array_unshift($parameter,$input); 
     array_push($parameter,$fieldname); 
     if (method_exists($this, $method)) { 
      call_user_func_array(array($this,$method), $parameter); 
     } 
    } 

protected function callback($input, $key, $fieldname='') { 

} 

Mon problème est que, comment puis-je utiliser le contrôleur "courant". Par exemple, dans ce cas, je dois trouver:

UserController::test(); 

je peux trouver la bonne méthode dans la clé de $, mais est la façon simple à comprendre contrôleur Wich qui roule?

J'ai essayé d'utiliser l'URL comme:

$controller = ucfirst($uri->uri[1]).'Controller'; 
$controller::$key(); 

Mais cela n'a pas du tout .. Toutes les idées?

Répondre

0

Différentes façons d'aborder cette question.

D'abord, je suppose que quelque part vous avez un code qui transforme un URI

example.com/foo 

dans un contrôleur classname

class FooController 

Ceci est appelé "routage". Si tel est le cas, exposez en quelque sorte votre classe/méthode de routeur au validateur et/ou à l'ensemble du système. Cela vous permettra, à tout moment, d'obtenir le nom d'un contrôleur de l'URI. Deuxièmement, lors de l'instanciation de votre validateur, donnez-lui une référence à l'objet contrôleur pour la requête particulière. Ensuite, il suffit d'un simple appel au get_class_name ou à l'API de réflexion. Troisièmement, vous devez passer votre contrôleur avec votre appel à la méthode check.

+0

Je l'ai eu pour fonctionner maintenant et je peux valider le rappel du contrôleur courant MAIS, quand j'essaye de placer un message d'erreur comme: $ this-> validator-> set_error ("message d'erreur de rappel"); Il n'est pas enregistré dans le tableau d'erreurs de la classe de validateur. Pourquoi ça? – Tobias

+0

Résolu avec call_user_func() :) Merci quand même. – Tobias

Questions connexes