7387 sujets

Développement web côté serveur, CMS

Bonjour, j'essaie de dev un systeme de plugins pour un Frameworks maison et je suis bloquer a un endroit...

En effet, en imaginant que le plugins est installer et activer, j'aimerais donc créer l'objet via la class de ce plugin dynamiquement.

dans mon fichier config, voila comment sa ce passe :


$S_DB = PDO2::getInstance(DB_HOST, DB_NAME, DB_USER, PASSWORD);
$S_MODEL = new App\core\lib\Model($S_DB);
$S_PLUGINS = new App\core\lib\Plugins($S_DB);
 
$S_PLUGINS->dynamicObject();


La méthod dynamicObject() vaut :


public function dynamicObject(){
        $create_object = $this->findAll(PLUGINS_TABLE, '*', 'active', '1');
        $count_object = count($create_object);
        $i = 0;
         
        while($i != $count_object){
            require_once(ROOT . DIR_PLUGINS . $create_object[$i]['name'] . '/class.php');
            ${'S_'. strtoupper($create_object[$i]['name'])} = new $create_object[$i]['name']();
            $i++;
        }
    }


Le soucis que je rencontre est que si je met le code de dynamicObject directement dans le fichier config cela marche bien.

Cependant si je le laisse comme ceci dans une méthod et que j'appel la méthod rien ne se passe...

Pourtant l'objet ce créer bien puisque j'ai tester avec des var_dump et cela fonctionne.

Des idées ? merci
niuxe a écrit :
Bonjour,

??? factory ? abstract factory ? builder ? __autoload() ? spl_autoload_register ? display error ? error reporting ?
Smiley confuse

je t'invite à lire ou relire l'article 8 de la section aide


Salut et merci d'avoir pris le temps de répondre.
Je t'avoue que je comprend pas trop ce que tu me demande ???
Tu pense qu'il te manque des informations ?
Car je pourrais te donner tous mon fichier config il n'y a rien d'interessant pour le probléme dedans...

Au niveau de l'article 8 et de la mise en forme, j'ai mis le code PHP entre les balise codephp je voit pas ce que je pourrais faire de plus ?...

Enfin pour répondre tous de même il ne s'agit pas d'un autoload.
En effet, l'objet $S_PLUGINS est directement créer dans le fichier config.php Celui ci est censé grace a la method dynamicObjet() créer dynamiquement les objets qui sont activer.
La méthod fonctionne trés bien.

Le seul problème est que je suis obliger d'inclure un return et de recuperer un tableau de tous mes objets. Je me demandais s'il n'etais pas possible de faire autrement ? Car un tableau d'objet, c'est un peu chiant.

Merci
C'est pas très clair tout ça. Pourquoi tu ne fais pas un return de ton objet uniquement, tu n'es pas obligé de renvoyer tout le tableau. Note qu'il n y a même pas de return dans le code que tu as soumis...

require_once(ROOT . DIR_PLUGINS . $create_object[$i]['name'] . '/class.php');

Ceci n'a pas l'air très propre, à quoi cela sert-il ?
Modifié par bzh (25 Sep 2017 - 13:41)
bzh a écrit :

C'est pas très clair tout ça.
....
Ceci n'a pas l'air très propre, à quoi cela sert-il ?


+1

Le problème est que tu ne décris pas le tenant et l'aboutissant (une méthode et quelques instances de class). Tu ne commentes pas ton code et il faut déchiffrer. Tu parles d'un fichiers de config.php. Or un tel fichier doit avoir seulement des données statiques. Tu vas retrouver dans ce fichier des constantes comme la connexion à la base, le mode de l'application (dev ou prod), le timezone, le niveau de sécurité, le sel pour le hash, la méthode de hash/encrypt, le mail du serveur, etc. etc.

En générale, dans ce fichier tu n'as pas de création de class. Par contre, ce fichier peut être une class à part entière. Je dirai même une class statique.

À vue de nez, je t'invite à regarder :
- le PSR4 de php (!!)
- la création d'un factory (design pattern) --> bien connaître l'avantage ET l'inconvénient (Si tu commences la poo, oublie !)

Je pense que ton souci vient de cette ligne

${'S_'. strtoupper($create_object[$i]['name'])}  = new ....


Tu veux utiliser des variables dynamiques. Or, tu peux très bien créer un array associatif avec des clefs dynamiques ou encore mieux une propriété dynamique. Mais le souci est que ta variable ou propriété aura une portée restreinte. Alors tu peux voir avec les méthodes magiques. Je pense au accesseurs magique get/set. Il faudra tout de même limiter cela. Car normalement une propriété est private/protected !
Modifié par niuxe (25 Sep 2017 - 14:30)
bzh a écrit :
C'est pas très clair tout ça. Pourquoi tu ne fais pas un return de ton objet uniquement, tu n'es pas obligé de renvoyer tout le tableau. Note qu'il n y a même pas de return dans le code que tu as soumis...
require_once(ROOT . DIR_PLUGINS . $create_object[$i]['name'] . '/class.php');

Ceci n'a pas l'air très propre, à quoi cela sert-il ?


----------------------

Ok, je viens de comprendre ^^ encore désolée du coup !
C'est au final la seul solution que j'ai trouvé le coup du return.
Mais je voulait voir si il n'y avait pas un moyen plus simple.

La method dynamicObject sert a recuperer dans la BDD la listes des plugins qui sont activer et a créer dynamiquement l'objet.
Explications :

ROOT = au chemin jusqu'a la racine du site : /
DIR_PLUGINS = au chemin de la racine du site jusqu'au dossier plugins : /core/plugins/

Du coup la ligne que tu ne 'comprend' pas :
require_once(ROOT . DIR_PLUGINS . $create_object[$i]['name'] . '/class.php');

On inclut le fichier class.php du plugins user.

${'S_'. strtoupper($create_object[$i]['name'])} = new $create_object[$i]['name'] 

Cette ligne sert a créer dynamiquement l'objet! au final c'est comme si c'étais équivalent a :

Pour terminer on pourrait traduire les deux lignes suivante pour un plugins user comme cela :

require('/var/www/html/Lab/SimpleFrameworks/public/../core/plugins/user/class.php');
$S_USER = new user();


J'ai modifier la suite pour la retourner sous forme de tableau si il y a plusieurs objet en faisait notamment un return.

----------------------

niuxe a écrit :

+1
Le problème est que tu ne décris pas le tenant et l'aboutissant (une méthode et quelques instances de class). Tu ne commentes pas ton code et il faut déchiffrer. Tu parles d'un fichiers de config.php. Or un tel fichier doit avoir seulement des données statiques. Tu vas retrouver dans ce fichier des constantes comme la connexion à la base, le mode de l'application (dev ou prod), le timezone, le niveau de sécurité, le sel pour le hash, la méthode de hash/encrypt, le mail du serveur, etc. etc.

En générale, dans ce fichier tu n'as pas de création de class. Par contre, ce fichier peut être une class à part entière. Je dirai même une class statique.

À vue de nez, je t'invite à regarder :
- le PSR4 de php (!!)
- la création d'un factory (design pattern) --> bien connaître l'avantage ET l'inconvénient (Si tu commences la poo, oublie !)


Je suis désoler de ne pas commenter mon code :s
il faudrait, je le sais... mais je préfére le faire une fois le projet finis.

Pour ce qui est de PSR4 ect... j'imagine que tu fait référence a composer ? et l'autoloader qui y est associé ? Je n'aime pas trop Smiley ohwell .

Dans la dernières partie de ton message tu parle de variable dynamique!
C'est exactement cela! Je n'arrivait pas a avoir n'importe quelle objet sur n'importe quelle page.

J'ai finalement réussi en mettant les objet dans un tableau et en le passant a la method render(main_controller.php) qui rend la vue.
J'ai procéder ainsi :

- Dans le fichiers config :
- Création de toutes les class dont on a besoin en les regroupant sous la forme d'un tableau.

Par exemple pour le plugins user nous avons
-> user_model.php
-> user_controller.php
Mon tableau correspond alors :
$S_CLASS['user'][user_model]->exempledemethode();

Je peut aussi appeler une autre classe dont j'ai besoin :
$S_CLASS['plugins']->isActive();

-------------------
Mon fichier config => ICI
-------------------

Il est entier, je ferais par la suite un autoload a la place des 6 dernieres lignes.
Du coup a part les 6 dernières lignes tu trouve que cela ne va pas pour un fichier config ?

-------------------
Ma "librairie" qui gérent les plugins => ICI
-------------------

D’où ma question, pour la method dynamicObject() je pensais qu'il y avais moyen de récupérer l'objet que sort cette méthod sans avoir a utiliser de return.
Mais visiblement il n'y a pas moyen de faire autrement!
Je vous remercie quand même!

Je tiens a préciser qu'il ne s'agit nullement d'un projet pro.
Je fait de la POO depuis quelques semaines (~2mois).
Avant je faisait surtout du procédural.
Je cherche a faire quelques choses le plus sérieux possible.



J’espère avoir été plus clair. Si ce n'est pas le cas c'est que mon projet est surement mal réfléchis...
Modifié par Eito79 (25 Sep 2017 - 17:21)
niuxe a écrit :
Ce soir en rentrant, j'essaierai de jeter un coup d'oeil. Sinon, je le ferai demain. Smiley smile


Super merci