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 ]);
(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 :
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.
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.
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
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 ? )
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.
Je ne suis plus modérateur, ne me contactez plus pour des demandes, je n'y répondrai pas.
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é.
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
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.
$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 ?
$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.
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
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.
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.
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
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.
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 :
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.
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 ) mais aussi le code interne du framework.
Le prochain chantier du framework devrait tourner autour des entités et de l’ORM.
[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.
Je ne suis plus modérateur, ne me contactez plus pour des demandes, je n'y répondrai pas.