<commit_before><p align="center">
    <img align="center" src="https://cloud.githubusercontent.com/assets/4491532/21667795/e69dec6e-d2c9-11e6-8563-133291489ed3.png" width="45%">           
</p>

---
<p align="center"><i>Framework PHP simple et léger</i></p>

---

[![GitHub release](https://img.shields.io/github/release/dadajuice/zephyrus.svg)]()
[![Travis](https://img.shields.io/travis/dadajuice/zephyrus.svg)]()
[![Code Climate](https://img.shields.io/codeclimate/github/dadajuice/zephyrus.svg)]()
[![Code Climate](https://img.shields.io/codeclimate/coverage/github/dadajuice/zephyrus.svg)]()
[![StyleCI](https://styleci.io/repos/77175312/shield?branch=master)](https://styleci.io/repos/77175312)
[![GitHub issues](https://img.shields.io/github/issues/dadajuice/zephyrus.svg)]()
[![license](https://img.shields.io/github/license/dadajuice/zephyrus.svg)]()

# Fonctionnalités
* Structure de projet simpliste
* Routes avec mécanisme MVC
* Préprocesseur HTML _[Pug](https://github.com/pug-php/pug)_ intégré pour le rendu des vues
* Patron courtier intégré pour l’interaction avec une base de données
* Mécanisme uniforme pour gérer les validations d’un formulaire
* Mesures contre le détournement de session intégrées
* Données de la session chiffrées sur le serveur
* Protection automatique des formulaires contre les attaques CSRF
* Mécanisme d’autorisation sur les routes
* Détecteur d’intrusion intégré (_[Expose](https://github.com/enygma/expose)_)
* Manipulation simplifiée des en-têtes CSP
* Configuration d’un projet simple et rapide
* Plusieurs utilitaires rapides : cryptographie, pagination, validations, téléversements, gestionnaire d'erreurs, transport de messages, etc.

# Installation
Zephyrus nécessite PHP 7 et, présentement, supporte uniquement Apache comme serveur web (pour un autre type de serveur, il suffirait d’adapter les fichiers .htaccess). Le gestionnaire de dépendance [Composer](https://getcomposer.org/) est également requis. La structure résultante de l’installation contient plusieurs exemples pour faciliter les premiers pas.

#### Option 1 : Installation depuis composer (recommandé)
```
$ composer create-project zephyrus/framework nom_projet
```

#### Option 2 : Depuis une archive
```
$ mkdir nom_projet
$ cd nom_projet
$ wget https://github.com/dadajuice/zephyrus-framework/archive/v0.9.9.2.tar.gz
$ tar -xvf v0.9.9.2.tar.gz --strip 1
$ composer install
```

#### Option 3 : Depuis les sources (version de développement)
```
$ git clone https://github.com/dadajuice/zephyrus-framework.git
$ composer install  
```

# Utilisation

#### Exemple 1 : Affichage d'une page HTML simple

app/controllers/SampleController.php
```php
<?php namespace Controllers;

use Zephyrus\Application\Controller;

class SampleController extends Controller
{
    public function initializeRoutes()
    {
        $this->get("/sample", "index");
        $this->get("/sample/{id}", "read");
    }

    public function index()
    {
        $this->render('sample', ['message' => 'Bonjour le monde !']);
    }
    
    public function read($id)
    {
        $this->render('sample', ['message' => 'ID = ' . $id]);
    }
}  
```

app/views/sample.pug
```pug
doctype html
html
  head
    title Exemple
    meta(charset="utf-8")
  body
    #container
      h2=message
```

#### Exemple 2 : Traitement d'un formulaire en POST
app/controllers/SampleController.php
```php
<?php namespace Controllers;

use Zephyrus\Application\Controller;
use Zephyrus\Application\Flash;
use Zephyrus\Application\Form;
use Zephyrus\Utilities\Validator;

class SampleController extends Controller
{
    public function initializeRoutes()
    {
        $this->get("/sample", "index");
        $this->get("/sample/{id}", "read");
        $this->post("/sample", "insert");
    }

    public function index()
    {
        $this->render('sample', ['message' => 'Bonjour le monde !']);
    }

    public function read($id)
    {
        $this->render('sample', ['message' => 'ID = ' . $id]);
    }

    public function insert()
    {
        $form = $this->buildForm();       
        $form->addRule('firstname', Validator::NOT_EMPTY, "Le prénom ne doit pas être vide");
        $form->addRule('lastname', Validator::NOT_EMPTY, "Le nom ne doit pas être vide");
        $form->addRule('email', Validator::NOT_EMPTY, "Le courriel ne doit pas être vide");
        $form->addRule('email', Validator::EMAIL, "Le courriel est invalide", Form::TRIGGER_FIELD_NO_ERROR);

        if (!$form->verify()) {
            $messages = $form->getErrorMessages();
            Flash::error($messages);
            $this->response->redirect("/sample");
        }

        echo "Bravo !";
    }
}
```
<commit_msg>Updated controller code in readme<commit_after><p align="center">
    <img align="center" src="https://cloud.githubusercontent.com/assets/4491532/21667795/e69dec6e-d2c9-11e6-8563-133291489ed3.png" width="45%">           
</p>

---
<p align="center"><i>Framework PHP simple et léger</i></p>

---

[![GitHub release](https://img.shields.io/github/release/dadajuice/zephyrus.svg)]()
[![Travis](https://img.shields.io/travis/dadajuice/zephyrus.svg)]()
[![Code Climate](https://img.shields.io/codeclimate/github/dadajuice/zephyrus.svg)]()
[![Code Climate](https://img.shields.io/codeclimate/coverage/github/dadajuice/zephyrus.svg)]()
[![StyleCI](https://styleci.io/repos/77175312/shield?branch=master)](https://styleci.io/repos/77175312)
[![GitHub issues](https://img.shields.io/github/issues/dadajuice/zephyrus.svg)]()
[![license](https://img.shields.io/github/license/dadajuice/zephyrus.svg)]()

# Fonctionnalités
* Structure de projet simpliste
* Routes avec mécanisme MVC
* Préprocesseur HTML _[Pug](https://github.com/pug-php/pug)_ intégré pour le rendu des vues
* Patron courtier intégré pour l’interaction avec une base de données
* Mécanisme uniforme pour gérer les validations d’un formulaire
* Mesures contre le détournement de session intégrées
* Données de la session chiffrées sur le serveur
* Protection automatique des formulaires contre les attaques CSRF
* Mécanisme d’autorisation sur les routes
* Détecteur d’intrusion intégré (_[Expose](https://github.com/enygma/expose)_)
* Manipulation simplifiée des en-têtes CSP
* Configuration d’un projet simple et rapide
* Plusieurs utilitaires rapides : cryptographie, pagination, validations, téléversements, gestionnaire d'erreurs, transport de messages, etc.

# Installation
Zephyrus nécessite PHP 7 et, présentement, supporte uniquement Apache comme serveur web (pour un autre type de serveur, il suffirait d’adapter les fichiers .htaccess). Le gestionnaire de dépendance [Composer](https://getcomposer.org/) est également requis. La structure résultante de l’installation contient plusieurs exemples pour faciliter les premiers pas.

#### Option 1 : Installation depuis composer (recommandé)
```
$ composer create-project zephyrus/framework nom_projet
```

#### Option 2 : Depuis une archive
```
$ mkdir nom_projet
$ cd nom_projet
$ wget https://github.com/dadajuice/zephyrus-framework/archive/v0.9.9.2.tar.gz
$ tar -xvf v0.9.9.2.tar.gz --strip 1
$ composer install
```

#### Option 3 : Depuis les sources (version de développement)
```
$ git clone https://github.com/dadajuice/zephyrus-framework.git
$ composer install  
```

# Utilisation

#### Exemple 1 : Affichage d'une page HTML simple

app/controllers/SampleController.php
```php
<?php namespace Controllers;

use Zephyrus\Application\Controller;

class SampleController extends Controller
{
    public function initializeRoutes()
    {
        $this->get("/sample", "index");
        $this->get("/sample/{id}", "read");
    }

    public function index()
    {
        return $this->render('sample', ['message' => 'Bonjour le monde !']);
    }
    
    public function read($id)
    {
        return $this->render('sample', ['message' => 'ID = ' . $id]);
    }
}  
```

app/views/sample.pug
```pug
doctype html
html
  head
    title Exemple
    meta(charset="utf-8")
  body
    #container
      h2=message
```

#### Exemple 2 : Traitement d'un formulaire en POST
app/controllers/SampleController.php
```php
<?php namespace Controllers;

use Zephyrus\Application\Controller;
use Zephyrus\Application\Flash;
use Zephyrus\Application\Form;
use Zephyrus\Utilities\Validator;

class SampleController extends Controller
{
    public function initializeRoutes()
    {
        $this->get("/sample", "index");
        $this->get("/sample/{id}", "read");
        $this->post("/sample", "insert");
    }

    public function index()
    {
        return $this->render('sample', ['message' => 'Bonjour le monde !']);
    }

    public function read($id)
    {
        return $this->render('sample', ['message' => 'ID = ' . $id]);
    }

    public function insert()
    {
        $form = $this->buildForm();       
        $form->addRule('firstname', Validator::NOT_EMPTY, "Le prénom ne doit pas être vide");
        $form->addRule('lastname', Validator::NOT_EMPTY, "Le nom ne doit pas être vide");
        $form->addRule('email', Validator::NOT_EMPTY, "Le courriel ne doit pas être vide");
        $form->addRule('email', Validator::EMAIL, "Le courriel est invalide", Form::TRIGGER_FIELD_NO_ERROR);

        if (!$form->verify()) {
            $messages = $form->getErrorMessages();
            Flash::error($messages);
            return $this->redirect("/sample");
        }

        echo "Bravo !";
    }
}
```

{'fraction_non_alphanumeric': 0.14770671490901352, 'fraction_numerical': 0.015324039587102267, 'mean_word_length': 3.922996333158722, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 60, 'https://': 28, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 4, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1903828', 'n_tokens_mistral': 3209, 'n_tokens_neox': 3060, 'n_words': 711}