Foros del Web » Programando para Internet » PHP »

PHP OO Practicando el MVC

Estas en el tema de Practicando el MVC en el foro de PHP en Foros del Web. Hola, quiero mostrarles un sistema MVC que empecé a hacer ayer, quiero saber sus opiniones y que me den consejos. Lo hice "accidentalmente", estaba leyendo ...
  #1 (permalink)  
Antiguo 12/12/2013, 12:50
 
Fecha de Ingreso: febrero-2013
Mensajes: 163
Antigüedad: 11 años, 2 meses
Puntos: 1
Practicando el MVC

Hola, quiero mostrarles un sistema MVC que empecé a hacer ayer, quiero saber sus opiniones y que me den consejos. Lo hice "accidentalmente", estaba leyendo algunos artículos y mientras probaba me dio la curiosidad de hacer algo, un sistemita casero para practicar. Ya hace tiempo que vengo familiarizándome con POO y MVC pero todavía no me metí a fondo en esto.
Sé que lo mejor sería aprender a usar un framework como Symfony, CakePHP, etc. Y lo estoy haciendo, o sea, no lo hacía porque tengo problemas con mi internet (10 kbps :c) entonces evito hacer descargas, es casi imposible apenas abrir una página, bueno, sé que no es excusa, lo que sí es que ayer me decidí a hacer el sacrificio de soportar el internet que tengo y ya estoy siguiendo un tutorial para aprender a usar Symfony, intentando hacer descargas, okay... Bueno, a raíz de eso también estuve buscando cosas que están un poco fuera de mi conocimiento, enrutamiento de URLs por ejemplo. Me topé con unos ejemplos y traté de hacer algo propio. Sé que todavía no estoy capacitado para hacer esto, sólo me gustaría escuchar la opinión de ustedes acerca de este "borrador". Fue sólo un experimento momentáneo y por mi falta de conocimiento no me gusta mostrar mis códigos, sé que tengo que aprender más (por ahora al menos trato de seguir los estándares). Pero repito, ahora me puse las pilas y estoy aprendiendo a usar un framework (opté por Symfony porque hablan muy bien de él, luego veré si me conviene empezar con otro framework).
Yo pienso ser un buen programador, no sólo de PHP, de todo. Sé que estoy demasiado verde y que no debería andar preguntando en foros sin ni siquiera saber realmente lo que estoy haciendo. Sé de la mala fama que tiene PHP y seguramente es por culpa de las personas como yo que agarraron PHP sin tener idea de nada y empezaron a hacer cualquier cosa bochornosa. Bueno por suerte ya estoy empezando a cambiar de rumbo y voy a tomar esto más a serio.
Okay ya sé, la universidad… pienso ir, pronto, no sé exactamente cuándo pueda irme… en este mismo momento tengo problemas y otras cosas más importantes en que preocuparme, entonces programación es sólo un hobby por ahora.
Pero es que esta vez me entró la curiosidad de que alguien más pueda analizar mi código, esto es lo que tengo (perdón si es algo impresentable):

Omití mucho código, la idea es mostrar la "lógica" de lo que quiero hacer. Opté por hacer un sistema de "biblioteca", donde recoge información de un libro por su ID. También quiero mencionar que me gusta hacer los sistemas en inglés, por varios motivos.
Sólo voy a mostrar el index.php que se encarga de llamar a un único controlador. El controlador lo que hace es recibir la petición, hacer la consulta desde modelo, luego recibir y preparar los resultados para enviárselos a la vista.

Primeramente, desde .htaccess hago que todas las peticiones URL se dirijan a index.php:

.htaccess
Código:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
index.php
Código PHP:
<?php

define
('ROOT'dirname(__FILE__));
/* Directorio de la aplicación */
define('APP_ROOT'ROOT '/app/');
/* Directorio de los controladores */
define('CONTROLLER_PATH'APP_ROOT 'controllers/');

/* Separa las barras de la url, convierte todo en array,
* y elimina los espacios. Estas serían las peticiones.
* $request[0] = Controlador
* $request[1] = Método
* $request[2] = ARGUMENTO1
* $request[3] = ARGUMENTO2
* etc...
*/
$request explode('/'$_SERVER['REQUEST_URI']);
$request array_values(array_filter($request));

/* Si no hay peticiones, llama al controlador de la página de Inicio */
if (empty($request)) {
    require_once 
CONTROLLER_PATH 'home.php';
} else {
    try {
        
/* Array que asocia una petición con el controlador
        * hay más peticiones y controladores, pero esto es sólo un ejemplo.
        */
        
$controllers = array(
            
'libro'  => 'bookController',
        );
        
/* Compara la petición $request[0] con el array
        * o sea la petición del Controlador.
        */
        
foreach ($controllers as $key => $value) {
            if (
$request[0] == $key) {
                
$controller $value;
            }
        }
        
/* Comprueba de que exista el archivo del controlador */
        
$controllerPath CONTROLLER_PATH $controller '.php';
        if (!
file_exists($controllerPath)) {
            throw new 
Exception();
        }
        
/* Llama al archivo del controlador */
        
require_once $controllerPath;
    } catch (
Exception $e) {
        
notFound();
    }
}

/* Función que muestra la página de error 404  */
function notFound()
{
    require_once 
CONTROLLER_PATH 'notFound.php';
}
El siguiente archivo es uno de los controladores. En este ejemplo estoy usando un único controlador:
bookController.php
Código PHP:
<?php

/* Llamar al modelo 'bookModel.php' */
require_once APP_ROOT '/models/bookModel.php';

/* Array que asocia la Petición con los Métodos
* hay más peticiones y métodos, pero esto es sólo un ejemplo.
*/
$methods = array(
    
'ver'  => getBookController,
);
/* 'requestMethods.php' parsea (no sé si así se dice) el array $methods.
* Llama al método correspondinte en caso de que la petición coincida
* con uno de los métodos (en este caso sólo existe getBookController).
* De lo contrario llama a la funcion notFound(); que muestra un error.
* Más abajo puse el archivo 'requestMethods.php' para que lo vean.
*/
require_once APP_ROOT '/services/requestMethods.php';

/* Método "index" en caso de que no haya ninguna petición para el método */
function index()
{
    
/* Código omitido */
}

/* Método que recoge un libro por su ID */
function getBookController($request)
{
    try {
        
/* Recoge la última petición, comprueba que esta sea 
        * $request[2] y comprueba que sea un número.
        * $request[2] sería el ID.
        */
        
$value array_slice($request1);
        if (
$value != $request[2] ||
            !
is_numeric($value)) {
            throw new 
Exception();
        }

        
/* Llama a la función cleanBookData para limpiar la petición.
        * En este caso el valor es $request[2], que sería el ID.
        */
        
$value cleanBookData($value);
        
$book setObj();
        
/* Hace la consulta a travéz del modelo */
        
$book->getBookModel($value);
        
/* Recibe los datos del modelo, comprueba que el registro existe
        *  y pone los datos en un array para enviárselos a la vista.
        */
        
if (count($book->rows) == 1) {
            
$data = array(
                
'title'   => $book->title,
                
'author'  => $book->author,
                
'content' => $book->content,
            );
        
/* Si no hay datos devuelve un array vacío */
        
} else {
            
$data = array();
        }
        
/* Llama a la vista y entrega los datos, bueno, hay mucha cosa omitida */
        
require_once(APP_ROOT '/views/getBookView.php');
        
returnView($data);
    
/* En caso de que no supere alguna comprobación */
    
} catch (Exception $e) {
        
notFound();
    }
}

/* Instanciar la clase */
function setObj()
{
    
$obj = new Book();
    return 
$obj;
}

/* Estos 2 métodos comprueban, procesan y limpian
* todo tipo de datos ($_POST por ejemplo, o cualquier dato)
* Son para 2 casos distintos, nunca se usa los 2 a la vez,
* uno es para limpiar directamente los $request[], el otro para es
* procesar peticiones como POST...
* Estos métodos llaman a otros archivos para hacer el proceso, se procesan
* arrays, hacen comparaciones, hacen muchas cosas.
* No quiero alargar mucho así que voy a omitir esta parte.
*/
function cleanBookData($value)
{
    
/* Código omitido */
}

function 
helperBookData()
{
    
/* Código omitido */
}
requestMethods.php
Código PHP:
<?php

/* Comprueba que la peticion $request[1] coincida con el método */
try {
    if (empty(
$request[1])) {
        
$method index;
        
call_user_func($method$request);
    } else {
        foreach (
$methods as $key => $value) {
            if (
$request[1] == $key) {
                
$method $value;
            }
        }
    }

    if (!
is_callable($methodfalse$nombre)) {
        throw new 
Exception();
    }

    
call_user_func($method$request);
} catch (
Exception $e) {
    
notFound();
}
La petición debería ser: (servidor)/libro/ver/(id)
Si fuera sólo (servidor)/libro/ utilizaría el método "index" del controlador "bookController.php" .
En caso de que no haya petición, utilizaría el controlador de la página de inicio "home.php".
En caso de que no coincida la petición, utilizaría el controlador "notFound.php" para mostrar la página de error.

Y bueno esa es la parte inicial, sólo quiero saber qué opinan de mi planteamiento. También está el modelo, la abstracción de la base de datos, la parte lógica de la vista, y un montón de funciones más. Pero esto es para dar la idea de la "lógica" que utilizé y me den sus opiniones.

PD: antes de abrir el tema traté de simplificar varias partes del sistema para que puedan entender mejor, pueden haber algunas cosas que no coincidan, no lo tengo así como está aquí, pero es casi la misma cosa.

EDITO:
Bueno, creo que ya no es necesario que me respondan, esto fue sólo un borrador. Me decidí a cambiar de framework. Descargué el Zend Framework, estoy siguiendo unos tutoriales y estoy haciendo mi primer sistema con Zend. Fue amor a primera vista! jaja hasta había cosas que de alguna forma ya conocía. Bueno a meterle con todo.

Última edición por mathiasmontiel; 13/12/2013 a las 06:48

Etiquetas: mvc, registro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:13.