Framework PHP moderno y ligero con arquitectura MVC
Todo lo que necesitas para construir aplicaciones web modernas
Separación clara entre Modelos, Vistas y Controladores. Enrutamiento flexible (GET, POST) y sistema de formularios seguro.
Comandos integrados para iniciar servidor de desarrollo y generar controladores automáticamente.
PDO con conexiones persistentes, migraciones y esquemas SQL, índices automáticos y soporte completo UTF-8.
Integración con Tailwind CSS, componentes responsivos y diseño moderno y profesional.
Prepared statements con PDO, protección contra XSS, validación de entrada y pruebas de pentesting superadas.
Soporte para archivos .env, configuración centralizada y variables de entorno fáciles de gestionar.
Desarrolla rápidamente con una sintaxis clara y expresiva
// Ejemplo de controlador simple y potente
class ProductController extends Controller
{
public function index(Request $request)
{
$productModel = new Product();
$products = $productModel->all();
return $this->view('products/index', [
'products' => $products
]);
}
public function store(Request $request)
{
$productModel = new Product();
$data = $request->post();
if ($productModel->create($data)) {
$request->setFlash('success', '¡Producto creado!');
}
return $this->redirect('/products');
}
}
CRUD automático con consultas personalizadas
namespace App\Models;
use Framework\Core\Model;
class Product extends Model
{
protected $table = 'products';
// Obtener productos por categoría
public function getByCategory($categoryId)
{
return $this->where('category_id = ?', [$categoryId]);
}
// Buscar productos por nombre
public function search($query)
{
return $this->where('name LIKE ?', ["%$query%"]);
}
// Productos con stock bajo
public function lowStock($threshold = 10)
{
return $this->where('stock < ?', [$threshold]);
}
}
Protege tus rutas con middlewares personalizados
namespace App\Middlewares;
class AuthMiddleware implements Middleware
{
public function handle(Request $request, callable $next)
{
if (!$request->session()->get('user_id')) {
$request->setFlash('error', 'Debes iniciar sesión');
return new Response('', 302, ['Location' => '/']);
}
return $next($request);
}
}
// Uso en controlador
class ProductsController extends Controller
{
public function __construct()
{
$this->middleware(AuthMiddleware::class);
}
}
Define tus rutas de forma clara y organizada
return [
'GET' => [
// Páginas principales
'/' => 'HomeController@index',
'/login' => 'LoginController@index',
// Productos
'/productos' => 'ProductosController@index',
'/productos/crear' => 'ProductosController@create',
'/productos/{id}' => 'ProductosController@show',
// Categorías
'/categorias' => 'CategoriasController@index',
// Ventas y Reportes
'/ventas' => 'VentasController@index',
'/ventas/reportes' => 'VentasController@reportes',
],
'POST' => [
// Autenticación
'/login' => 'LoginController@authenticate',
'/logout' => 'LoginController@logout',
// CRUD Productos
'/productos/store' => 'ProductosController@store',
'/productos/update' => 'ProductosController@update',
'/productos/delete/{id}' => 'ProductosController@destroy',
// Ventas en lote
'/ventas/store-lote' => 'VentasController@store_lote',
]
];
Vínculo entre controlador, vista y componentes de notificación
public function buscarDni($request) {
$dni = $request->post('dni');
$client = new HttpClient(['baseURL' => 'https://api.perudevs.com/api/v1']);
try {
$response = $client->get('dni/complete', ['params' => ['document' => $dni, 'key' => $this->apiToken]]);
$resData = $response->json();
if ($resData['estado']) {
$request->setFlash('success', "DNI encontrado con éxito");
return $this->view('api/index', ['resultado' => $resData['resultado']]);
}
$request->setFlash('error', "No se encontró el documento");
} catch (Exception $e) {
$request->setFlash('error', $e->getMessage());
}
return $this->view('api/index');
}
<!-- 1. Gestión de Alertas Flash -->
<?php
$errorMsg = $request->getFlash('error');
$successMsg = $request->getFlash('success');
?>
<?php if ($errorMsg): ?>
<?php component('Alert', ['type' => 'error', 'message' => $errorMsg]); ?>
<?php endif; ?>
<?php if ($successMsg): ?>
<?php component('Alert', ['type' => 'success', 'message' => $successMsg]); ?>
<?php endif; ?>
<!-- 2. Formulario de Consulta -->
<form method="POST" action="/api/buscar">
<input type="text" name="dni" maxlength="8" required>
<button type="submit">Consultar</button>
</form>
Templates modernos con Tailwind CSS integrado
<div class="container mx-auto px-4 py-8">
<h1 class="text-3xl font-bold mb-6">Productos</h1>
<!-- Mensajes Flash -->
<?php if ($request->hasFlash('success')): ?>
<div class="bg-green-100 border-green-400 px-4 py-3 rounded">
<?php echo $request->getFlash('success'); ?>
</div>
<?php endif; ?>
<!-- Grid de Productos -->
<div class="grid md:grid-cols-3 gap-6">
<?php foreach ($products as $product): ?>
<div class="bg-white rounded-lg shadow-lg p-6">
<h2 class="text-xl font-bold">
<?php echo htmlspecialchars($product['name']); ?>
</h2>
<p class="text-2xl text-green-600">
$<?php echo number_format($product['price'], 2); ?>
</p>
</div>
<?php endforeach; ?>
</div>
</div>
Acceso directo a la base de datos cuando lo necesites
use Framework\Core\Database;
public function reportes(Request $request)
{
$db = Database::getInstance();
$inicio = $request->get('fecha_inicio');
$fin = $request->get('fecha_fin');
// Consulta personalizada con JOIN
$ventas = $db->fetchAll("
SELECT v.*, p.name, p.price, c.name as categoria
FROM ventas v
JOIN productos p ON v.producto_id = p.id
JOIN categorias c ON p.categoria_id = c.id
WHERE v.fecha BETWEEN ? AND ?
ORDER BY v.fecha DESC
", [$inicio, $fin]);
// Stored Procedure para resumen
$resumen = $db->call('sp_resumen_ventas', [$inicio, $fin]);
return $this->view('ventas/reportes', [
'ventas' => $ventas,
'resumen' => $resumen->fetch()
]);
}
Genera código rápidamente desde la terminal
# Iniciar servidor de desarrollo en localhost:8000
$ php oly serve
# Ver mapa completo de rutas y controladores
$ php oly route:list
# Generar CRUD completo (Modelo, Controlador, Vistas y Rutas)
$ php oly make:crud Product productos
# Crear solo un modelo vinculado a una tabla
$ php oly make:model User usuarios
# Crear un middleware de seguridad (Onion Pattern)
$ php oly make:middleware Auth
# Inicializar estructura de un nuevo proyecto
$ php oly init
Aplicaciones reales construidas con el poder de Olyxis
Empieza a desarrollar en menos de 5 minutos
Descarga el framework desde GitHub
Configura la estructura de carpetas (opcional para nuevos proyectos)
Una vez inicializado el proyecto, el comando init ya habrá copiado todo lo
necesario a tu directorio actual. Puedes borrar la carpeta temporal olyxis para
mantener tu espacio de trabajo limpio.
Crea tu archivo .env con las credenciales
Levanta el servidor de desarrollo
Guías detalladas para cada componente del framework
Potentes herramientas de generación y gestión:
php oly serve - Iniciar servidor de desarrollophp oly route:list - Mapa completo de rutasphp oly make:crud - Generar módulo completophp oly make:model - Crear modelo de datosphp oly make:controller - Crear controladorphp oly make:middleware - Capa de seguridad (Onion)php oly help para ver todos los detalles.