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:
index.phpRewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L]
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';
}
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($request, 1);
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 */
}
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($method, false, $nombre)) {
throw new Exception();
}
call_user_func($method, $request);
} catch (Exception $e) {
notFound();
}
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.