Mi experiencia con CakePHP

Mi experiencia con CakePHP

¿Qué es CakePHP? Características.

Una de las herramientas que usamos a diario para satisfacer las necesidades de nuestros clientes es CakePHP, a la que cariñosamente apodamos “Cake”.

Cake no es más que un framework para el ya conocido lenguaje PHP, pero tiene varias características que nos resultaron bastante atractivas, por ejemplo:

  • Es completamente Open Source, de modo que se encuentra en constante avance y evolución gracias a la comunidad.
  • Está basado en una arquitectura MVC. Esto garantiza que la lógica de nuestras soluciones estará naturalmente separada de los datos y las capas de presentación. Lo que redunda en mayor adaptabilidad ante cambios en las necesidades del cliente.
  • Maneja convenciones para muchísimas cuestiones, sobre todo en nomenclatura. Esto nos hace el trabajo bastante más liviano a los desarrolladores (siempre y cuando decidamos respetarlas).

 

Caso de estudio

El caso de estudio de este artículo es un proyecto interno para la empresa. El equipo detectó que la mayoría de los clientes generalmente nos encarga aplicaciones para dispositivos móviles. Y que en cada proyecto se pierde mucho tiempo creando el backend de la aplicación en cuestión, cuando en definitiva las variaciones que sufre ese apartado entre proyectos son menores.

Es así como nos decidimos a embarcarnos en el proyecto de crear un backend propio, que pudiéramos reutilizar y adaptar rápidamente en cada ocasión a las necesidades del producto que estemos desarrollando.

Con el fin de no extender este artículo indefinidamente, solamente voy a relatar cómo pude construir rápidamente un ABM que maneje usuarios para nuestra aplicación.

Personalmente, esta fue mi primera vez trabajando con cuestiones como el patrón MVC, o con un ORM (componente del framework que funciona como nexo entre las bases de datos y el modelo de objetos).

Para empezar, hace falta definir el modelo de la aplicación. Para esto definí una base de datos denominada users, siguiendo las convenciones que maneja CakePHP. El paso siguiente es crear la entidad User, y la clase UsersTable para que el ORM pueda realizar acciones como asignar masivamente todos los campos, o aplicarle alguna función hash a las contraseñas de los usuarios.

Una vez definido el modelo, el paso siguiente es implementar el controlador. Esta es la parte de la aplicación que oficia de intermediaria entre el modelo y las vistas, traduciendo las peticiones del usuario en acciones concretas de la aplicación.

En primera instancia definimos la clase UsersController (como mandan las convenciones del framework) y adentro definimos los métodos que nos permiten realizar las respectivas altas, bajas y modificaciones. Cabe aclarar que como estamos hablando de una clase controlador, los métodos se denominan acciones. Por ejemplo:

<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\Event;
use Cake\ORM\TableRegistry;
class UsersController extends AppController{
 
 
public function add()
    {
        $this->viewBuilder()->setLayout('admin');
        $titulo = "Agregar usuario";
        $this->set(compact('titulo'));
        $user = $this->Users->newEntity();
        if ($this->request->is('post')) {
        $user = $this->Users->patchEntity($user, $this->request->data );
        if ($this->Users->save($user)) {
                $this->Flash->success(__('Usuario agregado exitosamente!'));
                return $this->redirect(['action' => 'index']);
            }
            else{
                $this->Flash->error(__('No se pudo crear el usuario'));
            }
            
        }
    }

public function index()
    {
        $this->viewBuilder()->setLayout('admin');
        $results = $this->Users->find();
        $titulo = "Listado de usuarios";
        // $this->paginate = ['limit'=>1];
        $this->set(compact('titulo'));
        $this->set('results', $this->paginate($results));
    }

public function delete($id)
    {
        $this->request->allowMethod(['post','delete']);
         $users = $this->Users->get($id);
         $this->Users->delete($users);
         return $this->redirect(['action'=>'index']);
    }

public function edit($id)
    {
        $this->viewBuilder()->setLayout('admin');
        $user = $this->Users->get($id);
        $titulo = "Editar usuario";
        $this->set(compact('titulo'));
        if($this->request->is(['post', 'put']))
        {
            $user = $this->Users->patchEntity($user, $this->request->data);
            if($this->Users->save($user))
            {
                return $this->redirect(['action' => 'index']);
            }
            else
            {
                echo "Error";
            } 
        } 
         
        $this->set('user',$user);
    }
}
?>

Finalmente, queda pendiente la implementación de las vistas para cada acción del controlador. Una práctica que seguimos en general, es primero construir lo que se llama un layout para la vista, que no es más que un esqueleto al que después la vista le proporcionará el contenido que finalmente verá el usuario. A modo de ejemplo,esta sería la vista para la acción add:

<div class="section section-custom billinfo">
<h2>Agregar Usuario</h2>
 
 <div class="pmd-card pmd-z-depth">
  <div class="pmd-card-body"> 
   <?php echo $this->Form->create(null, ['class'=>'form-horizontal']); ?>
    <div class="form-group pmd-textfield">
     <label for="inputEmail3" class="col-sm-2 control-label">Email</label>
     <div class="col-sm-10">
      <?php echo $this->Form->input('email',['class'=>'form-control input-sm','placeholder'=>'Email','type'=>'email','label'=>false]); ?>
      <span class="pmd-textfield-focused"></span>
     </div>
    </div>
<div class="form-group pmd-textfield">
     <label for="inputEmail3" class="col-sm-2 control-label">Nombre</label>
     <div class="col-sm-10">
      <?php echo $this->Form->input('nombre',['class'=>'form-control input-sm','placeholder'=>'Nombre','type'=>'text','label'=>false]); ?>
      <span class="pmd-textfield-focused"></span>
     </div>
    </div>
<div class="form-group pmd-textfield">
     <label for="inputEmail3" class="col-sm-2 control-label">Password</label>
     <div class="col-sm-10">
      <?= $this->Form->input('password',['type'=>'text','class'=>'form-control input-sm','placeholder'=>'Password','label'=>false])?>
      <span class="pmd-textfield-focused"></span>
     </div>
    </div>
<div class="form-group">
     <div class="col-sm-offset-2 col-sm-10">
      <?php echo $this->Form->button('Registrar usuario',['class'=>'btn btn-primary pmd-checkbox-ripple-effect','type'=>'submit','controller'=>'Users','action'=>'add']); ?>
</div>
    </div>
   <?php echo $this->Form->end(); ?>
  </div>
 </div>
</div>

Para este caso,elegimos implementar un template gratuito llamado Propeller, del que tomamos los estilos y le fuimos embebiendo la funcionalidad en PHP.

Como conclusión, CakePHP es un framework bastante amigable que si bien es exigente con sus convenciones, a la larga facilita el trabajo de los desarrolladores (como todo framework que se precie debería hacer). Quien les escribe comenzó a trabajar en Syloper hace exactamente treinta días, y si bien el principio fue un poco difícil, con el correr de los días pude acostumbrarme a la forma de trabajar.

¡Espero ansioso asumir nuevos proyectos utilizando esta herramienta!

 


Somos Syloper, una empresa de desarrollo de software con base en Rosario, Argentina y con proyección hacia toda Latinoamérica.

> Si te interesa lo que hacemos y necesitás nuestra ayuda, comunicate con nosotros.