Multiples aplicaciones

El framework CodeIgniter, desde su punto inicial parte con una aplicación y un core (sistema). Al pensar una aplicación siempre, o casi siempre, no encontraremos con que tenemos en realidad, dos aplicaciones, el frontend o web pública, y el backend, o la web privada de gestión o configuración de nuestra aplicación.
Entonces, necesitamos dos aplicaciones para nuestro proyecto, hasta aquí todo OK. El problema llega cuando queremos configurar nuestro entorno para dicho propósito. Este post va dirigido a la versión 2.x de CodeIgniter.

NOTA: Para separar el código público del código de la aplicación y el sistema, es necesario colocar la ruta completa hacia la carpeta system y application en sus respectivas variables del fichero config de cada aplicación.

Lo primero que tenemos que hacer una vez funcione nuestra instalación básica de CodeIgniter, es duplicar la carpeta application, entonces nuestra estructura de ficheros quedaría de la siguiente manera:

|-app
|–application
|–application_1
|–system
|–public_html

Luego renombramos las aplicaciones para darles mas sentido, por lo que application pasará a llamarse frontend y application_1, backend.
Ahora, dentro de public_html tenemos que distinguir el código publico genérico y el código especifico de cada aplicación, para ello creamos dos directorios dentro con el mismo nombre que nuestras aplicaciones, por lo que la estructura quedaría de la siguiente manera:

|-app
|–frontend
|–backend
|–system
|–public_html
|–frontend
|–backend

El código común quedará en public_html, como por ejemplo el logo, que lo almacenaremos en public_html/images/logo.jpg. Y luego dentro de cada carpeta frontend y backend, sus recursos públicos específicos.
Un consejo es crear un estructura de carpetas como:


|–public_html
|–css
|–js
|–images
|–frontend
|–css
|–js
|–images
|–backend
|–css
|–js
|–images

De este modo esta todo bien estructurado, el código común, del específico.
Ahora debemos configurar nuestro servidor local para las dos aplicaciones. Tenemos dos maneras, o agregamos un VirtualHost para cada aplicación, o dentro del mismo dominio o VirtualHost. Esta última es la opción que adopté.
Como sabemos CodeIgniter comienza su carga mediante el fichero index.php, que en nuestro caso se encuentra dentro de public_html. Para que esto funcione con nuestra nueva estructura, tenemos que cambiar algunas cosas.
Lo primero que debemos hacer el duplicar el fichero index.php, y cambiarles el nombre por frontend.php y backend.php. Dentro de cada fichero se debe modificar el valor de $application_folder, apuntando a su respectiva aplicación. Una vez hecho esto ya se puede acceder a host/frontend.php o host/backend.php.

Ya lo tenemos.

Cuando escogemos esta estructura, es porque los datos de nuestra aplicación requieren gestión y/o supervisión de una manera adecuada. El siguiente inconveniente que aparece al comenzar a programar, es que las dos aplicaciones compartirán código, o bueno sería una práctica recomendable que así lo hicieran. El código más común que se requiere compartir, son las clases de modelos, osea los ficheros de manipulación de nuestra base de datos. Para este propósito tenemos que utilizar los recientemente introducidos package, de la clase load. Para este post también compartiré una carpeta con ficheros de configuración, para que sea mas claro.

Para nuestros recursos/ficheros comunes crearemos una carpeta a la altura de las aplicaciones con el nombre common (común en inglés), y dos subcarpetas llamadas config y models. La estructura quedaría de la siguiente manera:

|-app
|–common
|–config
|–models
|–frontend
|–backend
|–system
|–public_html
|–frontend
|–backend

Una vez hecho esto, tenemos con configurar las aplicaciones para que carguen los ficheros de configuración y modelos desde esta carpeta. Podemos optar por la carga manual desde nuestro controlador o hacerlo mediante autoload. Yo escogí esta última opción, debido a que CodeIgniter tiene un fichero para dicho propósito y que considero más lógico.
Ahora debemos hacer que CodeIgniter cargue la ruta del paquete al iniciar, para ello agregamos en cada fichero autoload.php que se encuentra dentro la carpeta config de cada aplicación, una ruta al array package, en nuestro caso sería:

$autoload['packages'] = array(BASEPATH.'../common');

Al hacer esto ya tenemos el path cargado, por lo que al cargar un modelo podemos seguir las mismas directrices de la documentación de CodeIgniter, debido a que este podrá encontrar el modelo al tener la ruta.
Si se requiere cargar un fichero de configuración desde autoload que se encuntra en common/config, solo debemos añadir el nombre del fichero:

$autoload['config'] = array([filename]);