En este post te voy a mostrar cómo comenzar a programar un proyecto de CodeIgniter versión 4 que recientemente ha alcanzado la fase beta.
CodeIgniter 4, al momento de escribir este post todavía está en beta, pero muy pronto alcanzará la versión estable.
No olvides que para esto se necesita Composer y PHP.
Novedades de CodeIgniter 4
Tenemos varias novedades; la nueva versión de CodeIgniter 4 cuenta con namespaces y una estructura cambiada.
Encontramos todo el MVC en la carpeta app. Los modelos en Models, los controladores en Controllers y finalmente las vistas en Views.
El index.php (punto de entrada de nuestra app) está en public; en ese mismo directorio debemos colocar todo lo que sea público, por ejemplo nuestros archivos de JS, CSS, imágenes, etcétera.
Una gran novedad es que ahora va a usar Composer para gestionar sus dependencias, como todo software de PHP que se respeta.
La carpeta writable será el directorio en donde se pueden colocar los archivos dinámicos relacionados a nuestra app (por ejemplo, fotos de perfil de usuarios, documentos PDF, etcétera).
Finalmente, dentro de la estructura, vemos que tiene un archivo env que guarda nuestras contraseñas y credenciales para distintos servicios.
Ahora las rutas están en app/Config/Routes.php y pueden especificarse desde ahí, a diferencia de cuando cada ruta pertenecía a un controlador.
Crear aplicación de CodeIgniter 4
Abre una terminal y navega hasta la carpeta padre que alojará el proyecto. Ahí, ejecuta:
composer create-project codeigniter4/appstarter probando-ci4 --stability beta --no-dev
Lo que estamos haciendo es clonar el appstarter de CodeIgniter 4 usando composer create-project
.
La carpeta o directorio en donde estará la app es probando-ci4
Especificamos --stability beta
ya que el proyecto todavía no está estable y composer no dejaría clonarlo si no especificamos esto
La opción de --no-dev
es para no instalar las dependencias del desarrollo de CodeIgniter, pues queremos usar CodeIgniter 4 para desarrollar apps, no queremos modificar el núcleo del mismo.
Si visitas tu app en el navegador (en mi caso es http://localhost/probando-ci4/public/) verás que aparece la bienvenida de CodeIgniter 4:
Ahora abre el directorio en donde creaste la app con tu editor de textos o IDE favorito.
Hola mundo en CodeIgniter 4
Para hacer esto muy sencillo vamos a hacer que al visitar una ruta se muestre una vista creada por nosotros y que se muestre la fecha y hora actual.
Creamos la vista en app/Views/hola.php con el siguiente contenido:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hola CodeIgniter</title>
</head>
<body>
Estas viendo la vista hola.php
¿Sabes qué día es hoy? <?php echo date("Y-m-d") ?>
</body>
</html>
Ahora modificamos el controlador ubicado en app/Controllers/Home.php y agregamos una función para que muestre la vista que acabamos de crear de manera que quede así:
<?php namespace App\Controllers;
use App\Models\UserModel;
class Home extends BaseController
{
public function index()
{
return view('welcome_message');
}
public function hola()
{
return view('hola');
}
//--------------------------------------------------------------------
}
Finalmente vamos a modificar nuestras rutas en app/Config/Routes.php y vamos a agregar lo siguiente en las definiciones de rutas:
$routes->get('/hola', 'Home::hola');
Estamos indicando que cuando se haga una petición get con la ruta /hola se llame al método hola ubicado en el controlador Home.
El archivo completo debe verse así (línea 76):
<?php namespace Config;
/**
* --------------------------------------------------------------------
* URI Routing
* --------------------------------------------------------------------
* This file lets you re-map URI requests to specific controller functions.
*
* Typically there is a one-to-one relationship between a URL string
* and its corresponding controller class/method. The segments in a
* URL normally follow this pattern:
*
* example.com/class/method/id
*
* In some instances, however, you may want to remap this relationship
* so that a different class/function is called than the one
* corresponding to the URL.
*/
// Create a new instance of our RouteCollection class.
$routes = Services::routes(true);
// Load the system's routing file first, so that the app and ENVIRONMENT
// can override as needed.
if (file_exists(SYSTEMPATH . 'Config/Routes.php'))
{
require SYSTEMPATH . 'Config/Routes.php';
}
/**
* --------------------------------------------------------------------
* Router Setup
* --------------------------------------------------------------------
* The RouteCollection object allows you to modify the way that the
* Router works, by acting as a holder for it's configuration settings.
* The following methods can be called on the object to modify
* the default operations.
*
* $routes->defaultNamespace()
*
* Modifies the namespace that is added to a controller if it doesn't
* already have one. By default this is the global namespace (\).
*
* $routes->defaultController()
*
* Changes the name of the class used as a controller when the route
* points to a folder instead of a class.
*
* $routes->defaultMethod()
*
* Assigns the method inside the controller that is ran when the
* Router is unable to determine the appropriate method to run.
*
* $routes->setAutoRoute()
*
* Determines whether the Router will attempt to match URIs to
* Controllers when no specific route has been defined. If false,
* only routes that have been defined here will be available.
*/
$routes->setDefaultNamespace('App\Controllers');
$routes->setDefaultController('Home');
$routes->setDefaultMethod('index');
$routes->setTranslateURIDashes(false);
$routes->set404Override();
$routes->setAutoRoute(true);
/**
* --------------------------------------------------------------------
* Route Definitions
* --------------------------------------------------------------------
*/
// We get a performance increase by specifying the default
// route since we don't have to scan directories.
$routes->get('/', 'Home::index');
$routes->get('/hola', 'Home::hola');
/**
* --------------------------------------------------------------------
* Additional Routing
* --------------------------------------------------------------------
*
* There will often be times that you need additional routing and you
* need to it be able to override any defaults in this file. Environment
* based routes is one such time. require() additional route files here
* to make that happen.
*
* You will have access to the $routes object within that file without
* needing to reload it.
*/
if (file_exists(APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php'))
{
require APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php';
}
Ahora visita /hola en tu navegador (en mi caso es http://localhost/probando-ci4/public/hola) y debería mostrarse algo así:
Has creado tu primer vista con CodeIgniter 4.
Actualizar framework
Cuando haya actualizaciones del framework simplemente hay que ejecutar:
composer update
De esta manera se van a actualizar las dependencias, incluyendo el mismo framework. Adiós a las descargas de zip y todas esas cosas.
Conclusión
No quise hacer esta guía tan larga, y tampoco meterme con bases de datos y otras cuestiones, aunque ya se pueden probar.
Este post fue una introducción a las novedades de CodeIgniter 4, pero recuerda que el framework todavía no está listo para ir a producción, toca esperar más.
De todos modos, CodeIgniter 4 ha cambiado completamente su estructura, cosa que necesitaba realmente.
Finalmente dejo un enlace a la documentación oficial de esta versión 4 del framework de PHP.