Foros del Web » Programando para Internet » PHP »

Acceder a variables en modelo MVC

Estas en el tema de Acceder a variables en modelo MVC en el foro de PHP en Foros del Web. Tengo un projecto en PHP que estoy convirtiendo al modelo MVC para practicar e incorporar conceptos. Separé el html del codigo php, y también hice ...
  #1 (permalink)  
Antiguo 11/08/2010, 13:03
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Acceder a variables en modelo MVC

Tengo un projecto en PHP que estoy convirtiendo al modelo MVC para practicar e incorporar conceptos.

Separé el html del codigo php, y también hice una clase para las llamadas a mysql. Lo que intento ahora es convertir el codigo php (el controlador) en un objeto. Pero ni bien lo encapsulo me encuentro con algunos problemas.

Hasta ahora mi controlador.php era una serie de funciones, y también yo hacía una consulta a mysql para crear variables php, así:

${$Languagevar[0]} = $Languagevar[1];

Luego las accedía desde mi archivo html, directamente así:

echo $AoIUser;

La cuestión es simple: ahora que convertí mi juego de funciones en un objeto, no puedo acceder a las variables y obtengo este error:

Cita:
Notice: Undefined variable: AoIauthor in C:\wamp\www\AoITutorials\View.php on line 5
Cómo puedo hacer para acceder a las variables? Estoy creandolas en el constructor de mi nuevo objeto.
  #2 (permalink)  
Antiguo 11/08/2010, 13:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Acceder a variables en modelo MVC

Lo que pones es muy genérico, sin ver como es el proceso en el que rendereas tu html no te podríamos decir la causa del problema.

Saludos.
  #3 (permalink)  
Antiguo 11/08/2010, 13:13
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Acceder a variables en modelo MVC

Ok. Publico algo más.

index.php
Código PHP:
<?php session_start(); 

header("cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past

include_once "Library/conection.php";

include 
"Controller.php";
FrontController::main();

?>
Controller.php
Código PHP:
class FrontController{    
    
    static function 
main(){         
        
        include 
"View.php";        
    }

    public function 
__construct(){
        
        
$this->defineConstants();
        
$KindOfTutorial $this->scope();
            
        
// vars that cointains frame translations an names of tutorials, etc.
        
include (LIBRARY."indexHeaderwithVars.php");
        
/* FIX ENCODING */
        
include LIBRARY."fixEncoding.php";
        include (
LIBRARY."availableLanguages.php");
        
        include 
"Model.php"
        
$dbObject = new dbConsults();
        
$this->checkCookies();        
        
        
$file_name $this->getFilename();            
    }

.... 
// aquí viene una lista de métodos. Algunos son usados en el constructor y otros son llamados desde la vista. 
View.php
Código PHP:
<?php

$info 
= new FrontController(); 
//include "contents.tpl.php"; 
 
echo $info->$AoIauthor;

// aquí estaría llamando a la plantilla, en donde hay muchas variables que sirven para traducir la pagina. Esas variables son generadas con un script, dinamicamente según información de mysql. Pero la cuestión es que desde que encapsulé mis funciones y las convertí en un controlador POO, no las puedo acceder más.
?>
generador de variables
Código PHP:
    // name of tutorials vars        
    
$phpLanguageVars mysql_query("SELECT phpvar,value FROM ".$KindOfTutorial."_phpvars WHERE language = '$foreignLanguage'") or die("Error in phpvars consult: ".mysql_error()); 
        while(
$Languagevar mysql_fetch_array($phpLanguageVars)){
            ${
$Languagevar[0]} = $Languagevar[1]; 
            }        
//  advierto que aún no he limpiado la parte de creación de variables, así que eso no cumple ni con la POO ni con el MVC. 
Esto sería la lógica. Es mi primer modelo MVC, y funciona bien en tanto no encapsule el controlador.

Publico un fragmento de la plantilla para que vean como la estoy encarando:
Código PHP:
<span><?php echo fixEncoding($AoIauthor); ?></span>
        </div>

        <div id="login" class="rightControls"><?php echo $info->printLogin(); ?></div>

        <div id="style" class="rightControls"><?php echo $info->styleSelector(); ?></div>

        <div id="languages" class="rightControls"><?php echo $info->printFlags(); ?></div>
  #4 (permalink)  
Antiguo 11/08/2010, 13:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Acceder a variables en modelo MVC

Creo estas encarando de forma incorrecta lo que haces, el FrontController como tal es el que maneja la union entre el FrontController y lo que es el ciclo del MVC, solo hay una instancia del FrontController porque es la que se encarga de:

1.- Leer el request del usuario y preparar los datos que vienen desde el input
2.- Decidir y delegar a que controller va a mandar a llamar.
3.- Esperar a que el controller termine su proceso
4.- Preparar la vista que se va a usar (generalmente esto se lo informa el controller).
5.- Renderear la vista que fue seleccionada
6.- Finalizar el proceso.

Eso es a groso modo lo que debe de hacer el frontController como tal, y ya dentro de cada controller independiente haces el proceso, creas tu modelo y realizas tus consultas o lo que vayas a utilizar y delegas variables a la vista, la cual se encarga ya de maquetar tus variables en un diseño HTML.

Saludos.
  #5 (permalink)  
Antiguo 11/08/2010, 13:46
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Acceder a variables en modelo MVC

Si, asumo que la arquitectura del proyecto aún no es correcta. Pero voy a reformular la pregunta.

Necesito que mi objeto genere una serie de variables que puedan accederse desde dentro y desde fuera. Y creo que el constructor es el lugar adecuado para hacerlo. Pero como?

Por ejemplo, hasta ahora yo venía usando esto:
Cita:
$KindOfTutorial = scope(); // la función scope() no estaba encapsulada. Tampoco las demás.
...

function getFilename(){

global $KindOfTutorial;
...
}
Pero ahora que estoy encapsulando, cómo debería generar la variable $KindOfTutorial?

Acabo de intentar anteponiendo $this pero no funciona (tendría que declararla antes pero son demasiadas las variables, y como ya mostré, algunas son generadas dinámicamente):
Cita:
public function __construct(){

$this->defineConstants();
$this->$KindOfTutorial = $this->scope();
...

}
Además, como las accedo desde la vista?

Última edición por mayid; 11/08/2010 a las 14:00
  #6 (permalink)  
Antiguo 11/08/2010, 14:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Acceder a variables en modelo MVC

Como te comento, si no "arreglas" tu diseño desde ahora es más complicado despúes repararlo, pero para hacer lo que pides, PHP dispone de dos métodos mágicos __get y __set que te permiten asignar y obtener variables directamente usando $objeto->variable e internamente las puedes guardar en un array para poderlas leer desde otro lado.

Saludos.
  #7 (permalink)  
Antiguo 11/08/2010, 14:38
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Acceder a variables en modelo MVC

Ok. Gracias mil por los metodos magicos.

Respecto a la rearquitectura, yo debería entonces tener:

- un FrontController
- un Controller.

El frontController no haría llamadas al modelo sino al controlador óptimo.

Eso es lo que tengo que arreglar? Yo estaba preocupado por la manera en que inicializo los objetos (según lo que publiqué primero). Todavía la lógica de tantos archivos me complica.
  #8 (permalink)  
Antiguo 11/08/2010, 17:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Acceder a variables en modelo MVC

Así es, el FrontController hace toda la tarea de inicializar la aplicación, leer el request y decidir a que controlador delegar la accion actual y luego enviar la salida al usuario.
  #9 (permalink)  
Antiguo 14/08/2010, 07:50
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Acceder a variables en modelo MVC

Leyendo un poco este tutorial, vi que el constructor puede retornar algo. No se me había ocurrido! Entonces a todas las variables que inicialize en mi constructor (que son muchas) las podría acceder externamente como un array.

Pero todavía no tengo en claro como acceder a esas mismas variables (inicializadas en el constructor) desde cualquiera de las funciones que tengo declaradas en el objeto mismo. De verdad los metodos magicos pueden ayudarme en esto?
  #10 (permalink)  
Antiguo 14/08/2010, 11:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Acceder a variables en modelo MVC

No es lo mejor que el constructor te regrese una variable, ya que pierdes el objeto. Sí si usas los métodos mágicos puedes tener dentro de un objeto un array de propiedades y mandarlos llamar con __get.

Saludos.
  #11 (permalink)  
Antiguo 14/08/2010, 12:17
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Acceder a variables en modelo MVC

Ok.

Al fin encontré un buen tutorial. muy breve, sobre el uso de __get:
http://www.tuxradar.com/practicalphp/6/14/2

Aún no se implementarlo pero creo que sería así:
Cita:
public function __get($var) {
return $this->$var;
}
En cuanto a acceder a las variables desde dentro de mi objeto (en tanto no pueda usar __get), aún no se que hacer. Quizás sea POO basico, pero es que no me funciona ni globalizar las variables. Como las accedo desde una función?

Antes yo no encapsulaba mis funciones en un objeto, así que usaba global $var; . Pero esto ahora ya no funciona ( y además leí que no está recomendado ).

Aclaro que muchas funciones son declaradas dinamicamente y no las puedo "predeclarar" al escribir la clase. Igual, fuera de esos casos, doy un ejemplo: en el constructor yo estoy creando una variable con el objeto que hace las consultas a mysql:

Código PHP:
function __construct(){
include 
"Model.php"
$dbObject = new dbConsults();
$this->checkCookies(); 
La funcion checkCookies() dice:
Código PHP:
function checkCookies(){ //private
        
global $dbObject;
$response $dbObject->checkUserAgainstCookie($cookie); 
Y obtengo:
Cita:
Fatal error: Call to a member function getPHPvars() on a non-object in C:\wamp\www\AoITutorials\Controller.php on line 198

Última edición por mayid; 14/08/2010 a las 12:23
  #12 (permalink)  
Antiguo 14/08/2010, 15:28
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Acceder a variables en modelo MVC

Creo que todo va a ir bien. Estoy entendiendo mejor la POO y el modelo MVC de a poco.

Muuuchas gracias por tu orientación GatorV!

Lo que me está pasando ahora es esto:
- en el index genero un objeto controller.
-desde el objeto controller genero un objeto view (y le paso como parametro el nombre de una plantilla)
-desde el objeto view incluyo una plantilla (esta bien esto?)

Ahora, al hacer el include de la plantilla puedo acceder a todas las variables definidas en $View (y a todas las que le pasé como parametros en un array). Pero cómo puedo acceder a los métodos del controller? $this solo funciona para el objeto $View.

Última edición por mayid; 14/08/2010 a las 15:53
  #13 (permalink)  
Antiguo 14/08/2010, 17:08
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Acceder a variables en modelo MVC

Creo que ya todo va bien. Estoy pasando el objeto controlador como una variable ($this). De esta manera, el objeto View y la plantilla pueden accederlo.

Cita:
$View = new View($whichView, $this->phpvars, $this);

Etiquetas: acceder, modelo, mvc, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:42.