Introduciendonos a la Programacion Orientada a Aspectos en PHP

Iniciado por Destructor.cs, Agosto 10, 2013, 03:40:55 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Agosto 10, 2013, 03:40:55 PM Ultima modificación: Agosto 14, 2013, 03:10:05 PM por Destructor.php
Cualquiera que ande dando vueltas por internet e investigando habrá escuchado alguna que otra vez algo llamado Progrmacion Orientada a Aspectos y en su intento por aprender de que se tratara tendría como resultado dolor de cabeza, ya que la documentación que hay sobre el tema es muy poco entendible! (y mas para gente de mi edad)

Aún asi, yo he seguido investigando y he encontrado un gran tutorial para iniciarse, el cual estaba en ingles y hoy me he decidido a compartirlo con la comunidad, dandome la molestia de traducirlo para ustedes

Espero que sea de gran ayuda para todos:

Introduccion:

AOP (Programacion orientada a aspectos en ingles) es una extención de PECL que nos da la posibilidad de usar Programación Orientada a Aspectos en PHP, sin la necesidad de compilar o realizar algun otro paso intermedio antes de publicar tu código.

La extención AOP esta diseñada para ser la manera mas facil en la que podemos pensar a la hora de incluir Programacion Orientada a Aspectos en PHP

La POA tiene como objetivo permitir la separacion de funcionalidades transversales (caché, logs, seguridad, memoria, etc)


Tutorial basico:

Mira la siguiente clase:

Código: php
<?php
    class MyServices
    {
       public function doAdminStuff1 ()
       {
          //some stuff only the admin should do
          echo "Calling doAdminStuff1";
       }

       public function doAdminStuff2 ()
       {
          //some stuff only the admin should do
          echo "Calling doAdminStuff2";
       }
    }
?>


Ahora quieres que tu código sea seguro, solo quieres que los administradores puedan llamar a los metodos doAdmin.

¿Qué soluciones existen?
-Añadir algo de codigo para chequear credenciales dentro de tu clase. Lo malo es que va a ensuciar tu código y tu servicio se va a volver menos legible
-Deja la responsabilidad de chequear las credenciales a los usuarios cuando se requiera. El punto negativo es que vas duplicar tu código del lado del cliente si tienes que llamar al servicio de diferentes lugares
-Agrega una especie de proxy el cual chequearía las credenciales antes de llamar al servicio actual. El lado negativo es que tendrías que escribir código extra, agregando otra clase en la parte superior del servicio!

Mas aún, estas soluciones suelen incrementar su complejidad a medida que agregas mas funcionalidades tranversales!

Aquí es donde la POA entra en juego dandote la posiblidad de decirle a PHP que haga algunas acciones extras a la vez que llama a los metodos de nuestro servicio

Primero escribiremos el código el cual verificará si somos capaces de llamar al servicio del administrador
Código: php
<?php
    function adviceForDoAdmin ()
    {
       if ((! isset($_SESSION['user_type'])) || ($_SESSION['user_type'] !== 'admin')) {
          throw new Exception('Sorry, you should be an admin to do this');
       }
    }
<?

El código es simple, verifica si hay algo que nos diga si el usuario que esta intentando acceder al servicio es un administrador! Seguramente a la hora de verifcar usted haga uso de un código mas complejo, aún asi, este sirve para esta pequeña demostración!

Ahora simplemente usaremos la extención para que ejecute este código antes de intentar ejecutar cualquier método de nuestro servicio
Código: php
<?php
    aop_add_before('MyServices->doAdmin*()', 'adviceForDoAdmin');
?>


Ahora cada vez que intentemos ejecutar un método de nuestro servicio, AOP hará que se ejecute la funcion para verificar si en verdad es un administrador!

¿No es realmente simple?
Ahora probemos nuestro servicio:

Código: php
<?php
    //session is started and we added the above examples to configure MyServices & basicAdminChecker

    $services = new MyServices();
    try {
       $services->doAdminStuff1();//will raise an exception as nothing in the current session tells us we are an admin
    } catch (Exception $e) {
       echo "You cannot access the service, you're not an admin";
    }

    $_SESSION['user_type'] = 'admin';//again, this is ugly for the sake of the example

    try {
       $service->doAdminStuff1();
       $service->doAdminStuff2();
    } catch (Exception $e) {
       //nothing will be caught here, we are an admin
    }
?>


Extraido y traducido de: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Para mayor información: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Cada vez que me das Karma me motivas


en mi opinión, me parece muy poco práctico, y no veo ninguna razón para utilizarlo, quizá tenga que ver los detalles, pero debería aparecer de entrada los motivos por los cuales alguien debería usar esto, las ventajas y las que nunca deberían faltar deventajas.

pero bueno, es bueno saber que existe y se agradece el tiempo que te haz tomado en traducirlo y publicarlo.

por cierto tienes un pequeño error que da a confusión:

CitarAOP (Programacion orientada a objetos en ingles) es una extención de PECL que nos da la posibilidad de usar Programación Orientada a Aspectos en PHP, sin la necesidad de compilar o realizar algun otro paso intermedio antes de publicar tu código.

es programación orientada a objetos la sigla, o programación orientada a aspectos? no queda muy claro el parentesis.

un saludo!

Ahí ya arrele, fue solo una confusión!
Sobre si es bueno o no, seguramente se aprecie mas en aplicaciones mas complejas, aún asi, he leido muchos artículos que han "alagado" este nuevo paradigma y por eso lo he publicado!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Ahí ya arrele, fue solo una confusión!
Sobre si es bueno o no, seguramente se aprecie mas en aplicaciones mas complejas, aún asi, he leido muchos artículos que han "alagado" este nuevo paradigma y por eso lo he publicado!

como dije, se agradece que te tomes el trabajo de venir a comentarnos a todos que esto existe y como funciona, la verdad es que no lo había visto nunca.

si, veremos que pasa.

saludos!