2017 © Pedro Peláez
 

project framework-php

Micro Framework PHP basé sur la structure de Symfony. MVC compatible.

image

jojotique/framework-php

Micro Framework PHP basé sur la structure de Symfony. MVC compatible.

  • Wednesday, March 28, 2018
  • by Giildo
  • Repository
  • 0 Watchers
  • 0 Stars
  • 10 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 1 Versions
  • 0 % Grown

The README.md

Initialisation du projet

Partie publique

Création d'un dossier "public" à la racine qui regroupera tous les fichiers accessibles au visiteur (css, js, index.php...). Il ne contiendra aucune logique.
Création du fichier "index.php" à la racine du dossier "public". C'est vers ce fichier que toutes les adresses pointeront. Il sera nécessaire de faire .htaccess qui pointera vers ce dernier. Il est chargé de créer le Container et l'Application et de les lancer.
Créer un dossier "css", "js" et "img" dans ce dossier pour y stocker les fichiers correspondants., (*1)

Le Container

Utilisation de PHP-DI comme Container. Il est nécessaire de l'initialiser avec les différents paramètres de l'application :
$builder = new ContainerBuilder();
$builder->addDefinitions("pathOfConfigFiles");
$container = $builder->build();, (*2)

Il est conseillé de séparer les logiques du code, et donc les différents types de configuration. Exemple de séparation possible :
* Config générale du site (nombre d'article par page, les options pour la connexion à la BDD...)
* Config des classes (initialisation des différentes classes avec leurs constructeurs)
* Config du lien entre les modèles et les contrôleurs., (*3)

Le seul fichier obligatoire est "orm_config.php" qui regroupe l'appel aux entités, nécessaire pour le fonctionnement de l'ORM.
Pour plus d'information se reporter à la partie configuration., (*4)

Configuration

Les fichiers de configuration peuvent être placés où vous le souhaitez. Il seront retrouvés grâce à l'appel lors de l'initialisation du Container (cf. ci-dessus). Création de trois fichiers de config dans /src/config/ dans :
* config.php
* configClasses.php
* configController.php, (*5)

Ils doivent comporter un certains nombres d'informations obligatoires :, (*6)

PDO

Pour le bon fonctionnement du Framework, il est nécessaire d'initialiser PDO dans le Container. Pour ce faire, dans le fichier config.php :
'db.name' => 'nomDeLaBDD',
'db.user' => 'nomDUtilisateurPourSeConnecter',
'db.password' => 'MDP',
'db.host' => 'nomDuServeur'
'pdo.options' => [
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]
...dans le fichier configClasses.php :
PDO::class => function (ContainerInterface $c) {
    return new PDO(
        'mysql:host=' . $c->get('db.host') . ';dbname=' . $c->get('db.name') . ';charset=utf8',
        $c->get('db.user'),
        $c->get('db.password'),
        $c->get('pdo.options')
    );
}, (*7)

Configuration de Twig

Dans le fichier "config.php" :
'twig.options' => [],
'twig.views' => dirname(__DIR__, 2) . '/views'
Le tableau est l'ensemble des options qu'on passe à Twig lors de son initialisation (cf. Twig for Developers), il permettra par exemple de définir un fichier de cache pour les vues.
Le second paramètre est le dossier où se retrouveront toutes les vues. C'est un chemin relatif par rapport au dossier où se trouve le fichier de config et c'est par rapport à ce dossier qu'on appellera les vues dans les fonctions "render" des contrôleurs., (*8)

Dans le fichier "configClasses.php" :
Twig_Loader_Filesystem::class => object()->constructor(get('twig.views')),
Twig_Environment::class => object()->constructor(
    get(Twig_Loader_Filesystem::class),
    get('twig.options')
), (*9)

Configuration de l'application

Dans le fichier "config.php" :
'app.prefix' => '\App',
'app.routes' => __DIR__ . '/routes.xml'
La première option correspond au préfixe qu'on appliquera à Namespace de notre application. Ce Namespace se décomposera en : "prefixe de l'application" + "Nom du module appelé" + "Controller" + "Nom du Controller". Ici par exemple mon "PostController" sera dans le namespace : "App\Blog\Controller\PostController;".
La seconde option correspond au chemin pour appeler le fichier des routes (plus d'information ci-dessous)., (*10)

Dans le fichier "configClasses.php" on initialise le routeur :
Router::class => object()->constructor(
    get('app.prefix'),
    get('app.routes'),
    get(ContainerInterface::class)
), (*11)

Application

Une fois la configuration terminée, on crée les premiers blocs de l'application., (*12)

Base de l'application

Dans le dossier "src", le premier élément obligatoire est l'"AppController". Il est une jointure entre le contrôleur du Framework et l'application. Il permettra à l'utilisateur du Framework de créer des méthodes personnalisées.
Il doit se placer dans "src/App/Controller/AppController.php". Il doit étendre de "Jojotique\Framework\Controller\Controller". Tous les contrôleurs de l'application, étendront de ce "AppController"., (*13)

Les routes

Le framework est crée pour faire de l'URL Rewriting : toutes les adresses pointent vers le même fichier et c'est le routeur qui définie la route.
Les routes se créent dans le fichier "routes.xml". Elles sont écritent en XML., (*14)

Bases du dossier routes.xml

<?xml version="1.0" encoding="UTF-8" ?>
<routes>
    <route name="" path="" controller="" method="" />
</routes>, (*15)

Exemples de route

Route sans option :

<route name="general_accueil" path="^/accueil" controller="general" method="index" />
* Name : nom de la route, permet de ne pas avoir de doublon et défini le dossier d'appel du contrôleur. Il se définie en mettant "nom du module" + facultatif si plusieurs contrôleurs dans le module "nom du contrôleur" + "nom de la méthode". * Path : adresse qui permettra de sélectionner cette route; * Controller : contrôleur qui sera appelé, ici 'GeneralController.php'; * Method : méthode qui sera appelée dans le contrôleur., (*16)

Ici le routeur appelera la méthode "index" dans le contrôleur "App\General\Controller\GeneralController" : * "App" : définit dans les options; * "General" : définie dans le nom de la route; * "Controller" : architecture par défaut dans ce Framework; * "GeneralController" : définie dans le paramètre "controller" de la route + "Controller" par défaut dans ce Framework., (*17)

Route avec option :

<route name="blog_post_category" path="^/categorie/{slug: \w+}-{id: \d+}" controller="post" method="category" />
Pour "name", "controller" et "method" tout reste identique que pour les routes sans options. La différence se trouve dans "path". Ici on retrouve deux options qui seront récupérées par le routeur : * {slug: \w+} : récupère le "slug" de la catégorie. Il est composé de caractères alphanumériques, définie par "\w+"; * {id: \d+} : récupère l'"id". Il est composé uniquement de chiffres, définie par "\d+"., (*18)

Pour en savoir plus sur les options des regex. Ces options se récupère au niveau du paramètre de la méthode appelée dans "method".
Ex : si on appelle ici la méthode "category" de "App\Blog\Controller\PostController", pour récupérer le slug on fera :
public function category(array $vars)
{
    $slug = $vars['slug'];
}, (*19)

Le contrôleur

Tous les contrôleurs doivent étendre de "AppController". Il devra contenir, au moins, une méthode par route disponible (cf. ci-dessus)., (*20)

Si le contrôleur doit récupérer des informations au niveau de la base de données, il aura besoin de modèles qui se chargeront de le faire. La définition des modèles nécessaire est automatique lors de la création des contrôleurs par l'application., (*21)

Contrôleur et modèle

Pour que le contrôleur est la possibilité de faire appel à un modèle, il faut le définir dans les options. Dans le fichier "configController.php" :
'blog.post.models' => [
    'post' => get(PostModel::class),
    'category' => get(CategoryModel::class),
    'user' => get(UserModel::class)
],
Cette définition permettra au "App\Blog\Controller\PostController" de faire appel à : * PostModel; * CategoryModel; * UserModel, (*22)

Contrôleur et vue

Pour faire appel à la vue, le contrôleur a par défaut la méthode "render" :
$this->render('chemin de le vue', 'variables');
Le chemin est relatif au dossier définie en option dans Twig.
Les variables doivent être passées sous forme de tableau associatif. Ex. : compact('form', 'posts', 'categories'), (*23)

l'ORM

Pour récupérer des informations dans la BDD, ce Framework est équipé d'un ORM qui est là pour faire la jointure entre les contrôleurs, les modèles et les entités. Il servira à récupére de manière sécurisée les informations en BDD. De plus, il permet de manipuler la BDD comme si c'était un objet., (*24)

ORM et modèle

Lorsqu'on crée un modèle, il faut le faire étendre de "Jojotique\Framework\Model\Model". Il est également nécessaire d'implémenter la "Jojotique\ORM\Interfaces\ORMModelInterface".
La seule information indispensable au niveau du modèle, c'est le nom de la table avec laquelle elle va travailler :
Ex. : protected $table = 'gender';, (*25)

ORM et entité

Lorsqu'on crée une entité, il faut la faire étendre de "Jojotique\Framework\Entity\Entity". Il est également nécessaire d'implémenter la "Jojotique\Framework\Entity\EntityInterface". L'entité doit avoir comme nom celui de la tablle qu'elle représente :
Ex. : "protected $tableName = 'gender';", (*26)

Puis on définie en paramètre les colonnes de la table et on crée leurs getters et setters., (*27)

ORM et contrôleur

Récupération d'entité en BDD

Pour ce faire on utilise l'objet "select" qui se trouve par défaut dans tous les contrôleurs. Cet objet possède plusieurs méthodes qui réprésente les différentes parties d'un "SELECT" en SQL.
Ex. :
$gender = $this->select->select(['gender' => ['id', 'gender']])
    ->from('gender')
    ->where(['gender' => 'homme'])
    ->singleItem()
    ->execute($this->genderModel);, (*28)

Sauvegarde d'une entité en BDD

On utilise la méthode "save" de l'objet "select".
Ex. : $this->select->save($gender, $this->genderModel);, (*29)

L'ORMSelect fait la différence entre une entité qui existe déjà et une nouvelle entité. Si c'est le premier cas il fera un "UPDATE" dans la BDD, sinon il fera un "INSERT"., (*30)

Suppression d'une entité en BDD

On utilise la méthode "delete" de l'objet "select".
Ex. : $this->select->delete($gender, $this->genderModel);, (*31)

Pour aller plus loin

Pour plus d'information, se référer à la documentation de l'ORM., (*32)

Lancement de l'application

Une fois tout cela fait, dans le fichier "index.php", initialiser l'application grâce au container :
$app = $container->get(App::class);, (*33)

Puis lancer l'application :
$app->run();, (*34)

The Versions

28/03 2018

dev-master

9999999-dev

Micro Framework PHP basé sur la structure de Symfony. MVC compatible.

  Sources   Download

Apache-2.0

The Requires

 

by Avatar Giildo