Catapult framework, version 0.1 : "origin"

Description

Bonjour à tous.
Bon voilà un énorme travail sur lequel je suis depuis un long moment.
Je réalise un framework non pas pour concurrencer les grands Zend, Symfony, Cake et autres, mais pour avoir un framework fonctionnel, légé afin de réaliser des sites suffisament importants pour demander une aide en développement et pas sufffisament importants pour utiliser les "monstres" actuels.

L'autre motivation est personnelle, c'est pour voir ce dont je suis capable et de ce point de vue là, je compte sur vous pour relever mes erreurs, ainsi que vos suggestions/remarques/critiques sur une partie ou toute du framework.

Sachez qu'il est loin d'être fini et qu'il reste encore beaucoup de travail à faire. La version actuelle est fonctionnelle, c'est pour cela que je la publie, mais vous ne trouverez pas tous les éléments tel qu'on les trouves sur Zend. La gestion des utilisateurs par exemple, est une fonctionnalité à venir. (entre autre).

Pour voir les différens apports en fonction des évolutions, vous pouvez allez faire un tour sur le site que j'ai (vite fait) mis en place pour l'occasion : http://catapult.reflectiv.net.

Voici un petit exemple de son utilisation :

Source / Exemple :


<?php
// Tout d'abord, le fichier de configuration.
// config.php
// Cet exemple contient TOUTES les variables utilisées par chaque classes, et leur valeur sont celle par défaut
// (en gros cette config ne sert à rien :p) Elle est juste là pour vous montrer comment cela fonctionne
$config['Router']['Controller'] = 'Accueil';
$config['Router']['Method'] = 'index';
$config['Request']['Security']['MaxArgs'] = 10;
$config['Request']['Security']['ParseArgs'] = true;

$config['EventHandler']['Display'] = true;
$config['EventHandler']['DisplayErrors'] = E_ALL;
$config['EventHandler']['Log'] = true;
$config['EventHandler']['LogErrors'] = 0;
$config['EventHandler']['RedirectPath'] = 'error.html';
$config['EventHandler']['RedirectErrors'] = 0;
$config['EventHandler']['IgnoreRepeated'] = true;

$config['Libraries']['Log']['Path'] = 'errors.log';

$config['Libraries']['Upload']['DestinationFolder'] = '';
$config['Libraries']['Upload']['FileName'] = '';
$config['Libraries']['Upload']['FilePath'] = '';
$config['Libraries']['Upload']['AllowedExt'] = array ();
$config['Libraries']['Upload']['Rename'] = false;
$config['Libraries']['Upload']['CleanFileName'] = false;
$config['Libraries']['Upload']['CreateSubFolders'] = true;
$config['Libraries']['Upload']['MaxFileSize'] = 0;
$config['Libraries']['Upload']['IsImage'] = false;

$config['Loader']['Paths']['Base'] = '../Catapult/';
$config['Loader']['Paths']['App'] = '';
$config['Loader']['Paths']['Controller'] = 'Controllers';
$config['Loader']['Paths']['Model'] = 'Models';
$config['Loader']['Paths']['View'] = 'Views';
$config['Loader']['Exts']['Controller'] = '.php';
$config['Loader']['Exts']['Model'] = '.php';
$config['Loader']['Exts']['View'] = '.phtml';

$config['Controller']['defaultContentType'] = 'text/html';

// Voici un paramètre. On peux en ajouter à notre guise, comme cela nous plait
$config['dsn'] = 'mysql://root@localhost/fcpe90';

?>

<?php
// Ensuite, le fichier index.php
// Fichier mâitre qui s'occupe du travail principal ! :)
// Remarquez comme il est simple :p (mais on peux le complexifier :p)
require_once ('../Catapult/Controller/FrontController.php');

$oCfg = Config::getInstance ();
$oCfg->loadFromPhp ('config.php');

$oCFC = new FrontController ();
$oCFC->init ();

?>

<?php
// Un controller parmis tant d'autres :
class IndexController extends Controller {

	// init est une fonction appelée par le constructeur, c'est une sorte de __construct pour votre controller
	protected function init () {
		// Chargement du modèle de base de donnée avec les paramètres de connexion donnée dans le fichier de config
		$this->loadDb ($this->Config->dsn);
		$this->setContentType("Text/html"); // Définition du type de rendu. A pour effet d'instancier la classe appropriée pour le rendu.

		$aInfos['title'] = "Bienvenue sur mon site";

		// Chargement du haut de la page avec les variables préalablement chargées (appelera la page header.phtml dans le repertoire View/
		$this->Response->preRender ('header', $aInfos);
		$this->Response->postRender ('footer');
		//  preRender permettra un rendu  avant le rendu principal, et postRender  permettra un rendu apres le rendu principal (cela évite d'appeler une méthode __destruct par exemple pour faire un footer)
	}

	public function index () {
		// Dans notre cas on récupere les valeurs de la ligne qui correspond à la condition WHERE dans la base de donnée
		// Admirrez la simplicité !!!!!
		$this->Response->render ('body', $this->Db->executeLine ('SELECT title, content FROM texts WHERE id=1;'));
	}

}
// Bon c'est vraiment quelque chose de simple afin de vous montrer, tout n'est pas détaillé !

?>

<?php
// le fichier header maintenant :
// Contient que du html quasiment !
?>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
	<head>
		<title><?php echo $title; ?></title>
		<link rel="stylesheet" href="styles.css" type="text/css"/>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
		<meta name="Identifier-url" content="http://www.fcpe90.com"/>
		<meta http-equiv="Content-Language" content="fr"/>
		<meta name="Description" content="none"/>
		<meta name="Keywords" content="fcpe, ecole, école, aide, association, associations, aides"/>
		<meta name="Author" content="fcpe90"/>
		<meta name="Robots" content="index,follow,all"/>
		<meta name="revisit-after" content="3 days"/>
	</head>
	<body>
		<div id="main">
			<div id="menu">
				<ul>
					<li>Accueil</li>
					<li>A propos</li>
					<li>...</li>
					<li>Contact</li>
				</ul>
			</div>
			<div id="content">
<?php
// Le fichier footer maintenant
// Aussi que du html !
?>
		</div>
	</body>

</html>

<?php
// Et un exemple de fichier body.phtml :
?>
		<h1><?php echo $title; ?></h1>
			<div><?php echo $content; ?></div>

Et voila !! :)

Conclusion :


Pour le moment malheureusement, il n'y a aucune documentation possible, faute de temps.
Les sources sont détaillées du mieux que j'ai put et j'ai fait en sorte de proposer un travail de qualité.
Sachez que la couche d'abstraction aux bases de données sera entièrement revu dans la version 0.2. En effet, actuellement elle est basée sur "mon propre systeme" d'abstraction. Pour la version 2, le modele sera calqué sur PDO afin de rendre compatible sans modification de code un site utilisant PDO ou mes classes (vous n'aurez juste qu'à préfixer votre dsn par pdo_ pour utiliser le driver pdo fournit par php)

Je n'ai pas mis cette source pour en faire de la publicité (c'est encore trop tot ;)), mais plus pour vous montrer de quoi est capable PHP et aussi pour avoir vos avis sur ce travail.
(Je n'attends pas de "tu réinvente la roue", je suis déjà au courrant ;) :p)

J'attends vos commentaires avec impatience !! :)

Bonne journée à vous
Cordialement :)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.