Frash - Framework PHP 7

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

J’aimerai vous présenter mon framework Frash, que j’ai passé sur PHP 7 afin d’utiliser le typage des paramètres. Je développe ce framework afin que tous les composants indépendants d’un projet (Du core du framework au gestionnaire de tests unitaires) y soient intégrés directement.

Aujourd’hui, j’ai trois repos, pour l’installer, pour le framework et pour la documentation, pas très avancée pour l’instant. J’ai plus de 1000 commits sur le repo du framework ( :D ), plus de 80 issues représentant autant de pistes d’améliorations, et j’ai commencé à utiliser les pull requests, seul, il y a quelques semaines.

J’ai des idées de fonctionnalité à venir, et qui seraient utile : Un BrowserKit (Nom du composant Symfony) ou la création de Mock. Cette dernière servirait principalement pour le gestionnaire de tests unitaires. Le BrowserKit y serait également utile, mais pourrait servir sur d’autres points.

J’ai vu que l’on pouvait créer des sockets en PHP, et c’est une fonctionnalité que je souhaiterai implémenter.

Si le framework commence à vous intéreresser, je place ses liens :

Concernant les fonctionnalités déjà implémentées, on peut compter sur un moteur de templates, un ORM compatible MySQL et PGSQL (J’aimerai pouvoir intégrer MongoDB, mais ça m’a l’air complexe), et j’ai une idée de la façon d’implémenter les jointures.

Si vous souhaitez m’aider, j’ai fait un petit CONTRIBUTING.md qui précise encore quelques pistes d’améliorations - supplémentaires.

Pour ne pas vous laisser sans démonstration :

Un exemple de Routing.php :

 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
namespace Configuration;
use Frash\Framework\Routing\TreatmentPhp;

class Routing extends TreatmentPhp
{
    public function __construct()
    {
        $this->group([ 'bundle' => 'AppBundle' ], function(){
            $this->group([ 'middleware' => 'Connected' ], function(){
                $this->group([ 'middleware' => 'Admin' ], function(){
                    $this->get('admin', 'AdminController:adminAction');
                });

                $this->get('interface', 'InterfaceController:interfaceAction');
                $this->post('create', 'CreateController:createAction');
            });

            $this->group([ 'middleware' => 'NoConnected' ], function(){
                $this->get('home', 'IndexController:indexAction');
                $this->post('connexion', 'IndexController:connexionAction');
            });

            $this->get('deconnexion', 'IndexController:deconnexionAction');
            $this->post('ajax/route', 'AjaxController:routeAction');
        });
    }
}

Un exemple de vue :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
{{ extend base.tpl }}

{{ part body }}
    <div id="corps">
        <div id="emplac_form_conn_home">
            {{ @form.start }}
                <h2 class="text-info">Connexion</h2>
                {{ @form.ident }}<br>
                {{ @form.password }}
                <div id="form_conn_two_droite">
                    <p id="p_submit_conn">{{ @$form["submit"] }}</p>
                    {{ traduction mdp_oubli }} ? <a href="{{ route mdp_oubli/ }}">{{ traduction mdp_modif }}</a>
                </div>
            {{ @form.end }}
        </div>
    </div>
{{ end_part body }}

Pour l’affichage "simple" de variable, on peut les déclarer par {{ @variable }} ou {{ @$form["submit"] }}. Dans le cas deuxième cas, dans le controller, le paramètre passé serait sous la forme :

1
2
3
4
5
return $this->tpl->view('view.tpl', [
    'form' => [
        'submit' => ...
    ]
];

Une piste d’amélioration serait de ne pas avoir à mettre le "@" lorsqu’on met un "$".

Développer un framework seul n’est pas vraiment motivant, si vous avez PHP 7 et/ou que vous êtes intéressé pour m’aider, je vous invite à fork le framework, et à proposer des issues et des PR. :)

(Pour avoir PHP 7 ( :p ) : Virtualbox Debian, PHP7-FPM via dépôt Dot-deb)

Si vous voulez que je détaille un sujet, demandez :)

Je vous remercie :)

Édité par Alix_Speroza

+3 -0
Auteur du sujet

Bonjour,

Ce matin, j’ai merge la version 1.4.16, elle intègre notamment une première version du "BrowserKit" qui, pour l’instant, permet de récupérer ce que renvoie la route ou l’URL indiquée, le response code et le header ($http_response_header).

Je me suis rendu compte après coup qu’il y a deux variables que je n’avais pas changé, c’est un fix bug qui va être mergé ce midi. ^^ Les deux variables (La même : $this->system), dans OrmFactory, renvoyaient une erreur si j’utilisais finder() ou counter(), mauvais namespace ( :D ).

La 1.4.16, sinon, met à jour l’affichage d’Exception, intègre {{ call Bundle:Controller:action }} dans le moteur de templates, unifie les QueryBuilder, Counter et Finder de MySQL et PGSQL (Ce qui a amené au bug de namespace). Lors de l’exécution de la commande Framework:init, vous renseignez les langues disponibles pour la traduction ( "fr/en/de/it/…" ), pour chaque langue indiquée, la commande va générer le fichier de traduction. (TradFr, TradEn, etc…)

Pour finir, j’ai complété légèrement les tests unitaires en ajoutant checkRegex() et checkNotRegex() ainsi qu’une class de tests unitaires pour la class Framework\Utility\Generator.

1
$this->checkRegex('/^([a-zA-Z]*)$/', Generator::get(10, false, true, true, false));

Merci :)

Édité par Alix_Speroza

+0 -0
Auteur du sujet

Bonjour,

La version 1.1 de frash-install est en release. Elle permet l’utilisation de la 1.4.17 du framework.

La version 1.4.17 complète la fonctionnalité {{ call }} du moteur de templates, ainsi, vous pourrez mettre {{ call POST route/ }}, par exemple.

Cette version met également en place un "Dispatcher", instancié par le frontcontroller, qui va se charger du DIC, du routing et de l’instanciation du controller et de l’action.

Enfin, il y a une première version introduisant les paramètres personnalisés pour l’action, ainsi, vous pourrez faire :

1
public function indexAction(IndexRepository $index, Finder $finder, Counter $counter, Session $session, ...){

Comme vous pouvez également ne mettre aucun paramètre pour l’action et vous servir uniquement du Dic passé par BaseController.

Merci :)

+0 -0
Auteur du sujet

Salut !

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 ^^

1
2
3
4
5
6
7
$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 :

1
2
$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 <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. :)

+0 -0
Auteur du sujet

Bonjour :)

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$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 :

1
{{ 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.

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

Je vous remercie :)

+0 -0
Auteur du sujet

Bonjour,

J’ai démarré à côté deux projets basés sur le framework, expliquant que je n’ai pas donné d’indications sur l’avancée ce dernier mois ^^

Je viens donc de valider la PR comprenant la version 1.4.20. Une fonctionnalité que j’ai rajouté est en lien avec les deux projets parallèles.

Des bundles dans le dossier src de frash/. Je n’ai pas encore transféré la homepage et la bottom bar dans des bundles. Une fois fait, ça me permettra d’enlever des fonctions dédiées à l’affichage de vues spéciales… situées dans le vendor.

J’ai fait une révision du code pour la compatibilité PSR-2.

J’ai également commencé la création d’une API automatique inspirée sur Loopback. Y’a juste le select all de fonctionnel. L’implémentation d’un moyen de sécurisation permettra le développement, et l’utilisation, d’autres types de requêtes (UPDATE, …).

J’ai enfin mit à jour le générateur de documentation, j’ai corrigé les erreurs. Une prochaine mise à jour du générateur permettra de générer des fichiers plus esthétiques :D

Je vous remercie.

+0 -0
Auteur du sujet

Bonjour,

Depuis le dernier message, j’ai pu transférer la homepage dans un bundle spécial. J’ai également reproduit les class Bundle (Une class AppBundle dans le dossier AppBundle), c’est inspiré de Symfony et ça m’a permit d’alléger de plusieurs fonctions certaines class, comme Templating.

J’espère pouvoir vous redonner plus régulièrement des informations sur les progrès du framework. Je vous remercie.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte