Moteur d'aspect pour php

Soyez le premier à donner votre avis sur cette source.

Vue 7 013 fois - Téléchargée 372 fois

Description

Salut à tous,

Ça fait pas mal de temps que je ne suis pas venu sur PHPCS, et ce pour la raison suivante : le Java. Depuis l'année dernière, j'ai passé pas mal de temps à étudier le Java et le J(2)EE. Du coup, je n'ai pas eu beaucoup de temps à consacrer au PHP.

Mon petit voyage dans l'univers du Java m'a donné pas mal d'idée applicable au PHP. La présente source en est un exemple : un moteur d'aspect (je ne sais pas si le terme est vraiment juste ...).

Je ne compte pas faire de cours sur l'AOP, Wikipedia est là pour ça : http://fr.wikipedia.org/wiki/AOP.

Il faut savoir qu'il existe quelques librairies pour faire de l'AOP avec PHP, mais elles ont l'inconvénient de modifier les sources, ce que je ne voulais pas.

Du coup, j'utilise un objet proxy qui utilise lui-même la méthode magique __call() pour analyser les appels de méthodes et appliquer les aspects qui vont bien.

Source / Exemple :


La capture parle d'elle-même ! J'ai mis un petit exemple fonctionnel avec un aspect persistence.xml qui permet de sauvegarder, récupérer et mettre à jour en base de données les instances de la classe Person, de manière complètement transparente pour l'utilisateur. 

Je ne suis pas sur que ce soit une très bonne manière d'utiliser l'AOP, mais il a le mérite d'être un exemple très parlant.

Conclusion :


Ma source n'est qu'une ébauche ou plutôt un proof-of-concept. Mais je suis ouvert à tous les commentaires afin de faire évoluer cette source !

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

LocalStone
Messages postés
515
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009
-
Lache tes coms! ^^ lol
coucou747
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
26 -
OMG

c'est tres interessant.

t'as pas eu du mal a revennir vers php apres avoir fait du java ?

apres avoir fait du java, je lance kate pour faire du php, je tape $this-> et controle space, et j'attends betement que kate me liste les methodes de l'objet courrant, chose qu'il ne sait evidement pas faire :(

c'est une belle utilisation de la reflection, meme si je doute que ca soit tres utile en pratique.
aKheNathOn
Messages postés
285
Date d'inscription
dimanche 22 juillet 2001
Statut
Modérateur
Dernière intervention
5 décembre 2013
-
C'est franchement génial !

L'exemple partant sur de l'ORM est sympa même si c'est pas l'utilisation la plus optimisée, mais on y voit bien le principe.

En terme de POA je part du principe que l'aspect est persistance.xml et que le joinpoint est aspect.php.

Petite question : étant donné que le principe est de cloisonner la logique métier en enlevant les contraintes inter-modulaires reposant sur par exemple sur des modules techniques tels que du log ou bien du requettage, dans ton point-cut pk et comment tu utilises une base de données (c'est créer des dépendances non ?) ?

Autre question, ton advice, on dirais qu'il ne gère que le mode d'exécution pendant (pas de mode avant appel et après appel).

Dernière question du type comment faire :

J'ai un module de transaction bancaire, un autre de log et un autre de transaction sql.

Je dois faire un action de retrait : vérifier le compte de l'utilisateur, si celui-ci à le droit de retirer la somme, je le fais. Dans les deux cas je stock un log de l'action et du résultat, ainsi que dans le cas d'un retrait, met à jour le solde du client dans la partie SQL.

Quels seraient les advices, et à quoi pourrait ressembler le join point ?

Merci d'avance pour tes réponses.
Bonne prog et à+,
Akh
LocalStone
Messages postés
515
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009
-
@Coucou747: T'as pas idée du mal que j'ai eu pour revenir au PHP. Et le pire, c'est l'inverse : j'ajoute des [function] à toutes les méthodes et je préfixe toutes les variables alors que ça ne sert pas à grand chose en Java.

Et concernant l'intérêt de l'AOP ... Détrompe-toi ! C'est énormément utilisé ! C'est avec Hibernate (en Java) que j'ai compris à quel point c'était puissant (http://www.hibernate.org/) et donc indispensable :P.

@aKheNathOn: J'ai pas très bien compris la première question. Par contre, je peux te donner mon avis pour la seconde (je suis loin d'être un expert). Déjà, tu fais un aspect pour la journalisation, qui ne doit pas être bien sorcier. En gros, tu mets des advices autour de toutes les méthodes fonctionnelles qui t'intéressent. Ensuite, pour la partie transaction, tu fais un te mets autour de la méthode qui te permet de faire un retrait. Si aucune exception n'est lancée, alors ça veut dire que le mec à le droit de le faire, donc tu peux faire la transaction. Sinon, tu attrapes l'exception, tu ne fais pas la transaction et tu relances la transaction pour en faire profiter le reste de l'application.

Et tu as raison, je ne gère les pas les pointcuts avant et après une méthodes. Je ne me suis occupé que du pointcut "around", parce que c'est le plus puissant (et aussi parce que j'avais la flemme de faire le reste).

Il manque également deux choses importantes pour que l'on puisse utiliser mon module en pratique :

1. ce que j'appellerais un contexte d'aspect, qui permet de stocker des variables pour un aspect (des champs voire des méthodes que l'aspect peut appeler, sachant que ce context doit évoluer indépendamment pour chaque instance proxifiée par l'aspect) ;

2. des annotations, à la manière du Java, à placer autour de la déclaration des classes et des méthodes, utilisables par les aspects.

Voili voilou ! Merci pour vos commentaires en tout cas !
cs_stailer
Messages postés
511
Date d'inscription
jeudi 28 mars 2002
Statut
Membre
Dernière intervention
13 mai 2009
1 -
Très bonne source... Mais pour moi, trop de séparation, tue la séparation. Probablement que sur un projet extrêmement dense l'AOP est utile, mais la, si je veux modifier le fichier attaché à ma classe je vais devoir aussi modifier ma classe. Je pense qu'il va y avoir une certaine perte de temps et une multiplication des fichiers.
C'est un avis personnel.

Pour finir, et à contre-courant : je n'ai aucun mal à faire du PHP alors que je m'éclate en C# et en Java. Ca n'a rien à voir, il a de nombreuses qualités que C# et Java n'ont pas et inversement.. Mais surtout : L'AUTOCOMPLETION EXISTE ! Elle fonctionne parfaitement avec Eclipse ou Netbeans ; )
Essayez les, vous les adopterez (sans parler du reste : SVN, multi-projets, accès direct aux objets, méthodes avec CTRL+clic et j'en passe....).

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.