Cave's Man: Nuevo framework de PHP v0.1-alpha

soanix

Buenas,

Se que hay muchos Frameworks, muy completos, mejores y peores, con mas soporte y con mas comunidad, que actualmente la mía es 0, pero este es el mio, con mucho cariño y con buena letra.

Quería presentaros la primera Alpha de Cave's Man, un framework de PHP que con mucho trabajo y horas de desarrollo, ha salido a la luz con Soporte multi-idioma, modular y con sistema de plantillas.

¿Por que usar Cave's Man?

Francamente, con todos los frameworks que corren por ahí, es difícil que alguien empiece a desarrollar con esta base, pero para mi es una buena oportunidad de hacer algo propio, con ideas claras y grandes aspiraciones.

¿Qué tiene de especial?

El control. Trasteando con muchos de los frameworks que aparecen hoy en día, siento cierta nostalgia de programar de verdad, sentir que estoy trocando código limpio y no usar funciones prefabricadas que dependen de funciones y mas funciones y librerías y mas librerías. Es por ello que este framework este pensado para programadores que les guste programar en PHP.

¿Qué puedo hacer con el?

Básicamente, casi de todo. Está pensado para una fácil implementación de cualquier librería externa. Su estructura es transparente y al ser modular, puedes implementar librerías propias muy fácilmente.

¿De dónde nace Cave's Man?

Después de mucho tiempo, me di cuenta que estaba programando todas las plataformas bajo una base, muy similar, que no solo era cómoda para mi desarrollo, si no que era muy eficiente gestionando la memoria. Por eso decidí limpiar esta base y montar algo estándar que de forma fácil cualquier programador pueda partir de esa base.

Así que aquí estoy. Presentando la primera versión de Cave's Man. Con mucha ilusión y esperando que sea útil para muchos. Y para quien quiera trastear y porque no, colaborar con el proyecto, adjunto el enlace del repositorio de GitHub.

Link: Cave's Man

Ante todo, gracias a todos por vuestro tiempo, y agradeceros cualquier sugerencia, crítica o comentario.

Un abrazo!

1
bornex

Acabo de permitirme la libertad de darme una vuelta por Cave's Man. ¿Del cero al diez? No da ni para práctica de primero de carrera (sin acritud y sin querer ofender). ¿Qué en qué me baso? Para empezar mala identación del código, ni te has molestado en seguir el PSR (cero estilo de código, naming, ni na de na), nulo uso de patrones de diseño de software, ¿dónde están tus decorators, facades y demás?

Creo que quedan muchas horas de trabajo para que eso sea útil para alguien. ¡Ánimo!

3 respuestas
soanix

#2 Agradezco el tiempo que te has tomado en leer el código y por los ánimos. Como bien digo es una alpha y quedan, efectivamente, muchísimas horas de desarrollo.

Ahora que dices Fecades, me recuerda que se idearon para Laravel 4, y aunque no me gusta mucho la idea de usar blade... Hay muchas cosas que me han gustado de Laravel 5. Por ejemplo la idea de que no tiene sentido alguno el MVC. Y que una app potente no puede meterse dentro de esas 3 letras,

Aprovecharé la ocasión para hacer caso a la evolución de este Framework, creo que es un paso adelante en el desarrollo de PHP.

Y una vez más. Gracias!

1 respuesta
eXtreM3

#3 fuente de que una app potente no puede meterse dentro de MVC?

1 respuesta
soanix

#4 Taylor Otwell, lleva insistiendo tiempo que MVC limita la potencia de una app.

Por ejemplo: https://twitter.com/taylorotwell/status/634388228020133888

soanix

#2 Igualmente, siéntete libre de colaborar en el proyecto. Seguramente podré aprender muchas cosas.

1 respuesta
Merkury

#6 Esto tiene mucho delito eh, sin acritud.

El no hacerlo compatible con 7.1 con las grandes mejoras que trae, es cortarte las alas.

Y una pregunta porque Mysql es un requisito?

Respecto a lo que dices de programador de verdad, una de las ventajas de usar frameworks (aunque esta desde luego viene con deuda tecnologica) es que si por ejemplo tienes la funcion Foo que te devuelve Bar en el codigo del framework, esta es testeada por la gran mayoria de usuarios del framework, con lo que si hay un bug o fallo de seguridad se detectan a toda ostia.

Voy a echarle un ojo a las tripas en si. Ire editando con mas comentarios.

Otra cosa, no as implementado ni siquiera autoloading... esto mas que un framework es mas bien un libreria eh.

Como haces el sistema de rutas?

Estaba pensando en colaborar, pero la verdad es que lo que he visto no me ha gustado. Es un buen curro el que te has pegado eso no lo niego, pero para que esto sea considerado un framework:

  • Necesitas aplicar como minimo PRS1/2/4
  • Necesitas un sistema de rutas.
  • Necesitas documentación y comentarios en el código. La verdad que esto ultimo, yo seria lo primero que haría, porque no hay ni uno XD
  • "El framework" en si no es testeable, ademas de que no hay ni un solo test (ni unitario ni de na)
  • La mayoria de las funciones no definen visibilidad

Este constructor es especialmente dañino:

function __construct(){
        $this->db = new db();
		$iso = isset($_GET['lang']) ? $_GET['lang'] : '';
		if($iso){
			$lang = $iso ? $this->getIdFromIso($iso) : false;
			if($lang)
				$_SESSION['lang'] = $lang;
		}elseif(!isset($_SESSION['lang'])){
			$iso = explode(";", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
			$iso = explode(",", $iso[0]);
			$lang = isset($iso[1]) ? $this->getIdFromIso($iso[1]) : false;
			if($lang)
				$_SESSION['lang'] = $lang;
			else
            	$_SESSION['lang'] = $this->getDefaultLanguage();
        }
		$iso = $this->get_iso($_SESSION['lang']);
		if(!$iso){
			$iso = $this->get_iso($this->getDefaultLanguage());
		}
		if($_SERVER['REQUEST_URI'] == _PATH_){
			header("Location: "._PATH_.$iso);
			exit();
		}
		$this->t = $this->get_translates();
		$this->iso = $iso;
		setlocale(LC_ALL, $this->iso.'_ES.utf8');
    }

Deberias hacerle un refactor.

3 respuestas
soanix

#7 pues si que tiene delito... En realidad debería ser al revés..... PHP >= 5.6. Vaya fail :regan:

Edit: Corregido, gracias!

1 respuesta
Merkury

#8 Ah menos mal!

soanix

#7 Si, es que los comentarios y la documentación es un tema que me tiene bastante ocupado. Eso y mejorar el naming como dice #2 que a pesar de que muchas classes las tengo comentadas y con el naming correcto, muchas otras no.

Y ante todo gracias por tus comentarios. Si te animas, bienvenido seas. Y si no, ya has colaborado mucho con tu comentario.

1 respuesta
Merkury

#10 Una pregunta, como haces el control y bubbling de excepciones? Que es algo que tengo que implementar yo en mi FW haha

1
soanix

#7 He añadido documentación en el README. Se que falta mucha, pero esta es esencial.

1 respuesta
Merkury

#12 Igual se te ha pasado mi pregunta, pero porque mysql es una dependencia del FW?

1 respuesta
soanix

#13 Requiere de un motor de base de datos. Como referencia MYSQL > 5.5, ya sea MariaDB o cualquier otra alternativa. A pesar que es compatible con MSSql ya que incorpora una librería para realizar consultas a SQL SERVER este requiere una instalación del driver de MSSQL para php y la última versión LTS de Ubuntu no da soporte de PHP a no ser que lo compiles tu. Que si, es posible, por eso lo he puesto y lo he usado en varias ocasiones.

https://github.com/soanix/cavesman/blob/master/trunk/classes/msdb.class.php

Por lo demás he creído que con poner MYSQL > 5.5 ya daba por supuesto que MariaDB, por ejemplo, también era compatible.

Posiblemente hay una descripción mas apropiada.

1 respuesta
Merkury

#14 me refiero que por que necesitas un motor de bases de datos para hacer funcionar el framework.

1 respuesta
soanix

#15 Porque este incluye un listado de idiomas y traducciones, usuarios. que son esenciales para gestionar el multi-idioma. Aunque, sinceramente, tu pregunta hace plantearme si esa puede ser una funcionalidad opcional, y que este pueda ser usado sin la necesidad de base de datos. Lo cual no estaría mal para usarse como API.

1 respuesta
yarviT0

es que yo por el vistazo general que veo parece más una especie de CMS basado en PHP que un framework

1 respuesta
soanix

#17 Aunque cada vez mas los frameworks se paracen más a un CMS. La idea de un CMS es no tener que programar. Que desde una GUI puedas gestionar todo el sitio sin picar una sola linea de código. Y la intención de un framework es que el programador no pierda tiempo en programar cosas que ya están hechas y funcionan. Y solo le quede personalizar o desarrollar su herramienta a su gusto en base a ese conjunto de herramientas ya programadas. E Insisto, es una opinión.

Lo normal es que un CMS use un framework, y este este desarrollado, muchas veces, por los mismos que han hecho el CMS.

Merkury

#16 el idioma almacenado en la base de datos es un poco meh eh, mi opinion.

1 respuesta
Stricken

Enhorabuena por el curro y por echarle huevos y subirlo a Github :).

No te diré nada que no te hayan dicho ya:

  • Autoloader
  • PSR
  • Tests
  • Documentación

Ahora mismo no podría encontrar ninguna razón de peso para utilizar Cave's Man frente a Slim, por ejemplo.

Si quieres, prueba a compartir el enlace en https://www.reddit.com/r/PHP/, más de uno se te tirará al cuello pero suelen dar buen feedback.

Echa un ojo a:

https://refactoring.guru/
https://sourcemaking.com/

Ánimo :)

2 1 respuesta
soanix

#19 De ahí que me plantee sacarlo de base de datos y que no dependan de ella. Igualmente, creo que va bastante mejor por base de datos. Una consulta va mas rápida que leer un archivo. Pero obviamente no es estándar.

2 respuestas
RaymaN

#21 usa gettext que es el método oficial para traducciones, además usa archivos que luego puedes reutilizar en cualquier otro lenguaje y es infinitamente más rápido que usar mysql.

2
Merkury

#21 Eso es discutible, mas que leer un archivo los puedes tener cargados en memoria. Me refiero para los locales (en|fr|etc) .

Luego las traducciones las puedes tener en YAML, JSON, PHP files y no son mas lentas que una consulta.

1 respuesta
soanix

#23 Es la eterna discusión. No voy a entrar para la diferencia real que hay. Al final hay que seguir el estándar. Y gettext no me parece mala opción. Trabajaré en ello. No parece difícil.

soanix

#20 Gracias por tus ánimos. La verdad es que si todo se sacase funcionando al 100% sería increíble... pero para eso existen las aphas. Y por eso lo he publicado. Porque 4 ojos ven mejor que 2. Y 2 cerebros piensan mejor que 1.

Trabajaré para que haya en un futuro una RC con más razones de peso.

Gracias!

1 respuesta
Merkury

#25 Piensa que las traducciones han de ser un array associativo para poder sacarlas en condiciones :)

Que conste que todos comentarios te los hago de buena fe eh

1 respuesta
soanix

#26 Actualmente uso las tradcciones en php:

$this->l("Texto a traducir"); // Devuelve texto traducido

También se pueden bindear contenido dinámico como fechas o números. Por ejemplo:

$this->l("Texto a traducir con fecha #fecha", array("#fecha" => date(time())));

En smarty :

{l s="Texto a traducir" s} 

Esta es la función:

      function l($string, $binds = array()){
		$string = str_replace("  ", " ", preg_replace('/\s+/', ' ', $string));
		if(!isset($this->t[$string])){
			$this->translate_add($string);
			$binded = $string;
			foreach($binds as $key => $value){
				$binded = str_replace($key, $value, $binded);
			}
			$this->t[$string] = $binded;
		} else {
			$binded = $this->t[$string];
			foreach($binds as $key => $value){
				$binded = str_replace($key, $value, $binded);
			}
		}
		return nl2br($binded);
	}
B

Yo el problema que le veo es que te has lanzado a sacar un producto con una carencia bastante alta de base de conocimientos. Eso como base para automatizar tus desarrollos te puede ir bien a ti, pero para el público general le va a generar más problemas que beneficios. Me gustaría dar una crítica constructiva pero es que no llega ni a un mínimo de estándar de desarrollo, ni patrones de diseño ni un concepto claro de desarrollo. Lo mejor que puedes hacer es con las críticas, empezar una refactorización del framework y de paso reforzar tu base en gran medida. Tu caso es muy común, por muchos años que se tenga desarrollando en PHP, sin un concepto y una base clara desarrollar una arquitectura de 0 se puede convertir en un caos.

2 años después
soanix

Por si alguien aterriza en este hilo y aunque tiene 2 años, dejo por aquí información actualizada del progreso de desarrollo (actual 0.1.x).

Después de todas las críticas y consejos realizadas por la comunidad he realizado un refactory de todo el framework con las siguientes mejors:

  • Implementado Doctrine como ORM
  • Incorporado a Packagits
  • No requiere base de datos
  • PSR / Autoloader
  • Traducciones en sistema de archivos (PHP) [Requiere modulo], si no son necesarias no se carga y no recarga el sistema.

Pendientes:

  • Test
  • Documentación (En progreso)

Todos los progresos en: soanix/Cavesman

Usuarios habituales

  • soanix
  • Merkury
  • RaymaN
  • Stricken
  • yarviT0
  • eXtreM3
  • bornex