Foros del Web » Programando para Internet » PHP »

Hacer Accesible variables de un archivo incluido para todos los métodos de la clase?

Estas en el tema de Hacer Accesible variables de un archivo incluido para todos los métodos de la clase? en el foro de PHP en Foros del Web. Hola un gusto saludarlos, la verdad es que no encontré la manera de exponer de forma clara mi problema en el titulo, así que si ...
  #1 (permalink)  
Antiguo 01/11/2012, 19:43
 
Fecha de Ingreso: noviembre-2012
Ubicación: Fusagasugá, Colombia
Mensajes: 10
Antigüedad: 11 años, 6 meses
Puntos: 1
Hacer Accesible variables de un archivo incluido para todos los métodos de la clase?

Hola un gusto saludarlos, la verdad es que no encontré la manera de exponer de forma clara mi problema en el titulo, así que si después de leer el tema alguien tiene una sugerencia para el titulo del mismo no dude en hacerlo, así lo demás encontraran de forma mas fácil el tema.

lo que es pasa es sencillo, pero por mas que he intentado no lo he podido solucionar, quizás es un error de conceptos de mi parte. lo quiero hacer es poder hacer un require(); de mi archivo de Configuración en mi clase view, pero solo incluyéndolo una vez y no como estoy haciendo actualmente y es que por cada método tengo incluyo el archivo, espero haberme echo entender.

Creo que la mejor forma de explicarme es colocar el código:

Directorios:

test
----->config
------------>config.php

----->library
--------->config.php
--------->view.php


Archivo config.php

Código:
<?php

	$config = null;
	$config = new config();

	$RouteAbsolute = null;
	$RouteAbsolute = 'http://' . $_SERVER['HTTP_HOST'] . '/test/public/';

	$config->set('layoutPath', 'layouts/');
	$config->set('viewsPath', 'public/html/');
	$config->set('staticRoute', $RouteAbsolute);

	$config->set('controllersFolder', 'controllers/');
	$config->set('modelsFolder', 'models/');
	$config->set('viewsFolder', 'views/');

	$config->set('dbhost', 'myserver');
	$config->set('dbname', 'mydb');
	$config->set('dbuser', 'myuser');
	$config->set('dbpass', 'mypass');
?>

Clase Config.php (esta en library):

Código:
<?php

class Config
{
    private $vars;
 
    function __construct()
    {
        $this->vars = array();
    }
    
    //Con set vamos guardando nuestras variables.
    public function set($name, $value)
    {
        if(!isset($this->vars[$name]))
        {
            $this->vars[$name] = $value;
        }
    }
    
    //Con get('nombre_de_la_variable') recuperamos un valor.
    public function get($name)
    {
        if(isset($this->vars[$name]))
        {
            return $this->vars[$name];
        }
    }

}

?>

Clase view.php (esta en library):

Código:
<?php

class View
{
	public function show($name, $vars = array()) 
	{
		//$name es el nombre de nuestra plantilla, por ej, listado.php
		//$vars es el contenedor de nuestras variables, es un arreglo del tipo llave => valor, opcional.

                // Para que me funcione tengo que poner el require en cada método como en este caso.
		require 'config/config.php';

		//Armamos la ruta a la plantilla
		$path = $config->get('viewsFolder') . $name;

		//Si no existe el fichero en cuestion, tiramos un 404
		if (file_exists($path) == false) 
		{
			echo ("la vista " . $path . " no existe.");
			return false;
		}
		
		//Si hay variables para asignar, las pasamos una a una.
		if(is_array($vars))
		{
            foreach ($vars as $key => $value) {
            	$$key = $value;
            }
        }
                
		//Finalmente, incluimos la plantilla.
		include($path);
	}

	// Obtiene la templete o layout
	public function getLayout($layout) 
	{
		require 'config/config.php';
	    $file = $config->get('layoutPath') . $layout . '.html';
	    $selectLayout = file_get_contents($file);
	    return $selectLayout;
	}

	// Obtiene la vista
	public function getView($view) 
	{
		require 'config/config.php';
	    $file = $config->get('viewsPath') . $view . '.html';
	    $selectView = file_get_contents($file);
	    return $selectView;
	}


	// renderiza y retorna los datos dinamicos
	public function renderDinamicData($html, $data) 
	{
	    foreach ($data as $clave=>$valor) {
	        $html = str_replace('{'.$clave.'}', $valor, $html);
	    }
	    return $html;
	}

	public function staticsRoute()
	{
		require 'config/config.php';
		$route = $config->get('staticRoute');
		return $route;
	}

}

?>
  #2 (permalink)  
Antiguo 01/11/2012, 20:13
 
Fecha de Ingreso: noviembre-2010
Mensajes: 62
Antigüedad: 13 años, 5 meses
Puntos: 11
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

el require() colocalo antes de la clase, es decir fuera de la misma.
  #3 (permalink)  
Antiguo 01/11/2012, 20:49
 
Fecha de Ingreso: noviembre-2012
Ubicación: Fusagasugá, Colombia
Mensajes: 10
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Hola grassofabian gracias por responder, pero ese es exactamente el problema que si lo pongo antes de la clase no me reconoce la variable $config y por ende no puede acceder al método get();, el cual necesito para poder traer la ruta en donde se encuentran las views, lo he puesto en todos lados y nada, la única forma en la que me ha funcionado es como lo tengo ahora, pero no creo que sea la mejor forma de hacerlo.
  #4 (permalink)  
Antiguo 02/11/2012, 04:40
 
Fecha de Ingreso: noviembre-2010
Mensajes: 62
Antigüedad: 13 años, 5 meses
Puntos: 11
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Hace lo siguiente:
En view.php, dentro de la clase View agrega el constructor de la misma:

function __construct(){
include_once("config/config.php");
}


Lo que estamos haciendo es que al momento de instanciar la clase View, mediante la incoporación del archivo config.php en el constructor estas creando el objeto $config. Por lo tanto $config va a estar disponible para cualquier metodo dentro de la clase View.

Igualmente tendrías que poner en el archivo "config/config.php":

include_once("library/config.php");

Porque no se como en el archivo "config/config.php" vas a instanciar una clase que no existe si no la incluis previamente.

Última edición por grassofabian; 02/11/2012 a las 06:14
  #5 (permalink)  
Antiguo 02/11/2012, 08:49
 
Fecha de Ingreso: noviembre-2012
Ubicación: Fusagasugá, Colombia
Mensajes: 10
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Hola grassofabian, gracias por seguir respondiéndome, la verdad es que lo que usted dice es correcto así "debería" funcionar, pero la realidad es que no lo hace, lo que usted comenta fue lo primero que hice, es lo "normal" que uno hace o incluirlo por fuera de clase en la parte superior, pero en vista que no me ha funcionado he terminado intento cualquier cosa, vuelvo y repito quizás sea un error de concepto de mi parte.

te muestro el error que siempre me a dado, haber si así es mas fácil de comprender mi error.

Warning: include_once(library/config.php): failed to open stream: No such file or directory in /var/www/test/config/config.php on line 3

Warning: include_once(): Failed opening 'library/config.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/test/config/config.php on line 3

Notice: Undefined variable: config in /var/www/test/library/View.php on line 16

Fatal error: Call to a member function get() on a non-object in /var/www/test/library/View.php on line 16

Me dice que no encuentra el directorio pero yo hago esos mismas inclusiones en mi controlador frontal y allí funcionan perfectamente, el error es porque como no me reconoce el archivo incluido, en los métodos, pues la variable $config no existe, no esta definida y no la puedo usar y mucho menos llamar al método get();


Espero me haya echo entender un poco mejor. Saludos.

Última edición por FilanderGarcia; 02/11/2012 a las 09:19
  #6 (permalink)  
Antiguo 02/11/2012, 11:17
 
Fecha de Ingreso: noviembre-2010
Mensajes: 62
Antigüedad: 13 años, 5 meses
Puntos: 11
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Vamos a agregar en los includes $_SERVER['DOCUMENT_ROOT'], esto nos va a dar la ruta actual donde se encuentra el documento principal que ejecuta el script.

Hace lo siguiente:
En view.php, dentro de la clase View agrega el constructor de la misma:

Código PHP:
function __construct(){
include (
$_SERVER['DOCUMENT_ROOT']."/config/config.php");

En el archivo "config/config.php":

Código PHP:
include ($_SERVER['DOCUMENT_ROOT']."/library/config.php"); 
  #7 (permalink)  
Antiguo 02/11/2012, 16:58
 
Fecha de Ingreso: noviembre-2012
Ubicación: Fusagasugá, Colombia
Mensajes: 10
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Hola un gusto saludarlo de nuevo y gracias por la ayuda prestada, pero lamentablemente aun no funciona y lo que mas me desorienta es que dice que es la ruta o que no abre el archivo, pero si pongo el mismo requiere que me da error por fuera de clase o en el constructor dentro de los métodos ahí si funciona perfecto.

Otra cosa mas si quito el require('library/config.php') del archivo config/config.php y creo la instancia de clase config que esta en library/config.php sin la inclusión del archivo funciona, no se porque pero funciona, pero si la borro no, de verdad que no entiendo porque pasa eso, porque para poder hacer esa instancia debería incluir el archivo con la clase config.

Última edición por FilanderGarcia; 02/11/2012 a las 17:21
  #8 (permalink)  
Antiguo 02/11/2012, 17:47
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Que tal FilanderGarcia,

Tal cual lo tienes no hay forma elegante de resolverlo, lo mas sencillo seria que View tuviera por propiedad la configuración.

config/config.php
Código PHP:
Ver original
  1. include_once('../library/config.php');
  2. $config = new Config();
  3. ...
  4. return $config;

library/view.php
Código PHP:
Ver original
  1. class View
  2. {
  3.     private $config;
  4.     public function __construct()
  5.     {
  6.         $this->config = include '../config/config.php';
  7.     }
  8.  
  9.     public function foo()
  10.     {
  11.         $config = $this->config;
  12.         ...
  13.     }
  14. }

Y si tienes algún Registry o mejor aún DiC simplemente pasas la config vía constructor.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 02/11/2012 a las 18:33
  #9 (permalink)  
Antiguo 02/11/2012, 18:57
 
Fecha de Ingreso: noviembre-2012
Ubicación: Fusagasugá, Colombia
Mensajes: 10
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Hola masterpuppet un gusto saludarle, gracias por responder, no se si lo he echo mal, pero aun persiste el mismo error.

El error y los warning que se producen:

Código:
Warning: include_once(../library/config.php): failed to open stream: No such file or directory in /var/www/test/config/config.php on line 3

Warning: include_once(): Failed opening '../library/config.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/test/config/config.php on line 3

Warning: include(../config/config.php): failed to open stream: No such file or directory in /var/www/test/library/View.php on line 8

Warning: include(): Failed opening '../config/config.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/test/library/View.php on line 8

Fatal error: Call to a member function get() on a non-object in /var/www/test/library/View.php on line 15
Lo que hice fue esto:


Archivo config.php -> config/config.php:

Código PHP:
Ver original
  1. <?php
  2.  
  3.         // También use la ruta absoluta y tampoco funciono.
  4.     include_once('../library/config.php');
  5.  
  6.  
  7.     $config = null;
  8.     $config = new config();
  9.  
  10.     $RouteAbsolute = null;
  11.     $RouteAbsolute = 'http://' . $_SERVER['HTTP_HOST'] . '/test/public/';
  12.  
  13.     $config->set('layoutPath', 'layouts/');
  14.     $config->set('viewsPath', 'public/html/');
  15.     $config->set('staticRoute', $RouteAbsolute);
  16.  
  17.     $config->set('controllersFolder', 'controllers/');
  18.     $config->set('modelsFolder', 'models/');
  19.     $config->set('viewsFolder', 'views/');
  20.  
  21.     $config->set('dbhost', 'myserver');
  22.     $config->set('dbname', 'mydb');
  23.     $config->set('dbuser', 'myuser');
  24.     $config->set('dbpass', 'mypass');
  25.  
  26.     return $config;
  27. ?>

Clase view.php -> library/view.php:

Nota: solo coloco un método para que quede mas corto el código de la clase view.

Código PHP:
Ver original
  1. <?php
  2.  
  3. class View
  4. {
  5.      private $config;
  6.      public function __construct()
  7.     {
  8.          $this->config = include '../config/config.php';
  9.     }
  10.  
  11.     // Mostrar la Vista
  12.     public function show($name, $vars = array())
  13.     {
  14.         $config = $this->config;
  15.         $path = $config->get('viewsFolder') . $name;
  16.  
  17.         if (file_exists($path) == false)
  18.         {
  19.             echo ("la vista " . $path . " no existe.");
  20.             return false;
  21.         }
  22.        
  23.         if(is_array($vars))
  24.         {
  25.             foreach ($vars as $key => $value) {
  26.                 $$key = $value;
  27.             }
  28.         }
  29.                
  30.         include($path);
  31.     }
  32.  
  33. }
  34.  
  35. ?>

La verdad es que antes estaba usando singleton para el trabajo de lectura del archivo de configuración y la instancia de la clase a la base de datos, pero leí en el foro que esto no era recomendado, así que lo que hice fue borrarle el singleton y tratar de hacerlo normal, en el mismo tema leí acerca de Registry pero la verdad nunca lo he usado, esta es la primera vez que trato de hacer un proyecto relativamente grande, usan POO y MVC.

Saludos.

Última edición por FilanderGarcia; 02/11/2012 a las 19:04
  #10 (permalink)  
Antiguo 02/11/2012, 19:09
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Primero vamos a hacerlo funcionar como lo tienes, luego si te interesa comentamos alguna estrategia para el manejo de dependencias y el uso de estándares ;).

El error que tienes ahora es un tema de paths, la estructura del proyecto, la del primer post, es correcta ?, en cualquier caso utiliza file_exists a modo de prueba hasta que des con el path correcto, si el path es correcto comprueba los permisos de los ficheros.
__________________
http://es.phptherightway.com/
thats us riders :)
  #11 (permalink)  
Antiguo 02/11/2012, 21:23
 
Fecha de Ingreso: noviembre-2012
Ubicación: Fusagasugá, Colombia
Mensajes: 10
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

de verdad muchas gracias por tomarte el tiempo de ayudarme, soy nuevo el foros del web apenas y me registre ayer, así que disculpa si es un poco molesto que te coloque enlaces hacia algún lado pero creo que aquí no se pueden adjuntas archivos a los comentarios, el enlace lo lleva a una carpeta que tengo Dropbox donde adjunto las imágenes de la estructura de directorios en este caso solo desplegué la de los archivos que dan problema y ademas otra imagen con los permisos de los archivos.

https://www.dropbox.com/sh/i1lt42ognxaxiug/1L98EgUcCH

Ya he visto el error, voy a seguir probando haber que tal funciona, el error era que como había borrado el archivo y cuando lo cree de nuevo se le había borrado los permisos de ese solo archivo ademas cometí un error al colocar el nombre y deje este con la primera letra Mayúscula es Config.php y no config.php

Última edición por FilanderGarcia; 02/11/2012 a las 21:41
  #12 (permalink)  
Antiguo 02/11/2012, 21:48
 
Fecha de Ingreso: noviembre-2012
Ubicación: Fusagasugá, Colombia
Mensajes: 10
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Perfecto ahora todo funciona genial, muchas gracias por la ayuda, si no es mucha molestia te agradecería mucho si me pudieras orientar un poco en lo que comentabas antes acerca de manejo de dependencias y el uso de estándares, así podre mejorar de alguna manera mi forma de desarrollar

Saludos.
  #13 (permalink)  
Antiguo 03/11/2012, 05:43
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

A la fecha hay 3 estándares definidos por el FIG, PSR-0, PSR-1 y PSR-2, mínimo deberías apegarte al primero para no tener que preocuparte por los include al utilizar una clase, te dejo una referencia https://github.com/php-fig/fig-stand...epted/PSR-0.md.

Con respecto al manejo de dependencias, te sugiero un DiC muy sencillo, Pimple, un ejemplo de como podría quedar en tu caso:
Código PHP:
Ver original
  1. //definicion
  2. $container = new Pimple();
  3. $container['modelsFolder'] = 'models/';
  4. $container['config'] = $container->share(function ($c) {
  5.     $config = new Config();
  6.     $config->set('controllersFolder', 'controllers/');//parametro hardcodeado
  7.     $config->set('modelsFolder', $c['modelsFolder']);//parametro desde el container
  8.     $config->set('viewsFolder', 'views/');
  9.     return $config;
  10. });
  11. $container['view'] = function($c){
  12.     return new View($c['config']);
  13. }
  14.  
  15. //uso
  16. $config = $container['config'];//retorna Config object, al ser shared retorna siempre la misma instancia
  17. $view   = $container['view'];//retorna un nuevo View object(en cada llamada) con la configuración inyectada vía constructor

Ten en cuenta que tiene un catch, Pimple es para PHP 5.3+, de todas formas puedes crear un Container de forma muy sencilla.

Cualquier cosa nos comentas.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #14 (permalink)  
Antiguo 03/11/2012, 08:47
 
Fecha de Ingreso: noviembre-2012
Ubicación: Fusagasugá, Colombia
Mensajes: 10
Antigüedad: 11 años, 6 meses
Puntos: 1
Respuesta: Hacer Accesible variables de un archivo incluido para todos los métodos de

Muchas gracias, voy a a leer lo que publico y comento como me fue, saludos.

Etiquetas: accesible, html, 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 08:22.