Skip to content

Latest commit

 

History

History
204 lines (170 loc) · 9.01 KB

README.md

File metadata and controls

204 lines (170 loc) · 9.01 KB

php-basic-structure

Un framework léger pour accélérer vos développements sur des petits projets.

Présentation

L'objectif principal de ce projet est de se distinguer des frameworks actuels en ne fournissant qu'une base minimale pour commencer à développer.

Ce framework permet de simplifier les petits développements de sites web en proposant une architecture MVC2 et quelques fonctionnalités de base. Il peut également servir de base pour de plus gros développements.

Remarques

J'ai constaté que beaucoup de développeur amateurs/débutants ne se penchaient pas sur les frameworks en général. Cela souvent à cause de la complexité et le temps de mise en route de tels outils.
Utiliser un petit framework tel quel celui-ci permet de tester une nouvelle architecture et cela sans devoir lire des kilomètres de documentation. Enfin, cela est une bonne base pour ensuite migrer sur de plus gros environnements tel que Symfony.

co Ce framework est codé sans prétention, on peut faire mieux, beaucoup mieux même. D'ailleurs au départ ce n'était qu'un morceau réutilisable que j'utilisais pour mes développements, il n'était pas voué à être diffusé. Je l'ajoute à mon github au cas où des gens s'y intéresseraient !

Principales fonctionnalités

Peu de fonctions, mais un framework léger qui vous permet de changer facilement le code pour l'adapter.

  • Architecture MVC2 avec namespaces
  • Réécriture d'URL
  • Classe d'abstraction des modèles DAO et des requêtes simples
  • Outils d'inclusion de CSS et de JS
  • Autoload de classes
  • Utilisation de PDO
  • Contrôleur d'API json extensible
  • Gestion de vendors (libs externes)

Installation

  1. Téléchargez le dossier complet
  2. Copiez le contenu dans votre dossier de développement.
  3. Si le module mod_rewrite n'est pas activé sur Apache, activez-le.
  4. core/config.php : Modifiez vos informations de connexion à la base de données.
  5. core/init.php : Si besoin modifiez l'état du projet (production ou non) et les liens des constantes
  6. C'est terminé. Des exemples sont programmés dans controllers/example.php

Choix techniques

Les modèles sont les DAO du framework qui se chargent des appels à la base de données, les entity sont les modèles de réprésentation des données. Tous les éléments du framework sont programmés en objet. Les modèles (DAO) retournent par contre des tableaux par défaut. Cependant vous pouvez définir une entité par défaut qui sera créée et hydratée avec ce tableau via l'attribut :

```php ```

La classe Handler est un proxy pour différentes fonctionnalités/sous-classes (qu'il faut écrire). Je vous invite à réécrire cette classe et à utiliser votre propre gestionnaire d'erreurs et d'exceptions.

Utilisation rapide

Créer une page

Pour créer une page nommée contact :

  1. Vue : Créer un fichier dans views/ nommée contact.php
  2. Contrôleur : Créer un fichier dans controllers/ nommé contact.php
  3. Dans le contrôleur, créer une classe ContactController qui hérite de Controller
  4. Déclarer une méthode publique index() et copier ce code dedans : $this->view = "contact";
  5. Terminé ! Accéder à l'url : votresite.com/contact

// Exemple complet d'un controleur
<?php
namespace basic\controllers;
defined("_uniq_token_") or die('');

class ContactController extends \basic\core\Controller
	
	// méthode par défaut qui sera appelée
	public function index(){
		$this->view = "contact";
	}
}
?>

Utiliser du CSS et du JS

Par défaut votre page utilise reset.css et common.css. Ces deux classes permettent dans l'ordre de faire un reset CSS puis d'ajouter quelques classes génériques qui peuvent vous être utiles. Si vous souhaitez ajouter du code CSS global à toute votre application vous pouvez soit le mettre dans common.css soit créer un fichier css et l'ajouter dans le HEAD avec un LINK.

Pour ajouter du CSS/JS spécifique à une page précise, vous pouvez le faire dans le contrôleur PHP avec la méthode statique de CSS/JS :

```php Includer::add('css', 'fichier'); // ajoute un fichier CSS Includer::add('css', 'dossier/'); // ajoute un dossier (tous les CSS contenues) Includer::add('js', 'fichier'); // ajoute un fichier JS Includer::add('js', 'dossier/'); // ajoute un dossier (tous les JS contenus) ```

Tous les fichiers inclus par la classe Includer doivent être situés dans static/EXTENSION (ex: static/js, static/css, ...)
Bon à savoir : n'importe quel type de fichier peut être inclu de cette manière. Il faut qu'il soit stocké dans un dossier portant le nom de l'extension que vous voulez utiliser.

Passer des variables dans la vue

Les variables sont passées comme tableaux et elles sont accessibles via le nom de leur clef depuis la vue.

```php // dans le contrôleur $data['bonjour'] = "hello world"; $data['variable'] = array("Une autre variable", "sous forme de tableau"); $this->set($data);
// dans la vue
echo $bonjour; // affiche hello world
echo $variable[0]; // affiche 'Une autre variable'

<h4>Utiliser les modèles dans un contrôleur</h4>
<p>Pour récupérer des données de la base de données il faut demander à un Modèle de vous les récupérer. Pour utiliser un modèle pas besoin de l'instancier, une méthode s'en charge.</p>

```php
// dans un contrôleur pour charger un modèle User & News
$this->loadModel('User');
$this->loadModel('News');

// utilisation : on récupère des données
$user = $this->User->lastUserRegistered();
$article = $this->News->last();

Modèles et classe abstraite

Quelques exemples d'utilisation de la classe Model.php qui doit être étendue par les modèles de votre application. Ces méthodes permettent surtout de simplifier les requêtes SQL de base. Libre à vous de les utiliser.

// dans un contrôleur on charge le model
$this->loadModel('User');

// sélection simple
$user = $this->User->find(array('id' => 1)); // sql = SELECT * FROM user WHERE id = 1 LIMIT 1

// sélection complexe : le deuxième paramètre (5) est optionnel, il permet de limiter le nombre de tuples
$users = $this->User->findAll(array('age' => 10, 'taille' => '150'), 5); // SELECT * FROM user WHERE age = 10 AND taille = 150 LIMIT 5

// suppression
$this->User->delete(array('id' => 1)); // DELETE FROM user WHERE id = 1

// ajout
$this->User->add(array('age' => 25, 'taille' => 176, 'nom' => 'Spoke')); // INSERT INTO user (age, taille, nom) VALUES (25, 176, 'Spoke')

// modification
// le premier paramètre est le(s) tuple(s) que vous voulez modifier, le deuxième les valeurs à changer
$this->User->update(array("id" => 1, "my_key" => 'abc'), array("my_key" => 50, "kikoo" => "abcd"));

Il y a peu de méthodes dans Model.php. C'est volontaire et cela fait parti du concept de ce projet de laisser au programmeur le soin de coder les requêtes qui n'entrent pas le champ d'utilisation de Model.php
Le tableau de paramètre est uniquement traité comme AND pour la requête, pas de OR. Vous pouvez automatiser une jointure (systématique) en modifiant la variable $this->dependencies d'un modèle.
Toutes les requêtes de Model.php sont des requêtes préparées !

Requêtes SQL personnalisées

Toutes les classes qui héritent de Model possèdent un pointeur sur la connexion vers la base de données (voir TODO sur la classe core/Connection).
Vous pouvez donc effectuer facilement une requête dans n'importe quel modèle.

namespace basic\models;
defined("_uniq_token_") or die('');

// dans une classe héritant de model
class News extends \basic\core\Model {
	// $start et $end en INTEGER
	public function getNewsBetweenTwoDates($start, $end){
		// $this->db est le pointeur vers la connexion
		$req = $this->db->prepare("SELECT * FROM news WHERE date_publication BETWEEN :start AND :end");
		$req->bindParam('start', $start, PDO::PARAM_INT); // utilisation standard de PDO
		$req->bindParam('end', $end, PDO::PARAM_INT);
		$req->execute();

		return $req->fetchAll();
	}

	// Autre exemple avec une query simple 
	// Remarque 1 : Je vous conseille de ne jamais passer des variables dans les query simple mais d'utiliser les requêtes préparées pour le faire.
	// Remarque 2 : C'est juste un exemple car Model contient déjà une méthode pour ce genre de requête => $this->find(array('id' => $id))
	public function getNews($id){
		$req = $this->db->query("SELECT * FROM news WHERE id = ".intval($id));
		return $req->fetchAll();
	}
}

About

A small and lightweight PHP framework for fast development.