CodeIgniter 4 Rutas:Uso de marcadores.

CodeIgniter 4 nos proporciona la posibilidad de definir las rutas de nuestra aplicación a nuestra conveniencia haciendo uso de marcadores a la hora de especificar una ruta. Esto permite enviar y recibir parámetros a través de la URL de manera controlada y segura.

Tipos de Rutas en CodeIgniter 4

CodeIgniter 4 cuenta con dos tipos principales de enrutamiento:

  • Enrutamiento de Ruta Definida: Permite definir rutas específicas que están enlazadas a métodos de controladores.
  • Enrutamiento Automático: Permite que el sistema determine la ruta basada en los segmentos de la URL automáticamente.

En este tutorial, nos enfocaremos en el Enrutamiento de Ruta Definida y el uso de marcadores.

Definir Rutas con Marcadores

Para definir una ruta en CodeIgniter 4, usamos el archivo Routes.php ubicado en el directorio app/Config. Aquí podemos crear una instancia de la clase RouteCollection ($routes) y definir nuestras rutas con marcadores.

Ejemplo de Ruta con Marcador Numérico

$routes->get('miruta/(:num)','Micontrolador::miMetodo/$1');

En este ejemplo:

Micontrolador::miMetodo/$1 define el controlador y método que manejará la solicitud, pasando el parámetro capturado.

miruta es la vista a la que queremos acceder.

(:num) es un marcador que indica que el parámetro es un número entero.

Ejemplo Práctico

Paso 1: Crear el Controlador

En el directorio app/Controllers, creamos un archivo Micontrolador.php:

<?php 
//usamos el espacio de nombre Controllers
namespace App\Controllers;
class Micontrolador extends BaseController
{
    //creamos un metodo que recibira un parametro en este caso $parametro.
    public function miMetodo($parametro)
    {
        //creamos un array $data con el parametro recibido.
        $data['parametro']=$aparametro;
        //retornamos nuestra vista junto al array $data que creamos.
        return view('miVista',$data);
    }
}

Paso 2: Crear la Vista

En el directorio app/Views, creamos un archivo miVista.php:

<!DOCTYPE html>
<html>
<head>
<title>CodeIgniter</title>
</head>
<body>
<h3>El parametro >
<?php
//imprimimos el parametro que recibimos desde nuestro controlador
 echo $parametro; 
 ?>
 </h3>
</body>
</html>

Paso 3: Definir la Ruta

En app/Config/Routes.php, añadimos:

$routes->get('miruta/(:num)','Micontrolador::miMetodo/$1');

Paso 4: Probar la Ruta

En el navegador, ingresamos la siguiente URL:

http://localhost/ci/public/miruta/2


Esto debería mostrar el valor del parámetro en la vista.

Uso de Múltiples Marcadores

Ejemplo con Dos Parámetros Numéricos

$routes->get('miruta/(:num)/(:num)','Micontrolador::miMetodo/$1/$2');

Controlador:

public function miMetodo($p1,$p2)
    {
        //creamos un array $data con los dos parametros.
        $data['p1']=$p1;
        $data['p2']=$p2;
        //retornamos nuestra vista junto al array $data que creamos.
        return view('miVista',$data);
    }

URL

http://localhost/ci/public/miruta/2/2

Tipos de Parámetros

Parámetros Alfabéticos

Pasar parámetro como cadena de caracteres alfabéticos seria de la siguiente forma

$routes->get('miruta/(:alpha)','Micontrolador::miMetodo/$1');

URL:

http://localhost/ci/public/miruta/joe

Parámetros Alfanuméricos

Pasar parámetro como cadena de caracteres alfanuméricos seria de la siguiente forma

$routes->get('miruta/(:alphanum)','Micontrolador::miMetodo/$1');

URL

http://localhost/ci/public/miruta/parametro1

Combinando tipos de parámetros  

podemos definir mas de un tipo de parámetro al crear una ruta, por ejemplo

$routes->get('miruta/(:alpha)/(:num)','Micontrolador::miMetodo/$1/$2');

URL

http://localhost/ci/public/miruta/joe/123

Uso de Expresiones Regulares

Existe la posibilidad de que al definir las rutas deseamos especificar de manera mas exacta el tipo de parámetro, por ejemplo

$routes->get('miruta/(^[0-9_]+$)','Micontrolador::miMetodo/$1');

Especificamos en la ruta que se aceptara un parámetro que solo contenga enteros y guion bajo, de esta forma se puede ser mas especifico, otro ejemplo

$routes->get('miruta/(^[a-zA-Z0-9_]+$)','Micontrolador::miMetodo/$1');

 En este ejemplo definimos que el parámetro  debe ser alfanumérico que contenga caracteres alfabéticos,enteros y guion bajo. 

Definir Marcadores Propios

CodeIgniter nos ofrece la posibilidad de definir nuestros propios marcadores que se adapten a la necesidades de la aplicación.

Ejemplo parctico

Definimos nuestro marcador de la siguiente manera usando el método addPlaceholder()

$routes->addPlaceholder('miMarcador','\w+');

Definimos nuestra ruta usando el marcador que ya definimos anteriormente

$routes->get('miruta/(:miMarcador)','Micontrolador::miMetodo/$1');

Uso del Marcador :any

Es el marcador permite enviar múltiples parámetros y de distinto tipo a la vez, por ejemplo podríamos necesitar información de un producto por marca,color,tamaño de la siguiente forma

http://localhost/ci/public/producto/abc/azul/mediano

Podemos observar a la palabra producto como la ruta y lo que sigue después de la barra diagonal son los parámetros que recibirá el controlador abc/azul/mediano.

Por ejemplo crearemos una ruta que con el método :any  procesaremos con nuestro controlador los parámetros recibidos para luego mostrarlos en la vista en el siguiente ejemplo.

Paso 1.

En nuestro controlador creamos el método showProducto()

<?php 
namespace App\Controllers;
use CodeIgniter\Controller;
class Micontrolador extends BaseController
{
    public function showProducto($marca=false,$color=false,$tamano=false)
    {
        //Retornamos nuestra vista.
        $data['marca']=$marca;
        $data['color']=$color;
        $data['tamano']=$tamano;
        return view('miVista',$data);
    }
}
?>

Paso 2.

Editamos nuestra vista de la siguiente forma

<!DOCTYPE html>
<html>
<head>
    <title>CodeIgniter</title>
</head>
<body>
    <?php 
    echo '<h3>marca='.$marca.'</h3>';
    echo '<h3>color='.$color.'</h3>';
    echo '<h3>tamaño='.$tamano.'</h3>';
    ?>
</body>
</html>

Paso 3.

Definiendo la ruta de la siguiente manera en nuestro archivo Routes.php

$routes->get('producto/(:any)',Micontrolador::showProducto/$1);

Paso 4.

Probando en el navegador colocamos la url de la siguiente forma

http://localhost/ci/public/producto/abc/azul/mediano

Obtendremos en nuestro navegador el siguiente resultado

Podríamos escribir la url de esta forma y igual funcionaria porque el marcador :any permite el envió de múltiples parámetros a la vez podrían ser 1,2 o 3 parámetros, permitiendo ademas que sean de diferente tipo, por ejemplo alfabéticos, alfanuméricos o enteros.

http://localhost/ci/public/producto/abc/123/456

Como podemos observar cuando escribimos las url en nuestro navegador luego de la palabra producto enviamos 3 parámetros separados por una barra diagonal “/” los cuales recibe nuestro controlador en el método showProducto() retornando la vista y los parámetro que le brindamos a través de la url 

Pero y si solo le enviamos 2 parámetros de la siguiente manera?

http://localhost/ci/public/producto/abc/azul/

Obtendríamos el siguiente resultado en el navegador,porque al definir los parámetros como false en el método showProducto() podemos enviar 1,2 o 3 parámetros y nuestra aplicación seguirá funcionando

Prueba al  enviar solo un parámetro 

http://localhost/ci/public/producto/abc/

El resultado seria el siguiente

Como podemos observar funciona aunque solo enviemos un parámetro.

Lista de Argumentos de Longitud Variable

Se puede pasar una lista de argumentos dinámica, siendo que necesitemos pasar un numero indeterminado de parámetros a nuestra función. 

modificando el método showProducto() de la forma

<?php 
namespace App\Controllers;
use CodeIgniter\Controller;
class Micontrolador extends BaseController
{
    public function showProducto(...$parametros)
    {
        $data['parametros']=$parametros;
        return view('miVista',$data);
    }
}
?>

Modificando nuestra vista de la forma

<!DOCTYPE html>
<html>
<head>
<title>CodeIgniter</title>
</head>
<body>
<?php 
    foreach($parametros as $parametro){
        echo '<h3>Parametro => '.$parametro.'</h3>';
    }
?>
</body>
</html>

Ponemos a prueba en nuestro navegador

Escribimos en nuestro navegador la siguiente url

http://localhost/ci/public/producto/abc/azul/mediano

Obteniendo el siguiente resultado:


CodeIgniter 4 Introducción a las rutas

El enrutamiento es parte importante de una aplicación con CodeIgniter 4. ya que de esta manera el usuario tendrá acceso a las vistas con las vaya interactuar, donde envíe o obtenga información mediante una petición que se haya hecho usando la url en el navegador.

CodeIgniter 4 cuenta con dos tipos principales de enrutamiento:

  1. Enrutamiento de Ruta Definida: Permite definir rutas que están enlazadas a un método específico de un controlador.
  2. Enrutamiento Automático: Permite que el sistema determine la ruta automáticamente basado en los segmentos de la URL.

El enrutamiento de ruta definida es el que permite definir rutas que están enlazadas a un especifico método de un controlador,siendo este el tema principal de este tutorial sobre rutas en CodeIgniter 4.

Establecer reglas de enrutamiento

Un elemento crucial en el manejo de rutas en una aplicación con CodeIgniter es el archivo Routes.php, ubicado en el directorio app/Config. En este archivo se definen las rutas creando una instancia de la clase RouteCollection ($routes), permitiendo especificar criterios personalizados al crear una ruta. Podemos definir un nombre de ruta y parámetros que se pasen en la ruta utilizando marcadores de posición o expresiones regulares.

Al crear una ruta se debe especificar el método correspondiente de verbo HTTP por ejemplo GET o POST:

<?php 
$routes->get('inicio','Micontrolador::inicio');
?>

En la ruta definimos que el método a usar es  ->get(GET)  definiendo el nombre de la ruta como “inicio” que solicita al controlador Micontrolador y su método inicio definido como si se tratase de un método estático separando el nombre del controlador y el método por dos puntos dobles “::”.

Ejemplo practico

Paso 1. En el directorio app/Controllers de nuestra aplicación creamos un archivo Micontrolador.php, es importante recordar que la clase que contenga este archivo deberá ser llamada de la misma forma que el archivo .php y extendiendo de BaseController

<?php 
namespace App\Controllers;
class Micontrolador extends BaseController
{
    public function inicio()
    {
        return view('viewInicio');
    }
}
?>

Paso 2. En el directorio app/Views creamos un archivo llamado viewInicio.php de la siguiente manera

<!DOCTYPE html>
<html>
<head>
<title>CodeIgniter 4</title>
</head>
<body>
<h1>Soy el Inicio</h1>
</body>
</html>

Paso 3. Agregamos la siguiente linea a el archivo Routes.php ubicado en el directorio app\Config 

$routes->get('inicio','Micontrolador::inicio');

Y  listo nuestro primera ruta, solo colocamos en nuestro navegador la url de nuestra aplicación agregando la palabra “inicio” de manera que nos quede así  http://localhost/ci/public/inicio obteniendo la vista que ah sido solicitada a través de la url.

https://codeigniter.com

https://codeigniter.com/download

https://codeigniter.com/user_guide/intro/index.html

https://codeigniter.com/user_guide/incoming/routing.html


CodeIgniter 4 Estructura de la aplicación

Es muy importante al trabajar con CodeIgniter 4 comprender como se estructura de forma predeterminada nuestra aplicación en una instalación nueva.

Directorios predeterminados

luego de la Instalación de CodeIgniter 4 en la raíz de la aplicación nos encontraremos con 5 directorios, los cuales cuentan con un papel muy importante en nuestra aplicación que se estructuran de la siguiente forma.

App

El directorio App es donde reside todo el código necesario para la aplicación y cuenta con varios directorios en su interior, se estructura de la siguiente forma

  • Config/: directorio donde se almacenan todos los archivos de configuración esenciales para el correcto y optimo funcionamiento de la aplicación, por ejemplo los archivos App.php(archivo de configuración de la aplicación), Routes.php(archivo de configuración donde se establecen las rutas de la aplicación),Database.php(archivo de configuración donde se establece la base de datos o bases de datos  a usar en la aplicación) se encuentran aquí. 
  • Controllers/:Directorio donde se definen los controladores para la aplicación.
  • Database/:Almacena las migraciones de las bases de datos y los archivos semilla.
  •  Filters/: Almacena las clases filtros que pueden ejecutarse antes y después del los controladores.
  •  Helpers/:Almacena una colección de helpers  dicho de otra forma colección de funciones independientes que pueden facilitar el trabajo del desarrollador.
  • Language/:Almacena el soporte para idiomas de la aplicación.
  • Libraries/:Una colección de clases que puede utilizar para agregar funcionalidad a su aplicación. La biblioteca en sí no es una parte central de CodeIgniter y puede eliminarse o actualizarse según sea necesario.
  • Models/:Almacena los modelos que funcionan con la base de datos de la aplicación.
  • ThirdParty/:Almacena bibliotecas de terceros que se pueden utilizar en la aplicación.
  • Views/: Almacena las vistas con las que interactúa el usuario.

System

Este directorio almacena los archivos que componen el propio marco del framework, si bien tiene mucha flexibilidad en cómo usa el directorio de la aplicación, los archivos en el directorio del sistema nunca deben modificarse. En su lugar tiene que ampliar las clases o crear nuevas clases para proporcionar la funcionalidad deseada.

Public

La carpeta pública contiene la parte de su aplicación web accesible al navegador, lo que impide el acceso directo a su código fuente. Contiene el archivo .htaccess principal, index.php , y cualquier recurso de aplicación que agregue, como CSS, JavaScript o imágenes.

Esta carpeta está destinada a ser la «raíz web» de su sitio y su servidor web estaría configurado para apuntar a ella.

Writable

Este directorio contiene todos los directorios necesarios para escribir durante la vida de una aplicación. Esto incluye directorios para almacenar archivos de caché, registros y cualquier carga que un usuario pueda enviar. Debe agregar aquí cualquier otro directorio en el que su aplicación deba escribir. Esto le permite mantener sus otros directorios principales sin escritura como medida de seguridad adicional.

Tests

Este directorio está configurado para contener sus archivos de prueba. el directorio _support contiene varias clases simuladas y otras utilidades que puede utilizar mientras escribe sus pruebas. No es necesario transferir este directorio a sus servidores de producción.

https://codeigniter.com

https://codeigniter.com/download

https://codeigniter.com/user_guide/intro/index.html

https://codeigniter.com/user_guide/concepts/structure.html


Introducción a CodeIgniter 4, Framework php

CodeIgniter 4 es framework MVC que sigue el patrón de arquitectura Modelo-Vista-Controlador (MVC), lo que significa que separa la lógica de la aplicación en tres componentes principales: el Modelo (la capa de acceso a datos), la Vista (la capa de presentación) y el Controlador (la capa de lógica de negocio). ademas a diferencia de otros frameworks MVC más robustos, Por lo tanto CodeIgniter es conocido por ser ligero y flexible, lo que lo hace ideal para proyectos pequeños y medianos donde la simplicidad y el rendimiento son prioritarios.

Principales características

  • Instalación y Configuración Sencillas: CodeIgniter es fácil de instalar y configurar. No requiere de una estructura de directorios complicada ni de una configuración tediosa. Simplemente descargas los archivos, configuras una vez tu archivo de configuración y estás listo para empezar a desarrollar.
  • Librerías y Helpers Incorporados: CodeIgniter proporciona una serie de librerías y helpers integrados que facilitan tareas comunes como el manejo de formularios, la validación de datos, el envío de correos electrónicos, el manejo de sesiones, la manipulación de imágenes, entre otros. Esto permite a los desarrolladores ser más productivos y escribir menos código repetitivo.
  • Seguridad Incorporada: La seguridad es una preocupación importante en cualquier aplicación web. CodeIgniter incluye características de seguridad integradas, como la protección contra ataques de tipo XSS (Cross-Site Scripting) y CSRF (Cross-Site Request Forgery), así como herramientas para la validación de formularios y la protección de datos sensibles.
  • Documentación Completa y Activa Comunidad: CodeIgniter cuenta con una documentación completa y bien estructurada que facilita el aprendizaje y la referencia para los desarrolladores. Además, tiene una comunidad activa que proporciona soporte, comparte recursos y contribuye con extensiones y mejoras al framework.
  • Flexibilidad y extensibilidad: Aunque CodeIgniter viene con muchas características útiles fuera de la caja, también es altamente extensible. Los desarrolladores pueden integrar fácilmente bibliotecas de terceros o crear sus propias extensiones para adaptarse a las necesidades específicas de sus proyectos.

Ejemplo Hola Mundo

Paso 1. Creamos nuestra vista, nos dirigimos a el directorio de nuestro proyecto hasta la el directorio app/Views que es donde se almacenan todas las vistas de nuestros proyectos como y creamos la un archivo holaMundo.php.

<!DOCTYPE html>
<html>
<head>
<title>CodeIgniter</title>
</head>
<body>
<h1>Hola Mundo!</h1>
</body>
</html>

Paso 2. Creamos nuestro controlador, debemos recordar que el controlador es quien decide por así decirlo la acción que nuestra aplicación ejecutara según la petición del usuario, estos los crearemos en el directorio app/Controllers, creamos el archivo Micontrolador.php.

<?php 
//usamos el espacio de nombre controllers.
namespace App\Controllers;
//
use CodeIgniter\Controller;
/**
Creamos nuestra clase con el mismo nombre del archivo Micontrolador.php y 
extenderemos del BaseController.
**/
class Micontrolador extends BaseController
{
	//Creamos un método publico llamado holaMundo donde retornamos la vista holaMundo.php.
	public function holaMundo()
	{
		//Retornamos nuestra vista.
		return view('holaMundo');
	}
}

Paso 3. Definimos nuestra ruta y para eso editaremos nuestro archivo Routes.php que se encuentra en el directorio app/config añadiendo la siguiente línea

$routes->get('hola','Micontrolador::holaMundo');

Nuestro archivo de Routes.php nos quedara de la forma

<?php
use CodeIgniter\Router\RouteCollection;
/**
 * @var RouteCollection $routes
 */
$routes->get('/', 'Home::index');
$routes->get('hola','Micontrolador::holaMundo');

Listo ya tenemos nuestro hola mundo con CodeIgniter 4 nos dirigimos al navegador y escribimos la url de nuestro proyecto 

http://localhost/ci/public/hola

Siendo nuestro resultado final este.

Conclusion

En resumen, CodeIgniter es una opción popular para desarrolladores de PHP que buscan un framework ligero, fácil de usar y altamente funcional para construir aplicaciones web rápidas, seguras y escalables. Su enfoque en la simplicidad y la eficiencia lo hace especialmente adecuado para proyectos de tamaño mediano y pequeño.

Aprende Más sobre CodeIgniter 4

https://codeigniter.com

https://codeigniter.com/download

https://codeigniter.com/user_guide/intro/index.html


Cómo Configurar un VirtualHost en Apache para un Proyecto CodeIgniter

En este tutorial, aprenderás a configurar un VirtualHost en Apache para tu proyecto de CodeIgniter. Un VirtualHost te permite acceder a tu proyecto a través de un dominio personalizado en lugar de usar la dirección IP o una ruta larga. Sigue estos pasos:

Paso 1: Crear proyecto de CodeIgniter 4 usando composer

En este paso se debe tener en cuenta que se debe contar con los permisos necesarios para la creación de nuestro proyecto dentro del directorio /var/www/ en ubuntu,debian o en alguna de las distribuciones derivadas de estas.

le asignaremos los permisos necesarios de la siguiente forma

Asignar a nuestro usuario como propietario del directorio /var/www/

sudo chown  grupodelusuario:usuario -R  /var/www

con este comando se le asigna al usuario ser el propietario del directorio,hay que remplazar el grupodelusuario por el grupo al que pertenece el usuario con el que se esta trabajando y remplazar usuario por el nombre de nuestro usuario.

Asignar permisos de escritura y lectura a el directorio /var/www

sudo chmod 755 /var/www/

de esta manera le asignamos los permisos a el propietario de escritura y lectura,mientras que los demás usuarios solo puede ver los archivos nada mas.

Crear el proyecto de CodeIgniter 4 usando composer

para eso solo basta que nos dirijamos desde la terminal hasta el directorio /var/www y ejecutamos el siguiente comando.

composer create-project codeigniter4/appstarter miproyecto

de esta manera ya tenemos instalado y creado nuestro proyecto de CodeIgniter 4 en nuestro servidor.pero no podemos probar aun ya que debemos configurar nuestro virtual host.

Paso dos:Crear el archivo de configuración del VirtualHost

para este paso debemos crear un archivo de configuración en el directorio /etc/apache2/sites-available y lo llamaremos mi_proyecto.conf.

Nos dirigimos al directorio de configuración de apache

cd /etc/apache2/sites-available/

Creamos el archivo mi_proyecto.conf,podemos utilizar el editor de nuestra preferencia,podemos remplazar nano por vim,emacs,gedit,xed,featherpad o el editor de nuestra preferencia

sudo nano mi_proyecto.conf

Añade lo siguiente al archivo configuración que estamos creando :

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName mi_proyecto.local
    DocumentRoot /var/www/miproyecto/public

    <Directory /var/www/miproyecto/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Paso 3: Modificar el archivo host:

Modificando el archivo host permitiremos que nuestro dominio personalizado apunte a nuestro servidor local,de esta manera cuando ingresemos mi_proyecto.local en nuestro navegador apuntara a nuestro proyecto.

nos dirigimos al el directorio /etc/

cd /etc/

abrimos el archivo hosts

sudo nano hosts

añadimos la siguiente linea a nuestro archivo hosts

127.0.0.1   mi_proyecto.local

Paso 4: Habilitar el nuevo VirtualHost:

Para habilitar nuestro nuevo virtualhost debemos ejecutar el siguiente comando .

sudo a2ensite mi_proyecto.conf

Ahora que ya habilitamos nuestro nuevo host solo basta con reiniciar nuestro servidor apache.

sudo systemctl restart apache2

Paso 5: Comprobar el correcto funcionamiento de nuestro VirtualHost

para ello hay que asignarle permisos de escritura y lectura a la carpeta /writable de nuestro proyecto,para ello ejecutamos los siguientes comandos

Asignamos a www-data como propietario del directorio writable de nuestro proyecto

sudo chown www-data:www-data /var/www/miproyecto/writable

le asignamos los permisos correspondientes

sudo chmod 755 /var/www/miproyecto/writable/

Ahora en nuestro navegador colocamos la siguiente url

http://mi_proyecto.local/

tendremos que obtener lo siguiente en nuestro navegador