Pregunta

Situación actual:

  • tengo el versión actual de mi MVC Framework que utiliza clases como controladores.
  • Tengo algunos módulos "cosecha" de mi de edad MVC Framework que utiliza la sencilla, plana incluye como controladores.

Mucho simplificada que significa:

Nueva Versión:

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

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

versión antigua:

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

Ahora estoy tratando de escribir un contenedor para poder utilizar mis viejos controladores en mi nuevo MVC sin tener que volver a escribir todo. Para ello, tengo un controlador de "contenedor":

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

(Una vez más:.. Esto es muy, muy simplificada - sólo para llegar a la idea No código real)

El problema con este enfoque es que la variable $ globalVar previamente mundial ahora sólo existe dentro del método "dosomethingFunction" y no se puede acceder por la vista.

Esto no sería el caso si podía forzar la requieren para comportarse como "en el ámbito global" para que globalVar $ volvería a estar disponible en el ámbito global.

Así que: ¿Hay alguna manera de lograr " require_global " o algo similar

?

(Una solución para mi problema sería modificar mis viejos controladores para comenzar con un grupo de comandos "globales", pero preferiría una solución en la que no tengo que cambiar tanto de ese código antiguo.)

(Nota:... Por favor, no me diga que las variables globales son malas Es totalmente pierde el punto de esta pregunta sólo aceptar que es un requisito para mantener un cierto código edad que trabaja en un entorno nuevo, más limpio)

¿Fue útil?

Solución

Puede añadir variables locales definidas dentro dosomethingFunction (a) alcance mundial:

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');
    }
}

Tenga en cuenta, que para que esto funcione como se espera, debe llamar requiere antes de usar cualquier otra cosa en la función. get_defined_vars () devuelve sólo las variables del ámbito de aplicación de corriente, por lo que no se necesitan hacks array_diff.

Otros consejos

Esta es la solución más fácil que se me ocurre.

Utilice los get_defined_vars () de función dos veces y obtener un diff de cada llamada para determinar qué variables introducidas por el archivo requerido.

Ejemplo:

$__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, esto es un problema que nunca antes había visto. Supongo que se podría hacer esto

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');
    }
}

Pero eso es un proceso bastante tedioso, manual, así, dependiendo del número de variables globales que estamos hablando. Voy a pensar en esto, pero no sé de cualquier solución "auto-mágica" de la parte superior de la cabeza.

Para cualquier persona interesada: Mi (hasta ahora) versión final:

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');
    }
}

feo, pero funciona. Gracias por toda su gran ayuda!

¿Ha tratado Zend_Registry de Zend Framework?

El registro es un recipiente para almacenar los objetos y valores en el espacio de aplicación. Al almacenar el valor en el registro, el mismo objeto está siempre disponible a través de su aplicación. Este mecanismo es una alternativa al uso de almacenamiento global.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top