Question

Situation actuelle:

  • Je version actuelle de mon framework MVC qui utilise des classes en tant que contrôleurs.
  • J'ai quelques modules "vintage" de mon vieux framework MVC qui utilise simple, plat comprend en tant que contrôleurs.

Beaucoup simplifié qui signifie:

Nouvelle version:

<?PHP
class blaController extends baseController {
    private $intVar;

    function dosomethingFunction() {
        $this->intVar = 123;
        $this->view('myView');
    }
}
?>

Ancienne version:

<?PHP
$globalVar = 123;
// view "controllername" is automatically shown
?>

Je suis maintenant en train d'écrire un wrapper pour pouvoir utiliser mes anciens contrôleurs dans mon nouveau MVC sans avoir à tout réécrire. Pour ce faire, j'ai un contrôleur « wrapper »:

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';
        $this->view('old_dosomething_view');
    }
}

(Encore une fois:.. Ceci est très, très simplifié - juste pour l'idée sur pas le code réel)

Le problème avec cette approche est que le globalVar de variable globale $ précédemment existe maintenant seulement à l'intérieur de la méthode « dosomethingFunction » et ne peut être consulté par la vue.

Ce ne serait pas le cas si je pouvais forcer l'obliger à se comporter comme « une portée mondiale » afin que globalVar $ serait de nouveau disponible dans la portée mondiale.

: Est-il possible d'atteindre " require_global " ou quelque chose de similaire

?

(Une solution pour mon problème serait de modifier mes anciens contrôleurs pour commencer avec un tas de commandes « globales », mais je préfère une solution où je ne dois pas changer tellement de ce vieux code.)

(Note:... S'il vous plaît ne me dites pas que GLOBALS sont mauvais, il manque totalement le point de cette question simplement accepter qu'il est nécessaire de garder un peu ancien code de travail dans un environnement plus récent, plus propre)

Était-ce utile?

La solution

Vous pouvez ajouter des variables locales définies dans dosomethingFunction () à portée globale:

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';
        //begin added code  
        $vararr = get_defined_vars();
        foreach($vararr as $varName => $varValue) 
              $GLOBALS[$varName] = $varValue;            
        //end added code          
        $this->view('old_dosomething_view');
    }
}

Notez que pour que cela fonctionne comme prévu, vous devez appeler besoin avant d'utiliser toute autre chose dans la fonction. get_defined_vars () ne retourne que les variables de la portée actuelle, donc pas de hacks array_diff sont nécessaires.

Autres conseils

Ceci est la solution la plus simple que je peux penser.

Utilisez le fichier requis (la fonction get_defined_vars) deux fois et obtenir un diff de chaque appel pour déterminer quelles variables ont été introduites.

Exemple:

$__defined_vars       = get_defined_vars();
require('old_dosomething.function.php');
$__newly_defined_vars = array_diff_assoc($__defined_vars, get_defined_vars());
$GLOBALS = array_merge($GLOBALS, $__newly_defined_vars);
$this->view('old_dosomething_view');

Hmmm, c'est une question que je ne l'ai jamais vu auparavant. Je suppose que vous pouvez le faire

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';

        // Force "old" globals into global scope
        $GLOBALS['globalVar'] = $globalVar;

        $this->view('old_dosomething_view');
    }
}

Mais c'est un processus manuel assez fastidieux, ainsi, selon le nombre de GLOBALS dont nous parlons. Je pense à ce sujet, mais je ne connais pas de solution « auto-magique » du haut de ma tête.

Pour toute personne intéressée: Mon (jusqu'à présent) version finale:

class wrapController extends baseController {
    function dosomethingFunction() {
        // ... do some initialisation stuff ...

        $__defined_vars = array_keys(get_defined_vars());

        require 'old_dosomething.function.php';

        $__newly_defined_vars = array_diff(
                                    array_keys(get_defined_vars()),
                                    $__defined_vars, 
                                    array('__defined_vars')
                                );
        foreach ($__newly_defined_vars as $var) {
            $GLOBALS[$var] = &$$var;
        }

        $this->view('old_dosomething_view');
    }
}

laid, mais cela fonctionne. Merci pour votre aide précieuse!

Avez-vous essayé Zend_Registry de Zend Framework?

Le registre est un conteneur pour stocker les objets et les valeurs dans l'espace d'application. En stockant la valeur dans le registre, le même objet est toujours disponible dans votre application. Ce mécanisme est une alternative à l'utilisation du stockage global.

http://framework.zend.com/manual/en/zend .registry.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top