IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Savoir quelle méthode est appelée via le constructeur


Sujet :

Langage PHP

  1. #1
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut Savoir quelle méthode est appelée via le constructeur
    Bonjour,

    je cherche à savoir s'il est possible dans le __construct() de connaitre la méthode appelée ?

    Exemple :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    class A{
     
    	public function __construct(){
    		// Ici je souhaiterais savoir que c'est la méthode 2 qui est appelée
    	}
     
    	public function methode(){}
     
    	public function methode2(){}
     
    }
     
    $objet = new A();
    $objet->methode2();

    En fait, je cherche un peu à savoir s'il existe l'opposé de la méthode magique __call.

    Merci à celui qui m'aidera

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class A
    {    
        public function __call($name, array $arguments)
        {
            var_dump($name);
            call_user_func_array(array($this, $name), $arguments);
        }
     
        protected function methode() {}
     
        protected function methode2() {} 
    }
     
    $objet = new A();
    $objet->methode2();

  3. #3
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    exact cela marche avec des appels de fonction en protected (je ne sais pas pourquoi). Toujours est il que je dois conserver mes fonction en visibilité publique donc ca ne marche pas

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par Madfrix Voir le message
    exact cela marche avec des appels de fonction en protected (je ne sais pas pourquoi). Toujours est il que je dois conserver mes fonction en visibilité publique donc ca ne marche pas
    je sais bien, mais sinon c'est pas possible (j'aime pas trop m'avancer, en espérant avoir tord...)

  5. #5
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Ben ca va pas être possible alors je dois garder ma visibilité en publique car c'est des services Flex qui nécessitent d'être en publiques pour pouvoir être lancés. Tant pis va falloir que je trouve une autre bidouille

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par Madfrix Voir le message
    Ben ca va pas être possible alors je dois garder ma visibilité en publique car c'est des services Flex qui nécessitent d'être en publiques pour pouvoir être lancés. Tant pis va falloir que je trouve une autre bidouille
    c'est pour faire quoi dans le fond, y'a peu etre moyen de trouver une autre solution

  7. #7
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    C'est un peu compliqué à expliquer dans le fond et la forme...

    En fait j'ai une appli Flex avec un backend en php. Ce backend est orchestré par un serveur zend_amf donc j'utilise zend framework.

    Pour l'instant mon serveur amf est de cette forme :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    	set_include_path('.'
    		. PATH_SEPARATOR . './config'
    	    . PATH_SEPARATOR . './services'
    	    . PATH_SEPARATOR . './vo'
    	    . PATH_SEPARATOR . get_include_path());	    
     
    	require_once 'Zend/Amf/Server.php';
    	require_once 'General.php';
    	require_once 'Login.php';
    	require_once 'constantes.php';
     
    	$server = new Zend_Amf_Server();
     
    	$server->setClass('General');
    	$server->setClass('Login');	
     
    	/* tables */
    	$server->setClassMap('vo/tables/VOUsers', 'tables/VOUsers');
    	$server->setClassMap('vo/tables/VORoles', 'tables/VORoles');
    	$server->setClassMap('vo/tables/VOPlanetes', 'tables/VOPlanetes');
     
    	/* composants */
    	$server->setClassMap('vo/composants/VOLogin', 'composants/VOLogin');
     
     
    	echo($server->handle());

    j'aimerais inclure un système d'autorisation/authentification avec les méthodes setAcl et setAuth. Pas de problèmes pour setAcl mais pour setAuth, je dois effectuer une vérification dans une table afin de définir le rôle de l'utilisateur sauf que je ne connais pas à l'avance la base à attaquer car mon appli est multi-base.

    Pour le moment, je me connecte dans mes services à ma base en lui fournissant le nom de ma base en param de méthode sauf que lorsque j'arrive ici mon serveur est déjà initialisé et donc je ne peux pas lui appliquer setAuth

    Ma seule alternative je pense serait de définir mes autorisations directement dans mes services mais comme j'ai pas envie de le faire dans chaque méthode de mes services faisant appel à ma base j'essaie de catcher la méthode appelée afin de le faire une bonne fois pour toute via le constructeur par exemple.

    Je sais c'est flou mais j'avais déjà posté hier sur ce sujet

    Merci de t'intéresser à mon problème en tout cas

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    j'avais lu un article la dessus, et en gros a chaque méthode faillait vérifie si l'utilisateur avait les droits,
    le __call + le proteced ca marche pas avec AMF ?

  9. #9
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    non malheureusement je dois conserver en public.

    J'avais même pensé à appeler à chaque fois une méthode qui n'existe pas avec un préfixe commun puis de trapper cette méthode par __call est de la redispatcher après avoir fait les autorisations, mais c'est quand même sacrément moche de toujours appeler des méthodes inexistantes

    Sans compter les désagrément qu'engendre l'utilisation de __call...

    EDIT: si tu connais Zend_Acl, les ressources ici ne correspondent pas à des controleurs mais à des classes et les actions correspondent à des méthodes

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par Madfrix Voir le message
    EDIT: si tu connais Zend_Acl, les ressources ici ne correspondent pas à des controleurs mais à des classes et les actions correspondent à des méthodes
    pas de soucis, tout les composants du ZF peuvent s'utiliser seul


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    require_once 'Zend/Loader/Autoloader.php';
    Zend_Loader_Autoloader::getInstance();
     
    class Test
    {
        public function read()
        {
     
        }
     
        public function write()
        {
     
        }
     
        public function delete()
        {
     
        }
    }
     
    $acl = new Zend_Acl();    
    $acl->addResource(new Zend_Acl_Resource('test'));
     
    $acl->addRole(new Zend_Acl_Role('guest'))
        ->addRole(new Zend_Acl_Role('writer'), 'guest')
        ->addRole(new Zend_Acl_Role('admin'), 'writer');
     
    $acl->allow('guest', 'test', 'read')
        ->allow('writer', 'test', 'write')
        ->allow('admin', 'test', 'delete');
     
    Zend_Debug::dump($acl->isAllowed('guest', 'test', 'delete'));
    Zend_Debug::dump($acl->isAllowed('admin', 'test', 'delete'));
    Zend_Debug::dump($acl->isAllowed('writer', 'test', 'write'));

  11. #11
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    pas de soucis, tout les composants du ZF peuvent s'utiliser seul
    Oui je le sais bien mais prenons l'exemple d'une de mes méthodes de mon service Login étendant Base (dans lequel dans un monde parfait, j'aimerais définir une bonne fois pour toutes mes autorisations/authentification^^) :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    public function getGalaxies($objet){
     
    	   	    $retour = array();
     
    	    	$this->connexion($objet->univers, $objet->num);
     
    	    	$statement = $this->getConnexion()->prepare('SELECT DISTINCT(a.galaxie) as galaxie
    													    FROM planetes_full a
    														LEFT JOIN (
    															SELECT galaxie, ss
    															FROM planetes
    															GROUP BY galaxie , ss
    															HAVING count(*) = 20
    															UNION
    															SELECT galaxie, ss
    															FROM planetes
    															WHERE pm = 1
    															GROUP BY galaxie, ss
    															HAVING count(*) = 4
    														) b 
    														ON a.galaxie = b.galaxie
    														AND a.ss = b.ss
    														WHERE b.galaxie IS NULL
    														ORDER BY galaxie ASC');
    	    	$statement->execute();
     
    	    	 while ($row = $statement->fetchObject()) {
                	$tmp = new VOPlanetes();
                	$tmp->galaxie = $row->galaxie;
                	$retour[] = $tmp;
           		 }
     
    	    	return $retour;
     
    	    }

    (désolé pour le formatage, la flemme de remettre bien)


    mon param objet est un objet (^_^) envoyé par Flex dans lequel les attributs univers et num après une fonction de hashage me donne le nom de la base à attaquer. A la limite, dans la fonction connexion() implémentée dans Base.php je pourrais définir mes auth et acl sauf que c'est trop tard puisque connexion() est appelée par une méthode de service qui justement doit être controlée par acls...

    J'enrage un peu car sans appli multi bases ce serait fait directement sur mon serveur amf mais là je peux pas ou alors je passe à côté d'un truc gros comme une maison...

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    au niveau des sessions t'as regardé ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $server = new Zend_Amf_Server();
    Zend_Session::start();
    $server->setSession();

  13. #13
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Pour le coup je vois pas ce que ca me donnerais. Mais après réflexion, je me demande si mon appli multi bases est si un problème que ca...

    Car finalement, mes acls ne varient pas d'une base à l'autre et mon authentification doit rester en session logiquement (bien que sur un serveur AMF des comportements paranormaux arrivent parfois lol). Du coup, une fois loggué, l'utilisateur sera normalement identifiable pour le reste de sa navigation.

    Enfin, c'est un peu confus mais je vais mettre tout cela en ordre dans mon code

    le seul (gros ?) problème c'est pour mon adapter de zend_auth, il faut que je connaisse la base utilisée ce que je ne connais pas lorsque j'arrive dans l'instanciation de mon serveur AMF ou j'effectue mes auth/acls

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    y'a pas mal de chose pour AMF t'as le setAcl set Auth, t'a la classe Zend_Amf_Adobe_Auth pour les roles du coté flash, tu va bien trouver ton bonheur la dedans

  15. #15
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Oui je sais bien

    mon problème n'est pas de savoir utiliser ces fonctions somme toute assez facile d'utilisation. Mon problème est de mettre en place un adapter de base de données sur le serveur AMF sachant que je ne connais la base à utiliser que dans mes services...

    Faut que je réfléchisse afin de savoir si après le login, je pourrais pas mettre le nom de ma base en session ce qui me permettrait sur le serveur de la récupérer...

    A voir si c'est sécurisé et opérationnel donc

Discussions similaires

  1. [Introspection] Savoir quelle classe a appelé une méthode
    Par muad'dib dans le forum Général Java
    Réponses: 2
    Dernier message: 26/11/2008, 17h34
  2. KeyStroke.getKeyStroke Savoir quelle touche est appuyée
    Par oOoOuuhmAn dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 08/06/2008, 20h48
  3. Savoir quelle application est au premier plan
    Par David dans le forum Delphi
    Réponses: 5
    Dernier message: 08/10/2006, 18h38
  4. [Copie de Fichier] Quelle méthode est la plus rapide ?
    Par n@n¤u dans le forum Entrée/Sortie
    Réponses: 16
    Dernier message: 04/05/2006, 14h59
  5. [VBA-PP]Quelle procédure est appelée au démarrage de PowerPoint
    Par jorge7281 dans le forum VBA PowerPoint
    Réponses: 11
    Dernier message: 27/04/2006, 18h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo