Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Framework] Frash - Framework PHP 7

    2 avril 2017 à 15:39:03

    Bonjour,

    Je suis développeur web, avec une nette préférence pour le PHP, et je viens vous présenter mon framework PHP 7.

    Projet

    Le framework vise à être un "all-in-one", comme je le qualifie. Tous les composants indépendants que l'on retrouverait dans un projet symfony allant du core du framework au gestionnaire de tests unitaires, seraient développés et intégrés à Frash.

    Console

    Il y a pour l'instant quelques commandes disponibles, pour générer un bundle, générer un controller. Pour avoir la liste des commandes :

    php console.php list:command

    Il y a une commande à lancer après l'installation du framework par Composer :

    php console.php Framework:init

    La commande va vous permettre de générer, selon les choix indiqués, des fichiers de configuration, des dossiers, et la base des class de traductions (En fonction des langues que vous aurez indiqué : fr/en/de/it/...)

    Core du framework

    Tout commence par le frontcontroller, index.php (https://github.com/AlixSperoza/frash-install/blob/master/index.php). Celui-ci appelle le Dispatcher. Il va gérer l'instanciation du DIC, définir la route grâce au router, et s'occuper d'instancier le bon controller ainsi que d'appeler l'action rattachée à la route. Jusqu'à il y a peu, pour utiliser les fonctionnalités du framework, il fallait dans la plupart des cas, utiliser le Dic, passé par une propriété "protected" dans BaseController, qu'un controller extend. Maintenant, nous pouvons faire :

    public function indexAction(UserRepository $user, Counter $counter, Finder $finder, ...){
    
    }

    Finder et Counter étant des composants de l'ORM. Et faire de cette manière n'empêche pas l'utilisation du Dic par $this->dic.

    ORM

    L'ORM permet de faire des requêtes SELECT, UPDATE, DELETE et INSERT sur MySQL et PGSQL.

    Une requête SELECT :

    $sel = new Select([ 'table' => 'immobilier' ]);
    $sel->where('ville', ':ville')->colSel('SUM(nb_employe) as nb_employe')->execute([ $ville ]);

    Une requête UPDATE :

    $upd = new Update('immobilier');
    $upd->where('id', ':id')->update([ 'nb_employe +' => ':nb' ])->execute([ $immo, 1 ]);

    Une requête INSERT :

    $ins = new Insert('immobilier');
    $ins->cols([ 'ville', 'quartier', 'nom' ])->execute([ $ville, $quartier, $nom ]);

    (Les exemples de SELECT ont été fait pour une utilisation avec PGSQL)

    Concernant l'UPDATE, le ' +' va donner dans la requête "nb_employe = nb_employe + :nb". Il y a également le " -".

    Concernant le Finder :

    $finder->findOne('Entity', 1); // SELECT * FROM entity WHERE id = 1
    $finder->findOneByNom('Entity', 'nom'); // SELECT * FROM entity WHERE nom = 'nom'
    $finder->findByIdAndNomAndAge('Entity', 1, 'nom', 20); // SELECT * FROM entity WHERE id = 1 AND nom = 'nom' AND age = 20

    Concernant le Counter :

    $counter->countById('Entity', 1);

    Lorsque les requêtes SELECT, UPDATE, INSERT, DELETE sont définies, le QueryBuilder contient les méthodes insert(), update(), select() and delete() qui prennent en paramètre la variable avec laquelle la requête aura été construite.

    Moteur de templates

    Le moteur de templates est instancié depuis le controller :

    return $this->tpl->view('view.tpl', [
        'param' => $param,
        ...
    ];

    Frash contient également un générateur de documentation et un gestionnaire de tests unitaires. Il y a pour l'instant deux tests unitaires intégrés à Frash : https://github.com/AlixSperoza/frash/tree/master/tests/Framework .

    La documentation est disponible : https://github.com/AlixSperoza/frash-docs mais elle reste à continuer.

    La suite ?

    Je développe seul Frash, et j'espère que des intéressés utilisant PHP 7 proposeront des pull requests ou même des issues. Aujourd'hui, j'utilise les pull requests, mais seul. Je me les auto-valide.

    Evidemment, les liens :

    https://github.com/AlixSperoza/frash-docs

    https://github.com/AlixSperoza/frash

    https://github.com/AlixSperoza/frash-install

    Si vous avez des questions, posez-les :)

    Merci :)

    -
    Edité par AlixSperoza 4 avril 2017 à 18:32:16

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      3 avril 2017 à 13:26:49

      Bonjour, 

      Quel intéret de reprendre du symfony pour refaire un symfony like ?

      Cdt, 

      • Partager sur Facebook
      • Partager sur Twitter
        3 avril 2017 à 13:50:09

        Je ne reprends aucun composant de Symfony, je développe tout moi-même :)

        Je me suis à la rigueur inspiré de Symfony pour les bundles et de Laravel pour la class de Routing.

        Après, pourquoi il n'y aurait pas un nouveau framework PHP (Version 7) ? ^^

        • Partager sur Facebook
        • Partager sur Twitter
          3 avril 2017 à 13:59:23

          AlixSperoza a écrit:

          Après, pourquoi il n'y aurait pas un nouveau framework PHP (Version 7) ?

          Pour info les frameworks moderne sont compatible PHP7 et serons optimisé pour PHP7 quand la 5.6 ne sera plus maintenu. Si c'est le seul avantage je ne vois pas trop l'intérêt.

          De toute façon ton framework ne sera que très peu utilisé mais ce qui est important pour toi c'est que tu seras comment fonctionne un framework. C'est une expérience qui te serviras, c'est certain.

          • Partager sur Facebook
          • Partager sur Twitter
            3 avril 2017 à 14:23:36

            Ozee31 a écrit:

            AlixSperoza a écrit:

            Après, pourquoi il n'y aurait pas un nouveau framework PHP (Version 7) ?

            Pour info les frameworks moderne sont compatible PHP7 et serons optimisé pour PHP7 quand la 5.6 ne sera plus maintenu. Si c'est le seul avantage je ne vois pas trop l'intérêt.

            De toute façon ton framework ne sera que très peu utilisé mais ce qui est important pour toi c'est que tu seras comment fonctionne un framework. C'est une expérience qui te serviras, c'est certain.


            Je viens ici pour le faire connaître, espérant qu'il soit utilisé petit à petit. Je ne demande pas autant d'installation que Symfony, mais suffisamment pour que le framework soit "vivant" ^^

            Après, quand la documentation sera faite, il sera plus simple de l'utiliser :)

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              3 avril 2017 à 17:40:02

              Dans ce cas, pourquoi tout redévelopper,  alors que tu pourrais choper des bouts de code ici et là ? Avoir une approche différente peut être cool, mais vouloir tout redévelopper est une erreur à mon sens, dans la mesure ou des composants entiers ont été développés testés etc.. et sont qui plus est gratuits.

              Sinon, pour s'améliorer, c'est une très bonne idée. Mais pour une utilisation par d'autres dans le futur, je pense que ce sera plus compliqué ils te manque pas mal de choses (tests unitaires, stabilité/maturité du projet, vision ? )

              • Partager sur Facebook
              • Partager sur Twitter
                4 avril 2017 à 10:55:50

                Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention plus facilement.
                Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

                Mauvais format de titre




                Bonjour,

                Afin de maintenir le forum Présentation dans un état lisible, nous demandons à chaque personne initiant un nouveau sujet de respecter un certain format de titre. Chaque titre de sujet présent dans cette catégorie doit se composer de manière à respecter le format [Type de Projet] Nom du projet. Attention, "Présentation" n'est pas un type correct, nous nous doutons que vous présentez votre projet si vous postez un message ici.


                Quelques exemples de titres correct :


                • [Application] Tinder
                • [MOBA] Heroes Of The Storm
                • [Site Web]OpenClassRooms

                Merci de ta compréhension.

                • Partager sur Facebook
                • Partager sur Twitter

                Je ne suis plus modérateur, ne me contactez plus pour des demandes, je n'y répondrai pas.

                  27 avril 2017 à 14:37:14

                  Tu es courageux de t'attaquer à un tel projet !

                  Contrairement aux autres commentaires, je te soutiens. Si tu arrives à te démarquer progressivement des frameworks existants, tu pourras te faire une place !

                  Ce n'est pas parce qu'il y a de la concurrence que ton projet est voué à l'échec. Sans concurrence, il n'y a pas d'évolution.

                  Il te faut juste de la motivation et une bonne dose d'idées pour continuer ! Et, surtout, ne pas abandonner malgré les commentaires négatifs et la difficulté.

                  Je te souhaite bonne chance !

                  • Partager sur Facebook
                  • Partager sur Twitter
                  http://lastimperium.com jeu de stratégie - rpg par navigateur
                    11 mai 2017 à 12:51:03

                    SkyLi7h a écrit:

                    Tu es courageux de t'attaquer à un tel projet !

                    Contrairement aux autres commentaires, je te soutiens. Si tu arrives à te démarquer progressivement des frameworks existants, tu pourras te faire une place !

                    Ce n'est pas parce qu'il y a de la concurrence que ton projet est voué à l'échec. Sans concurrence, il n'y a pas d'évolution.

                    Il te faut juste de la motivation et une bonne dose d'idées pour continuer ! Et, surtout, ne pas abandonner malgré les commentaires négatifs et la difficulté.

                    Je te souhaite bonne chance !


                    Je te remercie pour ton message. J'aimerais bien que plus de monde t'entende ^^

                    Après un petit moment d'absence, j'ai pu améliorer la 1.4.17.

                    J'ai ajouté une fonction get() à la méthode Collection. En lui passant un paramètre "key1.key2.key3", get() retourna la valeur de key3 contenue dans key2 qui est contenue dans key1 ^^

                    $arr = [
                    
                        'key1' => [
                    
                            'key2' => (object) [
                    
                                'key3' => true
                    
                            ]
                    
                         ]
                    
                    ];

                    Cet exemple retournera donc true.

                    Un petit ajout est la class StringFormat, qui pour l'instant ne contient que la fonction replace(), elle permettra à terme d'avoir par exemple :

                    $sf = new StringFormat(' Hello ');
                    $sf->replace('ll', 'w')->trim()->lcfirst();

                    Par cette class, j'ai voulu reproduire le "comportement" de Javascript (var.replace().trim()...).

                    J'ai placé deux fonctions (dump() et predump()) dans un fichier helpers. Ca évite l'instanciation d'une class pour l'appel d'une fonction de débugage. predump() affiche un print_r() entouré par la balise pre.

                    J'ai enfin revu la syntaxe concernant l'affichage de variables dans une vue, à l'extérieur d'une loop. Au lieu de mettre @param, c'est maintenant $param.

                    Je vous remercie. :)

                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 mai 2017 à 17:42:16

                      AlixSperoza a écrit:

                      $sf = new StringFormat(' Hello ');
                      $sf->replace('ll', 'w')->trim()->lcfirst();
                      Perso je trouve que c'est trop verbeux et terriblement inutile. Pour utiliserais-je ton code quand je peux faire un trim(lcfirst(str_replace("ll", "w", " Hello "))) qui est bien moins long à écrire ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 mai 2017 à 21:17:54

                        Nephthys a écrit:

                        AlixSperoza a écrit:

                        $sf = new StringFormat(' Hello ');
                        $sf->replace('ll', 'w')->trim()->lcfirst();

                        Perso je trouve que c'est trop verbeux et terriblement inutile. Pour utiliserais-je ton code quand je peux faire un trim(lcfirst(str_replace("ll", "w", " Hello "))) qui est bien moins long à écrire ?


                        Un petit utilitaire ? ^^

                        Je trouve que trim(lcfirst(str_replace("ll", "w", " Hello "))) est moins lisible que $sf->replace('ll', 'w')->trim()->lcfirst(), avis subjectif toutefois ^^

                        Je me laisse un temps de réflexion, si ça peut effectivement servir ou non.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 mai 2017 à 21:21:43

                          oui mais le fait de mettre des flèches fait perdre un temps considérable ... :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 mai 2017 à 21:25:30

                            Nephthys a écrit:

                            oui mais le fait de mettre des flèches fait perdre un temps considérable ... :)


                            C'est sûr que ça vaut pas le simple "." de Javascript :p

                            J'espère que cette class n'a pas stoppé ton avis sur mon framework ^^

                            -
                            Edité par AlixSperoza 12 mai 2017 à 21:26:08

                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 mai 2017 à 21:37:51

                              J'attends de voir. Mais pour les sites que je développe (et j'en développe peu), je trouve que c'est un peu utiliser un katana à la place d'un simple couteau. Il faudrait que je prenne le temps de m'y mettre :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 mai 2017 à 21:51:53

                                Nephthys a écrit:

                                J'attends de voir. Mais pour les sites que je développe (et j'en développe peu), je trouve que c'est un peu utiliser un katana à la place d'un simple couteau. Il faudrait que je prenne le temps de m'y mettre :)


                                Pour un petit site, un framework assez léger peut être utile, parfois ^^ .

                                Il faudrait que de mon côté, je prenne le temps de faire la documentation, qui n'est pas très complète sur Github.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 juin 2017 à 21:10:40

                                  Bonjour à tous,

                                  Ca fait un petit moment que j'ai pas donné de nouvelles concernant l'avancée du framework.
                                  Il a bien avancé ^^

                                  J'ai notamment intégré les jointures pour PostGreSQL.

                                  $sel = new Join('table1', [ 'order' => 'table1.nom ASC' ]);
                                  $sel->colJoin('table1.id');
                                  $sel->colJoin('table1.nom');
                                  $sel->colJoin('table1.responsable', 'responsable');
                                  $sel->colJoin('immobilier.nom', 'local');
                                  $sel->colJoin('table3.nom', 'table3_nom');
                                  $sel->colJoin('table3.prenom', 'table3_prenom');
                                  $sel->join('INNER JOIN', 'immobilier', 'table1.immobilier', 'immobilier.id');
                                  $sel->join('LEFT JOIN', 'table3', 'table1.responsable', 'table3.id');
                                  $sel->where('table1.superieur', ':sup')->execute([ $sup ]);
                                  
                                  return $this->queryJoin($sel);

                                  Assez classique, et ça retourne un array, d'arrays.

                                  J'ai effectué quelques modifications, notamment dans la syntaxe de parsing du moteur de templates. Désormais, les variables "référencées" dans un foreach du moteur de template peuvent être des arrays multidimensionnels.

                                  La syntaxe donne :

                                  {{ foreach $array.other.other2 :: key, data }}

                                  Concernant le Routing, lors de la définition d'une get optionnel ( :id? ), l'on peut ajouter la clé "default"... Pour renseigner une valeur par défaut.

                                  $this->get('route/:id?', 'IndexController:organisationAction', [ 'get' => [ 'id' => [ 'type' => 'integer', 'default' => 0 ]]]);

                                  Enfin, j'ai avancé un peu la documentation :)

                                  Je vous remercie.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 août 2017 à 4:14:14

                                    mon frere je  suis au cameroun, je suis un jeune developpeur php et j'ai un bon penchant pour symphony,ton projet je le salut a bras ouvret et je te félicite,si tu as pris des idées par ci et la c'est que tu as remarqué que tu pouvais faire mieux et la je salut ton affort

                                    j'aimerai bien demarer avec ton framework d'ici peu  car sa semble interessant

                                    @bienvenu owono

                                    depuis yaoundé/cameroun

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      5 août 2017 à 11:24:38

                                      Je te remercie.

                                      Toutefois, je dois faire la documentation, il faut que je prenne le temps ^^

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        23 février 2018 à 15:09:58

                                        Salut à vous :)

                                        Alors, oui, ça fait quelques mois que je n'ai pas posté. Mais je reviens avec quelques ajouts au framework. :)

                                        La prise en charge (partielle) de MongoDB.

                                        use Frash\ORM\MongoDB\QueryBuilder;
                                        
                                        class AppRepository extends QueryBuilder
                                        {
                                            public function updateExample(string $id)
                                            {
                                                $upd = $this->newUpdate('database.collection');
                                                $upd->filter([ '_id' => new \MongoDB\BSON\ObjectID($id) ])->update([ '$push' => [ 'subdocument' => 'value' ]]);
                                        
                                                $this->update($upd);
                                            }
                                        
                                            public function insertExample(string $name)
                                            {
                                                $ins = $this->newInsert('database.collection');
                                                $ins->setId()->fields([ 'name' => $name ]);
                                        
                                                $this->insert($ins);
                                            }
                                        
                                            public function findExample(string $id)
                                            {
                                                $sel = $this->newSelect('database.collection', [ 'options' => [ 'limit' => 1 ]]);
                                                $sel->filter([ 'other_id' => $id, 'default' => true ]);
                                        
                                                return $this->find($sel, true);
                                            }
                                        }

                                        Ca, ce ne sont que des exemples. Dans le findExample(), l'exemple donné est développé pour retourner un seul résultat, enlevons l'array dans le newSelect() et le true dans le $this->find() et ça retournera autant de résultats que Mongo en trouve.

                                        De même, le Delete n'est pas encore prit en charge. Tout comme d'éventuels Finder et Counter que l'on trouve dans l'ORM côté SQL (compatibles MySQL et PGSQL).

                                        La traduction

                                        Désormais, dans une class de Traduction, vous pourrez faire comme ceci :

                                        protected $key_test = 'Bonjour {{ $1 }} !';

                                        Ainsi, dans votre vue, en mettant :

                                        {{ trad key_test Alix_Speroza }}

                                        Vous obtiendrez "Bonjour Alix_Speroza !".

                                        Faker

                                        J'ai commencé le développement d'un faker, il est pour l'instant très basique mais peut générer des données et les enregistrer dans une base de données SQL.

                                        Documentation

                                        C'était un gros défaut de mon framework je pense, l'absence de documentation est paliée pour les fonctionnalités autres que celles listées ici.

                                        Routing

                                        Une petite fonctionnalité, au lieu de faire :

                                        $this->get('route', 'Controller:action');
                                        $this->post('meme_route', 'MemeController:memeAction);

                                        Vous pouvez regrouper ces deux lignes :

                                        $this->many([ 'get', 'post' ], 'route', 'Controller:action');

                                        Filtres du moteur de template

                                        A l'image de TWIG, vous pouvez attribuer un filtre (Pour l'instant) à une variable affichée. Le seul filtre "officiel" disponible pour l'instant permet de passer la variable en paramètre de la fonction rawurlencode(). Bientôt, il y aura ucfirst(), lcfirst(), etc.

                                        Vous pouvez faire vos propres filtres. Dans Configuration\Service, vous devrez renseigner plusieurs informations sur votre filtre :

                                        'templating' => [
                                            'filter' => [
                                                    'number_format' => [ 'call' => 'nb', 'class' => 'Bundles\AppBundle\Service\NumberFormatFilter' ]
                                                ],
                                            'extension' => []
                                        ]

                                        La class du filtre donnera :

                                        class NumberFormatFilter
                                        {
                                            public function define(InitialTemplate $template, $tag)
                                            {
                                                return 'number_format('.$tag.', 0, ",", " ")';
                                            }
                                        }

                                        La méthode define() est obligatoire. Le moteur de template appellera directement cette méthode aussitôt la class du filtre instanciée.

                                        Kernel

                                        Dans Configuration\Config, il y a désormais la clé kernel dans l'array de configuration. Il contient les namespace vers toutes les class Bundle dont a besoin le framework : Les class des bundles à l'intérieur du framework, tout comme les class de vos bundles.

                                        Controller et Service

                                        Dans les paramètres d'une Action, vous pouvez désormais appeler directement un Service, en faisant précéder le nom de la variable par le nom de la class du service.

                                        public function exampleAction(ExampleService $ex, ...){}

                                        Condition dans une vue

                                        Dernier ajout plus ou moins important, si vous effectuez une condition dans votre vue, vous pouvez retranscrire un in_array().

                                        {{ if $example_array has "value_test" }}

                                        Je vous remercie d'avoir prit le temps pour cette longue lecture. :)

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          21 avril 2018 à 14:02:01

                                          Salut à vous, une petite news aujourd'hui :)

                                          Au début du framework, je ne l’avais pas doté de bundles. Je les ai intégré plus tard. Récemment, j’ai travaillé sur Laravel et Symfony Flex.

                                          Et ça m’a poussé à revenir également en BundleLess. Il est vrai que ça simplifie à la fois le code de l’application (Avis personnel :D ) mais aussi le code interne du framework.

                                          Le prochain chantier du framework devrait tourner autour des entités et de l’ORM.

                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          [Framework] Frash - Framework PHP 7

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown