Cita:
Iniciado por Fylux Entonces, CodeIgniter, entiendo que por defecto no promueve buenas prácticas, pero tienes la posibilidad de añadirlas por tu cuenta.
¿Es cierto?
No es que no promueve, es que quizás te permita demasiado. Ahora mismo juraría que puedes acceder al modelo desde la vista, puedes no usar el modelo nunca incluso accediendo siempre desde el controlador y puedes hacer verdaderas burradas en el código...
Por ejemplo en comparación con Rails la validación de formulario la haces en el modelo SIOSI en el CI lo puedes hacer en el controlador y incluso te obligan hacerlo en el controlador... en el caso de las funciones personales callback...
El códeigniter en si o su patrón es un array estático de clases que se guarda en UNA VARIABLE EN UNA SOLA CLASE donde se van guardando todos los demás que llamas...
Yo diría que si algún día tienen que sacar el CI3 tendrían que reescribirlo desde 0... vamos un tremendo curro.
Mira este para mi es el resumen de CI:
Código PHP:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Sf_Controller {
private static $instance;
public function __construct() {
self::$instance =& $this;
foreach (is_loaded() as $var => $class) {
$this->$var =& load_class($class);
}
$this->load =& load_class('sf_loader');
}
public static function &get_instance() {
return self::$instance;
}
}
Ahí puedes observar Singleton y la función load_class que va metiendo clases que vas cargando en un array... incluido el modelo. Por eso lo llamo la gran BOLA. La clase loader, algunas funciones se podrían resumir en esto (el código de abajo), si hicieran uso de la función autoload (
http://php.net/manual/en/language.oop5.autoload.php) que es una función OOP de PHP 5.
Código PHP:
public function model($class) {
$Sf =& get_instance();
$Sf->$class = new $class;
}
Pero mientras están con el include(...) o require_once() del PHP4, ejemplo:
Código PHP:
public function model($model, $name = '', $db_conn = FALSE)
{
if (is_array($model))
{
foreach ($model as $babe)
{
$this->model($babe);
}
return;
}
if ($model == '')
{
return;
}
$path = '';
// Is the model in a sub-folder? If so, parse out the filename and path.
if (($last_slash = strrpos($model, '/')) !== FALSE)
{
// The path is in front of the last slash
$path = substr($model, 0, $last_slash + 1);
// And the model name behind it
$model = substr($model, $last_slash + 1);
}
if ($name == '')
{
$name = $model;
}
if (in_array($name, $this->_ci_models, TRUE))
{
return;
}
$CI =& get_instance();
if (isset($CI->$name))
{
show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
}
$model = strtolower($model);
foreach ($this->_ci_model_paths as $mod_path)
{
if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
{
continue;
}
if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
{
if ($db_conn === TRUE)
{
$db_conn = '';
}
$CI->load->database($db_conn, FALSE, TRUE);
}
if ( ! class_exists('CI_Model'))
{
load_class('Model', 'core');
}
require_once($mod_path.'models/'.$path.$model.'.php');
$model = ucfirst($model);
$CI->$name = new $model();
$this->_ci_models[] = $name;
return;
}
// couldn't find the model
show_error('Unable to locate the model you have specified: '.$model);
}
En fin... creo que técnicamente CI esta muuuy desfasado, pero repito es cojonudo por temas de compatibilidad y proyectos medianos...