Anuncios

Bienvenidos sean a este post, hoy veremos como cargar un archivo de vista.

Anuncios

Si bien desde que comenzamos este proyecto no hemos creado ninguna vista por lo tanto debemos hacer un par de cosas antes de comenzar con la cargas de vistas, lo primero que haremos sera crear un error 404 personalizado y para ello dentro del directorio app crearemos dos nuevos directorios:

  • Controllers
  • Views
Anuncios

Dentro del directorio Views crearemos un nuevo archivo llamado 404.php donde simplemente le agregaremos un texto identificando que no se encontro el archivo, les dejo un ejemplo:

404.php

El archivo no fue encontrado
Anuncios

Nuestro siguiente paso sera la creacion de una nueva clase llamada View, en este caso iremos al directorio system y dentro de este crearemos un nuevo archivo que llamaremos View.php dentro agregaremos el siguiente codigo:

View.php

<?php

namespace System;

class View
{

}
Anuncios

En este caso establecemos el namespace de esta clase y simplemente a la clase, lo siguiente sera agregar el siguiente metodo dentro de la clase:

	public function render($path, $datos=false)
	{
		if ($datos)
		{
			foreach($datos as $clave => $valor)
				${$clave} = $valor;
		}

		$patharchivo = "../app/Views/$path.php";

		if (file_exists($patharchivo))
		{
			require $patharchivo;
		} else {
			die("View: $path no encontrado");
		}
	}
Anuncios
Anuncios

En este bloque podemos ver al metodo que se encargara de «renderizar» o dibujar nuestra vista o view, en este metodo podemos pasar dos valores donde uno de ellos sera opcional, datos, dado que tiene un valor predeterminado que nos permite omitirlo, el otro sera obligatorio, luego tendremos un condicional donde chequea si datos posee algun valor, o mejor dicho es distinto de false, y este sera el contenido que le pasaremos a nuestra vista, por ello tenemos un for mejorado donde pasaremos por todos los valores almacenados en datos lo asignaremos a una nueva variable llamada clave y al mismo tiempo asignaremos ese valor a otra variable llamada valor, luego crearemos una nueva variable en base al valor almacenado en clave y le asignaremos el contenido de valor, por ahora lo dejaremos asi, luego definimos una variable que contendra el path del archivo de vista que pasamos en la variable path, la obligatoria, despues tenemos un condicional donde verifica si el archivo que informamos en patharchivo existe, en caso de ser verdadero llama a ese archivo por medio de require y lo cargara, en caso contrario terminara con un die informando que el archivo en path no fue encontrado, con esto tenemos nuestro archivo terminado veamos su codigo hasta ahora:

View.php

<?php

namespace System;

class View
{
	public function render($path, $datos=false)
	{
		if ($datos)
		{
			foreach($datos as $clave => $valor)
				${$clave} = $valor;
		}

		$patharchivo = "../app/Views/$path.php";

		if (file_exists($patharchivo))
		{
			require $patharchivo;
		} else {
			die("View: $path no encontrado");
		}
	}
}
Anuncios

Nuestro ultimo paso sera crear un nuevo archivo dentro del directorio system al cual llamaremos Route.php, primero agregaremos este bloque:

Route.php

<?php

namespace System;

use System\View;
Anuncios

Al igual que en los casos anteriores primero estableceremos el namespace, luego importtaremos a la clase que creamos anteriormente, lo siguiente sera agregar la clase de este archivo:

class Route
{

}
Anuncios

Dentro de la clase agregaremos primero este metodo:

        public function __construct($config)
        {
                $url = explode('/', trim($_SERVER['REQUEST_URI'],'/'));
                $cont = !empty($url[0]) ? $url[0]:$config['default_cont'];
                $metodo = !empty($url[1]) ? $url[1]:$config['default_met'];
                $args = !empty($url[2]) ? array_slice($url, 2): array();
                $clase = $config['namespace'].$cont;

                if (!class_exists($clase))
                {
                        return $this->not_found();
                }

                if (!method_exists($clase, $metodo))
                {
                        return $this->not_found();
                }

                $instanciaClase = new $clase;

                call_user_func_array(array($instanciaClase, $metodo), $args);
        }
Anuncios

Aqui definimos un constructor para nuestra clase, donde recibiremos a nuestra clase de configuracion, la cual vimos al comienzo del post, dentro del bloque generaremos cinco variables:

Anuncios
  • url, sera un array generado por medio de explode en base al URL que utilicemos
  • cont, este sera nuestro controlador y por medio de un condicional veremos si la primera posicion de url es distinta de nada, en caso de ser verdadero procede a asignarla de lo contrario utiliza el controlador predeterminado en nuestra clase de configuracion
  • metodo, similar al anterior pero es para obtener el metodo, en caso de no tener alguno se usa el metodo predeterminado de la clase de configuracion
  • args, al igual que los casos anteriores verificamos que la tercer posicion no esta vacia, en caso de ser verdadero obtiene todos los valores a partir del indice 2, en caso contrario genera un array vacio
  • clase, establece la clase en base al namespace en Config y el controlador que tenemos en la variable cont
Anuncios
Anuncios

Despues de esto tenemos un condicional que verifica si la clase almacenada en clase no existe devuelve el resultado de la funcion not_found, de esto hablaremos en un momento, el siguiente condicional verifica si el metodo de la variable con el mismo nombre no existe procede a devolver el resultado del metodo not_found, despues crearemos un nuevo objeto que se llama instanciaClase de la clase almacenada en la variable antes creada, por ultimo usamos a la funcion call_user_func_array, por ultimo este llamara a la instancia de la clase, es decir el objeto antes creado, al metodo del mismo y nos permite pasar el array de argumentos almacenado en args, nuestro siguiente paso sera agregar el metodo not_found:

        public function not_found()
        {
                $view = new View();
                return $view->render('404');
        }
Anuncios

Este metodo lo usaremos para cuando no se encuentra la pagina solicitada, simplemente crearemos un objeto de la clase View y despues le diremos que utilice al metodo render y le pasamos la primera pagina que creamos, veamos como quedo el codigo de nuestro archivo:

Route.php

<?php

namespace System;

use System\View;

class Route
{
	public function __construct($config)
	{
		$url = explode('/', trim($_SERVER['REQUEST_URI'],'/'));
		$cont = !empty($url[0]) ? $url[0]:$config['default_cont'];
		$metodo = !empty($url[1]) ? $url[1]:$config['default_met'];
		$args = !empty($url[2]) ? array_slice($url, 2): array();
		$clase = $config['namespace'].$cont;

		if (!class_exists($clase))
		{
			return $this->not_found();
		}

		if (!method_exists($clase, $metodo))
		{
			return $this->not_found();
		}

		$instanciaClase = new $clase;

		call_user_func_array(array($instanciaClase, $metodo), $args);
	}

	public function not_found()
	{
		$view = new View();
		return $view->render('404');
	}
}
Anuncios

Con esto podemos probar nuestro proyecto, recuerden iniciarlo desde la carpeta raiz del proyecto y ejecutando el siguiente comando desde una terminal:

$ php -S localhost:8000 -t webroot
Anuncios

Y si abrimos la pagina desde un navegador veremos lo siguiente:

Anuncios

Como pueden ver al no existir nada todavia nos redirecciona a la pagina 404.php por medio del metodo not_found pero proximamente cambiaremos esta conducta pero si lograron esto, Felicitaciones!!! Ya lograron utilizar los namespace correctamente y ya tenemos una parte de la base del proyecto.

Anuncios

En resumen, hoy hemos visto como cargar las vistas, en este caso hicimos no solamente esto sino tambien vimos al ruteo, hemos hecho los pasos basicos que serviran de base para nuestro proyecto, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50