amazing79 / simplex
Implementacion del framework mediante el tutorial de symfony mas un bonus
Installs: 2
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:project
pkg:composer/amazing79/simplex
Requires
- php: >=8.1
 - php-di/php-di: ^7.1
 - symfony/event-dispatcher: ^7.3
 - symfony/http-foundation: ^7.3
 - symfony/http-kernel: ^7.3
 - symfony/routing: ^7.3
 - vlucas/phpdotenv: ^5.6
 
Requires (Dev)
- phpunit/phpunit: ^11.0
 
README
Proyecto base en PHP con estructura mínima de carpetas (app, src, config, public, test ), pensado para iniciarlo rápido con Composer.
🚀 Instalación
Podés crear un nuevo proyecto a partir de este template con:
composer create-project amazing79/simplex [nombre_proyecto]
Idea
La idea fue replicar el tutorial Create your own Framework de Symfony. Con esta base, se propuso ajustar el framework para actualizar pequeñas aplicaciones que teniamos en php plano y mejorarlas sin la necesidad de requerir a frameworks gigantescos como laravel o láminas.
Segun el tutorial, tenemos dos puntos importantes:
- Un framework funcional con poco codigo
 - Un Framework funcional pero que termina siendo un wrapper de la clase HttpKernel de Symfony
 
Se optó por continuar el desarrollo desde el primer punto pero agregando algunas funcionalidades más:
- Se agregó libreria para soporte de archivos .env phpdotenv
 - Se agregó soporte de Inyectores de dependencias PHP-DI
 - Cambiar el punto de acceso de la App de /web/front.php a /public/index.php.
 - Como chiche, se incluyo un archivo ".htaccess_example" para reescribir las rutas de la app y cambiar el index.php/url por /url. Esto es opcional.
 - El framework consta con test propios para validar que funcione ante eventuales cambios.
 - Además, agregamos algunos scripts dentro de la configuracion de composer.
 
Para empezar a programar
Si querés empezar a programar, acordate de configurar lo siguiente (siempre y cuando lo necesites):
- Modelos
 - Base de datos
 - Otras configuraciones necesarias
 
Esto después lo agregas en los injectores de dependencias (dentro de config, hay algunos ejemplos) y ¡¡guala!!. Recordá agregar estas configuraciones desde tu punto de acceso a la app, es decir public/index.php.
Personalización
Recordá que este framework es personalizable, por lo cual si querés agregarle cosas al framework, hazlo a tu gusto. Podrás encontrar el código dentro del directorio src/. Todo lo demás, colocalo dentro de app/.
El funcionamiento es similar a otros frameworks. Aunque en el tutorial se seguía un enfoque orientado a Response/Request, se lo llevo a un enfoque MVC. Para entender un poco como funciona, se agregó un controller (IndexController) como también algunas plantillas de ejemplo (welcome, layout y error). Estas editar a gusto.
Nota Para entender mejor el funcionamiento de los objetos Response y Request, ver la documentación de Symfony
Además, dentro de los scripts podemos:
Probar la app de bienvenida
composer start
Correr los tests del framework
composer tests
Modo de trabajo
Se incluyo un ejemplo de una página index con su controlador, a modo de entender un poco el funcionamiento. En corto:
- Configurar las dependencias según necesitemos (modelos, nuevos eventos, etc.).
 - Reemplazar template de IndexController (welcome) y usar uno propio (también podemos editarlo, como prefieras).
 - La metodologia es el patron MVC. Seguir este enfoque, y guardar los scripts en sus respectivas carpetas según su proposito.
 - Los tests actualmente están funcionando, pero solo verifican el funcionamiento del framework desde el punto base. Modificaciones al framework por parte de uno podria incluir modificar los tests.
 - Se modificó parte del codigo del tutorial para trabajar con Inyectores de dependencias y asi ser más flexible la configuracion del framework.
 - Se provee un layout de ejemplo para ver como simplificar el codigo de nuestras vistas. Por lo tanto, para renderizar html contaremos con
dos estrategias (HtmlRender y HtmlLayoutRender).
- En el primero podremos incluir en la plantilla todo el html del documento.
 - En el segundo, las vistas solo necesitan contener html de la página a renderizar, esta luego se incorpora al layout mediante su propiedad {{content}}. Para acceder al mismo, podemos ingresar en la siguiente ruta: [ruta_principal/layout]. Ejemplo: http://localhost/layout. Para personalizar el layout, ir a la carpeta Views/layout/
 
 - Se agregó api para manejo de sesiones. Para mayor compatibilidad, se creó usando las interfaces nativas de php. Además, se agregó un controller base para extender en aquellos controladores que necesiten acceder a la session (este controller base emplea un trait)
 
Para marcar un punto personal desde donde empezamos a usarlo como framework, largamos la release de la version v2.0.0. Con esta version procedimos a actualizar un par de apps. Nuevamente, este framework tiene objetivo facilitarnos la actualización de sistemas viejos hechos con php plano.
Para desarrollar apps más complejas, usar otros frameworks.
Agregados importantes
- Se agregó soporte de sesiones. Se crearon clases implementando interfaces nativas para tal fin.
 - Las sesiones se pueden almacenar en el directorio temporal (por default), o configurarla guardar las mismas dentro de storage/sessions (usar valor en archivo .env). Además, dentro de storage/app podremos almacenar otra info que veamos necesaria. Usar a conveniencia.
 - Se agregó controlador base de sesiones para ser extendido por aquellos controladores que lo necesiten.
 - Se agregaron nuevos eventos para escuchar por listener. Estos son Request, exception, y not_authorized.
 - Con los eventos y las sesiones, se pueden crear listener para proteger accesos no autorizados, entre otras cosas.
 - Se reestructuró organización de controladores, para tener más sentido. Ahora se proveen 2 controladores extensibles.
 - Se agregó nuevo controller para facilitar la modificación del controlador principal sin que esto afecte a los tests.
 
Clase Handler para el manejo de sesiones en archivos
Clase SessionManager para acceder facilmente a la sesion en formato orientado a objetos.
Trait para reutilizar la clase SessionManager en otras clases o controladores.
🧠 Autor
Ignacio Jauregui — GitHub