jairogarcíarincón

La carpeta public


9.57K

Introducción

Para finalizar, los frameworks actuales tienden a utilizar una carpeta adicional en su patrón MVC, llamada public, que contiene tanto el archivo raíz index.php como todas las carpetas y archivos de uso público (css, scripts, imágenes, etc.).


La carpeta public

Para poder incluir la carpeta public en nuestro proyecto, además de crear el directorio public y trasladar el archivo allí, debemos realizar varios cambios:


  • Como ahora la ruta de la home entra dentro de la carpeta public, para referenciar las vistas debemos salir de ella, con lo que modificaremos el método vistas() de nuestro VistasHelper()

  • En el archivo public/index.php, debemos modificar el método autoload para que tenga en cuenta la carpeta public, al crear el directorio raíz.

  • También, como en casos anteriores, modificaremos la variable $home para adaptarla a nuestro ejemplo.



Estructura final de archivos y carpetas:



Archivo helper/VistasHelper.php:


<?php
namespace App\Helper;

class VistasHelper
{
public function vista($vista,$datos){

$archivo = "../view/$vista.php";
require($archivo);

}
}



Archivo public/index.php:


<?php
namespace App;

use App\Controller\CocheController;

//Defino la función que atocargará la clase cuando se instancie
spl_autoload_register('App\autoload');

function autoload($clase,$dir=null){

//Directorio raíz de mi proyecto (ruta absoluta)
if (is_null($dir)){
$dirname = str_replace('/public', '', dirname(__FILE__));
$dir = realpath($dirname);
}

//Escaneo en busca de clases de forma recursiva
foreach (scandir($dir) as $file){

//Si es un directorio (y no es de sistema) busco la clase dentro de él
if (is_dir($dir."/".$file) AND substr($file, 0, 1) != "."){
autoload($clase, $dir."/".$file);
}
//Si es archivo y el nombre coincide con la clase que quiero instanciar (quitando el namespace)
else if (is_file($dir."/".$file) AND $file == substr(strrchr($clase, "\\"), 1).".php"){
require($dir."/".$file);
}
}
}

//Instancio el controlador
$controller = new CocheController;

//Ruta de la home
$home = "/formacion/poo/ejemplo10/public/index.php/";

//Quito la home de la ruta de la barra de direcciones
$ruta = str_replace($home, "", $_SERVER["REQUEST_URI"]);

//Creo el array de ruta (filtrando los vacíos)
$array_ruta = array_filter(explode("/", $ruta));

//Decido la ruta en función de los elementos del array
if (isset($array_ruta[0]) && $array_ruta[0] == "ver" && is_numeric($array_ruta[1])){

//Llamo al método ver pasándole la clave que me están pidiendo
$controller->ver($array_ruta[1]);
}
else{

//Llamo al método por defecto del controlador
$controller->index();
}


IMPORTANTE: En caso de usar XAMPP en Windows la línea $dirname = str_replace('/public', '', dirname(__FILE__)); se debe sustituir por $dirname = str_replace('\public', '', dirname(__FILE__));, ya que el sistema de gestión de archivos de Windows es diferente que el de Linux.


Ejercicio propuesto 10


  • Modifica el Ejercicio 9 de forma que el archivo raíz index.php este dentro de la carpeta public.



Publicado el 21 de Noviembre de 2024