Mantener tu código organizado facilita enormemente el mantenimiento y la escalabilidad de tus aplicaciones PHP. Una manera importante de hacerlo es aislar completamente la lógica de autenticación del resto del controlador, permitiendo que este se enfoque exclusivamente en la validación y redirección. Así logras un código limpio, claro y profesional.
¿Por qué aislar la lógica de autenticación?
Separar responsabilidades en tu código es fundamental. Al colocar toda la lógica asociada al inicio y cierre de sesión en una clase independiente, lograrás:
Facilitar la comprensión del código.
Simplificar tareas futuras como modificaciones o integración de nuevos sistemas de autenticación.
Mantener controladores claros y concisos, enfocados solo en su tarea principal.
¿Cómo implementar clases separadas en PHP?
Para separar la lógica de autenticación, sigue estos pasos:
Crea una clase específica:
En tu proyecto crea una nueva clase destinada exclusivamente al manejo de autenticaciones:
namespaceframework;classAutenticacion{publicfunctioninicioSesion(string$email,string$password):bool{// Lógica para verificar usuario y contraseñaif(/* validación exitosa */){returntrue;}returnfalse;}publicfunctioncierreSesion():void{// Lógica para cerrar sesión}}
Usa la clase en el controlador:
El controlador se limitará a verificar credenciales, orquestar respuestas y manejar redirecciones claramente definidas.
$auth=newAutenticacion();if($auth->inicioSesion($email,$password)){// Redirige si inicio es exitosoredirecciona('/inicio');}else{// Retorna vista errores si fallavista('errores');}
¿Qué beneficios aporta esta refactorización?
Al trasladar el código de autenticación a una clase especializada, notarás beneficios como:
Controladores con funciones bien definidas, facilitando futuras adaptaciones.
Código más sencillo de mantener y actualizar.
Mayor claridad en la lógica general del proyecto, beneficiando tanto a nuevos desarrolladores como al equipo actual.
Esta simple técnica de refactorización refuerza la calidad y el profesionalismo de tus desarrollos en PHP, volviendo tu base de código más amigable y manejable.
<?php
namespace frmwrk;use frmwrk\db;classAuthenticate{publicstaticfunctionisAuthenticated(): bool {session_start();returnisset($_SESSION['user_id']);}publicstaticfunctionrequireAuth():void{if(!self::isAuthenticated()){header('Location: /login'); exit;}}publicfunctionlogin(string $email, string $password): bool { $db =newdb(); $user = $db->query("SELECT * FROM users WHERE email = :email",['email'=> $email,])->first();if($user &&password_verify($_POST['password'], $user['password'])){// If authentication is successful, set user session and redirect $_SESSION['user']=['uid'=> $user['uid'],'name'=> $user['name'],'email'=> $user['email'],'password'=> $user['password'],];returntrue;}returnfalse;}publicfunctionlogout(){// Logic for logging out the userunset($_SESSION['user']);session_destroy();}}
AuthController in ./app/Controllers;
<?php
namespace app\Controllers;use frmwrk\Authenticate;use frmwrk\db;use frmwrk\validator;classAuthController{publicfunctionlogin(){// Logic for displaying the login formview('login');}publicfunctionauthenticate(){ $validator =newvalidator($_POST,['email'=>'required|email','password'=>'required|min:6',]);if($validator->fails()){ $errors = $validator->errors();// Handle validation errors (e.g., redirect back with errors)view('login',['errors'=> $errors]);return;} $db =newdb();if( $validator->wentThrough()){ $login =(newAuthenticate())->login( $_POST['email'], $_POST['password']);if($login){// Authentication successfulredirect('/');}else{// Authentication failedview('login',['error'=> $validator->errors()]);return;}redirect('/login');}}publicfunctionlogout(){// Logic for logging out the user(newAuthenticate())->logout();redirect('/login');}}
Yo nunca hice el helper de db() porque no me gusto esa parte , asi que sigo trabajando con use <code>frmwrk\db; </code>
Asi el funciona bien:
127.0.0.1:54978 [200]: GET /login
127.0.0.1:54978 Closing
127.0.0.1:54986 Accepted
127.0.0.1:54994 Accepted
127.0.0.1:54986 [200]: POST /login
127.0.0.1:54986 Closing
127.0.0.1:39062 Accepted
127.0.0.1:54994 [200]: POST /login
127.0.0.1:54994 Closing
[Mon Sep 8 09:10:54 2025] 127.0.0.1:39062 [302]: POST /login