Sie sind auf Seite 1von 9

HMVC en codeigniter

El Modelo Vista Controlador (MVC) viene a ser una forma de trabajar que separa los datos de
una aplicacin, la interfaz de usuario, y la lgica de negocio en tres componentes distintos, el
modelo, la vista y el controlador. Uno de los motivos del MVC es la reutilizacin de cdigo.
Aparte de el MVC tambin tenemos el Hierarchical-Model-View-Controller(HMVC), que viene
a ser lo mismo pero para conseguir aplicaciones realmente escalables, se trata de lo siguiente:
En vez de tener un sistema MVC, podemos tener muchos, o mejor dicho, tener muchos mdulos.
Cada mdulo contiene o puede contener lo siguiente:

Una carpeta controllers


Una carpeta models
Una carpeta views
Una carpeta libraries

Eso es lo que viene a ser un mdulo, y dentro de cada carpeta es como si trabajamos con
codeigniter, tenemos nuestros controladores, nuestras vistas y nuestros modelos, pero con algunas
excepciones como veremos.
Con esta breve explicacin vamos a crear un pequeo proyecto en el que veremos como crear
mdulos, conectar el modelo la vista y el controlador y conectar un mdulo con otro para tener la
opcin de poder reutilizarlos de forma realmente sencilla con una lnea de cdigo, empecemos.

Creamos el proyecto
Nos vamos a la web de codeIgniter y nos descargamos la versin que hay disponible, la guardamos
y la extraemos en nuestro directorio raz, en mi caso C:\xampp\htdocs, una vez tengamos ya la
carpeta con los archivos debemos cambiarle el nombre, le podemos poner hmvc_ci, sugiero que
coloquen el mismo as ser ms sencillo seguir el tutorial.

Las libreras
Descargar archivos
Como hemos dicho necesitamos crear nuestros mdulos, pero para que estos funcionen primero

debemos crear la configuracin.


Una vez descargados los archivos cogemos los archivos de la carpeta core y los alojamos en
applications/core, y con los de third_party lo mismo, los cogemos y los metemos en
applications/third_party, con esto es suficiente.

La base de datos
PHP
CREATE DATABASE IF NOT EXISTS usuarios;
1

CREATE DATABASE IF NOT EXISTS usuarios;

PHP
CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nombre` varchar(100) NOT NULL,
`password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
AUTO_INCREMENT=1 ;

1
2
3
4
5
6

CREATE TABLE IF NOT EXISTS `users` (


`id` int(11) NOT NULL
AUTO_INCREMENT,
`nombre` varchar(100) NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT
CHARSET=latin1
AUTO_INCREMENT=1 ;

El archivo .htaccess
PHP
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$
/hmvc_ci/index.php/$1 [L] ErrorDocument 404 /hmvc_ci/index.php
1
2
3
4
5
6

RewriteEngine On
RewriteCond %
{REQUEST_FILEN
AME} !-f
RewriteCond %
{REQUEST_FILEN
AME} !-d
RewriteRule ^(.*)$
/hmvc_ci/index.php/

$1 [L]
ErrorDocument
404
/hmvc_ci/index.php

Ahora ya podemos acceder al proyecto desde aqu.

El archivo database.php
Ahora debemos dirigirnos a nuestro archivo database.php que est en la carpeta config y modificar
el cdigo para que quede as, siempre dependiendo de nuestros datos de acceso a la base de datos.
PHP
$db['default']['hostname'] = 'localhost';//nuestro host $db['default']['username'] = 'root';//el usuario de nuestra base de datos
$db['default']['password'] = '';//el password del usuario $db['default']['database'] = 'usuarios';//la base de datos que vamos a utilizar
$db['default']['dbdriver'] = 'mysql'; $db['default']['dbprefix'] = ''; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] =
TRUE; $db['default']['cache_on'] = FALSE; $db['default']['cachedir'] = ''; $db['default']['char_set'] = 'utf8'; $db['default']['dbcollat'] =
'utf8_general_ci'; $db['default']['swap_pre'] = ''; $db['default']['autoinit'] = TRUE; $db['default']['stricton'] = FALSE;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

$db['default']['hostname'] = 'localhost';//nuestro host


$db['default']['username'] = 'root';//el usuario de
nuestra base de datos
$db['default']['password'] = '';//el password del
usuario
$db['default']['database'] = 'usuarios';//la base de
datos que vamos a utilizar
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

El archivo autoload.php
Ahora nos dirigimos al archivo autoload.php que est dentro de la carpeta config y en la lnea 55
debemos modificar el cdigo por ste.
PHP

$autoload['libraries'] = array('database');
1

$autoload['libraries'] = array('database');

De esta forma cargamos automticamente la base de datos. En la lnea 67 modificamos por este
otro.
PHP
$autoload['helper'] = array('url');
1

$autoload['helper'] = array('url');

Con el helper url tendremos disponible las urls amigables y as podremos crear nuestra ruta.

El archivo config.php
Ahora vamos a nuestra carpeta config y abrimos el archivo config.php, en la lnea 17 colocaremos
este cdigo.
PHP
$config['base_url'] = 'http://localhost/hmvc_ci/';

$config['base_url'] =
'http://localhost/hmvc_ci/';

Como vemos es la configuracin de siempre, hasta aqu no hay cambios.

Creando un modulo
Ahora empiezan los cambios, lo primero que haremos ser crear una carpeta que llamaremos
modules dentro de la carpeta application, de igual forma que la llamamos modules la podemos
llamar como queramos, esta ser la carpeta donde guardaremos nuestro modulos.
A continuacin crearemos nuestro primer modulo y su estructura de directorios, veamos lo sencillo
que es.
Creamos una carpeta llamada login por ejemplo, este ser el nombre de nuestro mdulo, dentro
deberemos crear 3 carpetas ms, una llamada controllers, otra llamada models y otra llamada views.
Esto ser siempre igual para cada mdulo, pudiendo aadir como veremos una carpeta para las
libreras. Una vez hecho esto pasaremos a crear nuestro primer controlador para el mdulo login,
veamos.

El controlador index.php
Nos vamos a application/modules/login/controllers y creamos un archivo nuevo llamado index.php,
dentro colocamos el siguiente y sencillo cdigo.

PHP
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Index extends MX_Controller { public function
__construct() { parent::__construct(); $this->load->model('index_model'); } public function index() { $data['users'] = $this>data_users(); $this->load->view('index',$data); } public function data_users() { return $this->index_model->get_users(); } public
function saludo($saludo) { echo 'esto es un '. $saludo; } } /* *end modules/login/controllers/index.php */

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


class Index extends MX_Controller
{
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

public function __construct()


{
parent::__construct();
$this->load->model('index_model');
}
public function index()
{
$data['users'] = $this->data_users();
$this->load->view('index',$data);
}
public function data_users()
{
return $this->index_model->get_users();
}
public function saludo($saludo)
{
echo 'esto es un '. $saludo;
}
}
/*
*end modules/login/controllers/index.php
*/

Si nos fijamos slo tenemos un ligero cambio con respecto a como venimos trabajando con
codeigniter, y es que en vez de que nuestro controlador extieneda de CI_Controller, lo hace de
MX_Controller, que es quin hace posible el uso de la arquitectura HMVC, as de fcil, no
necesitamos saber ms.
Como vemos llamamos a un modelo, cargamos una vista, etc, todo es exactamente igual que

siempre, de momento

El modelo index_model.php
Nos vamos a application/modules/login/models y creamos un nuevo archivo llamado
index_model.php, dentro colocamos el siguiente cdigo.

PHP
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Index_model extends CI_Model { public function
__construct() { parent::__construct(); } public function get_users() { $query = $this->db->get('users'); return $query->result(); } } /*
*end modules/login/models/index_model.php */

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


class Index_model extends CI_Model
{
public function __construct()
{
parent::__construct();
}
public function get_users()
{
$query = $this->db->get('users');
return $query->result();
}
}
/*
*end modules/login/models/index_model.php
*/

Aqu si que no tenemos ningn cambio, un modelo de lo ms normal en codeigniter, as que


pasamos a la vista index en la que simplemente veremos como llegan correctamente los datos,
veamos.

La vista index.php
Nos vamos a application/modules/login/views y creamos un nuevo archivo llamado index.php,
dentro colocamos el siguiente cdigo.

PHP
<h1>Nuestro primer mdulo en codeigniter!!</h1> <?php foreach($users as $user) : ?> <p>Nombre: <?php echo $user->nombre ?>
Password: <?php echo $user->password ?></p> <?php endforeach; ?>

<h1>Nuestro primer mdulo en codeigniter!!</h1>


1
2
3
4
5
6
7

<?php foreach($users as $user) : ?>


<p>Nombre: <?php echo $user->nombre ?>
Password: <?php echo $user->password ?></p>
<?php endforeach; ?>

Si no se muestran datos seguramente ser porque debis ingresar algn registro en la tabla users
<img src="http://uno-de-piera.com/wp-includes/images/smilies/icon_biggrin.gif" alt="icon biggrin"
class='wp-smiley' title="HMVC en codeigniter" />
Si ahora apuntamos nuestro navegador aqu deberemos ver los resultados de nuestra consulta sin
mayores problemas. Como vemos, para acceder a un mdulo simplemente debemos colocar el
servidor/nombre del mdulo/controlador/funcin, como nuestra funcin es la funcin index no es
necesario escribirla en la url, si por ejemplo se llamar registro, si que deberamos acceder de la
siguiente forma, http://localhost/hmvc_ci/login/index/registro.
Ya hemos aprendido a crear un mdulo, veamos ahora como llamarlo desde otro mdulo, es
fantstico.

El modulo home
Creamos un nuevo modulo llamado home, lo mismo que antes, dentro de modules una carpeta
llamada home, y dentro las 3 carpetas, a saber, controllers, models y views. Con esto podemos pasar
a crear nuestro controlador home.

El controlador home.php
Nos vamos a application/modules/home/controllers y creamos un archivo nuevo llamado home.php,
dentro colocamos el siguiente y sencillo cdigo.
PHP
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Home extends MX_Controller { public function
__construct() { parent::__construct(); } //llamamos a la funcin data_users la cul nos //entrega un array con los usuarios public
function index() { //llamamos a otro modulo, la secuencia es modulo/controlador/mtodo $data['users'] =
Modules::run('login/index/data_users'); $this->load->view('home',$data); } //llamamos a una funcin que tiene un parmetro public
function hola() { $data['saludo'] = Modules::run('login/index/saludo','saludo'); $this->load->view('saludo',$data); } }
1
2
3

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');


class Home extends MX_Controller

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

public function __construct()


{
parent::__construct();
}
//llamamos a la funcin data_users la cul nos
//entrega un array con los usuarios
public function index()
{
//llamamos a otro modulo, la secuencia es
modulo/controlador/mtodo
$data['users'] = Modules::run('login/index/data_users');
$this->load->view('home',$data);
}
//llamamos a una funcin que tiene un parmetro
public function hola()
{
$data['saludo'] = Modules::run('login/index/saludo','saludo');
$this->load->view('saludo',$data);
}
}

Como vemos ms de lo mismo, otro controlador que extiende de MX_Controller, pero con la
diferencia de que aqu llamamos a otro mdulo. Llamar a un mdulo es as de fcil:
Modules::run(modulo/controlador/funcin, parmetros de la funcin si los tiene);
Si si, as de fcil, en data['users'] tenemos la informacin que retorna el mtodo data_users del
controlador index del mdulo login.
Mostrarlo en pantalla ser tan fcil como crear una vista llamada home.php en la carpeta views e
imprimir el resultado, lo importante que es la reutilizacin de cdigo, aqu podemos ver lo til que
puede llegar a ser.
La funcin hola es lo mismo, pero con la diferencia de que a la funcin saludo del controlador
login le hemos pasado un parmetro, pues para pasarle el parmetro es as de fcil, cuando
mostremos la variable saludo veremos esto es un saludo.
Y eso es todo, espero que hayis entendido como funciona el HMVC en codeigniter, que gracias a
estas libreras es realmente sencillo, dejo los archivos para su descarga y cualquier duda relacionada
con el tutorial intentar ayudar en lo que pueda.
Descargar proyecto hmvc_ci

Das könnte Ihnen auch gefallen