40
À la découverte de FLOW 3 Mehdi Guermazi

À La découverte de flow3 - t3con12

Embed Size (px)

Citation preview

Page 1: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Page 2: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Mehdi Guermazi

● Diplômé en Administration des affaires SIO

(Université Laval)

● Consultant web chez Infoglobe (2009)

● Membre fondateur de « La voix du libre » sur CKIA FM 88,3

● Habite à Québec

● J'aime faire de la musique, de la radio et du snow trash

Page 3: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Introduction FLOW3

● Environnement de développement d'application web fait en PHP

● Gratuit et opensource (LGPL v3)

● Vient concurrencer Symfony, CakePHP, CodeIgniter etc...

● Supporté par la communauté TYPO3 sous les ordres de Robert

Lemke (6000+ contributeurs)

● Regroupe la plupart des concepts en vogue : programmation

orientée aspects, domain-driven design, développement piloté par

les tests, l'intégration continue...

Page 4: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Historique

● Au début l'objectif était de restructurer le code pour TYPO3 V5

● Essai de différents environnements de développement

● Décision de créer FLOW3 qui englobe tous les bons points des

autres environnements de développement

Page 5: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Exigences minimales

● Un serveur web (Apache est recommandé avec le module

mod_rewrite activé)

● PHP 5.3.2 ou plus récent

● Une base de données compatible PDO comme MySQL

● Accès en ligne de commande

http://flow3.typo3.org/download

Page 6: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Installation de FLOW3

● Décompressez le dossier téléchargé dans votre dossier htdocs

● Configurer les droits d'accès aux fichiers

º ./flow3 core:setfilepermissions john www-data www-data

º Remplacer john par votre nom d'utilisateur

● Ajouter un nom de domaine dans fichier hosts

● Modifier la configuration du virtual host

/etc/apache2/sites-available/default

● Modifier la configuration générale dans un fichier de format yaml

Page 7: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Configuration du virtual host<VirtualHost *:80> DocumentRoot /var/www/FLOW3-1.0.3/Web ServerName dev.confooflow3.local SetEnv FLOW3_CONTEXT Development <Directory /var/www/FLOW3-1.0.3/> AllowOverride All </Directory></VirtualHost>

<VirtualHost *:80> DocumentRoot /var/www/FLOW3-1.0.3/Web ServerName confooflow3.local SetEnv FLOW3_CONTEXT Production <Directory /var/www/FLOW3-1.0.3/> AllowOverride All </Directory></VirtualHost>

Page 8: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Configuration/Settings.yaml (Base de données)####################### Global Settings######################

FLOW3:persistence:

backendOptions:driver: 'pdo_mysql'dbname: 'confooflow3'user: 'confooflow3'password: 'confooflow3'host: '127.0.0.1'path: '127.0.0.1'Port: 3306

doctrine:dbal:sessionInitialization: 'SET NAMES utf8 COLLATE utf8_unicode_ci'

Page 9: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Résultat

Page 10: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Création d'un package (Application web)

● Le code d'une application et ces ressources (comme les images, feuilles de style et gabarits) sont rassemblés dans un « Package »

● Chaque application est définie par une clé unique globale qui se compose du nom de votre compagnie et du nom de l'application.

● Le script Kickstart nous permet de créer une structure de base pour notre nouvelle application./flow3 kickstart:package Infoglobe.Demo

● Le script crée aussi un contrôleur par défaut qu'on peut afficher en visitant l'adresse suivante :dev.confooflow3.local/Infoglobe.Demo/

Page 11: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Aperçu d'un contrôleur● Le contrôleur « StandardController » créé par défaut par le

Kickstarter se retrouve dans Packages/Application/Infoglobe.Demo/Classes/Controller/

● Une méthode (fonction) indexAction est déjà créée c'est grâce à cette fonction qu'on a obtenu le résultat d'affichage dans le navigateur

● Créons l'action Hello ensemble : (Important!!! Les commentaires)/** * Hello action * * @param string $name Your name * @return string The hello */public function helloAction($name) { return 'Hello ' . $name . '!';}

Page 12: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Focus sur le domaine de travail (Domain Driven Design)

Alors que vous développez une application FLOW3, vous ne vous rendrez pas compte que le contenu est vraiment stocké dans une base de données. Votre code ne contiendra aucune requête SQL et vous n'aurez pas à créer la structure de vos tables.

Un objectif important lors de la conception de FLOW3 était de laisser le développeur se concentrer sur la logique du domaine de l'application (du domaine de travail de leur client) et de travailler dans un vrai environnement orienté-objet.

Page 13: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Domain Driven Design

● Une méthode de travail qui :

● Fournit un langage commun à toute l'équipe (les développeurs,

les concepteurs, le client)

● Simplifie la conception d'applications complexes

● Permet de se concentrer sur le domaine et la logique du

domaine d'activité du client

● FLOW3 est le premier environnement de développement accès

sur la conception selon de le domaine de travail.

Page 14: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Prenons un petit raccourcis

● Au lieu de programmer notre propre contrôleur, notre propre

modèle et notre propre vue, nous allons générer un exemple

● Nous allons créer un objet Film :

./flow3 kickstart:actioncontroller --generate-actions --generate-related

Infoglobe.Demo Film

Page 15: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Regardons de plus prêt

● L'indexAction affiche une liste de films. Tout ce que ça fait c'est

aller chercher l'information dans un dépôt (repository) et les

donner à la vue (View)

/** * Shows a list of films * * @return void */

public function indexAction() {$this->view->assign('films', $this->filmRepository->findAll());

}

Page 16: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Regardons de plus prêt

● Le repository prend soin de stocker ou de chercher les films déjà

stockés. La plus simple méthode utilisée est findAll() qui retourne

une liste de tous les objets de type Film

/*** @FLOW3\Inject* @var \Infoglobe\Demo\Domain\Repository\FilmRepository*/

protected $filmRepository;

Page 17: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Regardons de plus prêt

● PHP ne supporte pas les annotations nativement

● FLOW3 utilise les commentaires qui sont analysés par un parseur

● Par exemple l'annotation Inject demande à appeler la classe

FilmRepository tout juste après que la classe FilmController soit

instanciée

/*** @FLOW3\Inject* @var \Infoglobe\Demo\Domain\Repository\FilmRepository*/

protected $filmRepository;

Page 18: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Regardons de plus prêt

● Puisque FLOW3 repose sur un modèle MVC c'est la vue qui

s'occupe de l'affichage

● On retrouve la vue correspondante à une action d'un contrôleur de

Film dans le dossier Resouces/Private/Templates/Film/

Pour index c'est Resouces/Private/Templates/Film/Index.html

Page 19: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Regardons de plus prêt

● Les vues peuvent afficher le contenu qui a été affecté à des variables de gabarit

● L'espace réservé {Film.name} sera remplacé par la valeur réelle du nom de variable de

gabarit une fois le modèle est rendu.

● Les films pris dans le repository sont assignés à la variable de gabarit films. Le Gabarit

utilise une boucle for each pour afficher la liste de films

<ul><f:for each="{films}" as="film">

<li><f:link.action action="show" arguments="{film: film}">{film.name}</f:link.action><f:link.action action="edit" arguments="{film: film}">Edit</f:link.action><f:link.action action="delete" arguments="{film: film}">Delete</f:link.action>

</li></f:for>

</ul>

Page 20: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Regardons de plus prêt● Pour afficher un lien

<f:link.action action="show" arguments="{film: film}">{film.name}</f:link.action>

● La partie intéressant est l'attribut argments qui contient {film:film}

On renvoie dans les paramètres de l'url l'objet film qui a été

assigné dans la varaible de gabarit film.

● Dans l'attribut action on a choisit l'action « show » donc on appelle

le contrôleur actuel Film et l'action showAction en lui renvoyant

l'objet film.

● Si on clique sur le lien la méthode showAction sera appelée.

Page 21: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Regardons de plus prêt● newAction ne contient aucun code PHP elle ne fait qu'afficher la

vue qui contient seulement un formulaire.

● CreateAction est appelé quand le formulaire affiché par newAction

est soumis. Elle attend un objet de type film. Cette fois c'est un

nouveau et non un film existant.

● Il faut donc le créer dans la repository$this->filmRepository->add($newFilm);

● On affiche aussi un message à l'utilisateur pour lui affirmer que

son film a été créé$this->addFlashMessage('Created a new film.');

Page 22: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Le repository/*** Finds most recent posts excluding the given post** @param \F3\Blog\Domain\Model\Post $post Post to exclude from result* @param integer $limit The number of posts to return at max* @return array All posts of the $post's blog except for $post*/public function findRecentExceptThis(\F3\Blog\Domain\Model\Post $post, $limit = 20) {

$query = $this->createQuery();$posts = $query->matching($query->equals('blog', $post->getBlog()))

->setOrderings(array('date' => \F3\FLOW3\Persistence\QueryInterface::ORDER_DESCENDING))

->setLimit($limit)->execute()->toArray();

unset($posts[array_search($post, $posts)]);return $posts;

}

Page 23: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Le Modèle si on utilise doctrine 2 pure<?phpnamespace My\Example;

/*** @Entity(repositoryClass="BugRepository")*/class Bug {

/*** @var integer* @Id* @Column(type="integer")* @GeneratedValue*/public $id;

/** * @var string * @Column(type="string") */public $description

Page 24: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Doctrine 2 dans FLOW3<?phpnamespace My\Example;

/*** @Entity(repositoryClass="BugRepository")*/class Bug {

/*** @var integer* @Id* @Column(type="integer")* @GeneratedValue*/public $id;

/** * @var string * @Column(type="string") */public $description

Page 25: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

La vue

FLOW3 est livré avec un élégant, souple et sécurisé moteur de gabarits: Fluid

● Les modèles sont valables HTML

● Les modèles ne contiennent pas de code PHP

● l'accès aux objets, des structures de contrôle, boucles ...

● designer-friendly

● extensible (les aides de vue, les widgets)

Page 26: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

La vue

Exemple pour attribuer une chaîne à une variable fluid

// Dans le contrôleur

$this->view->assign('title', 'Welcome to Fluid');

<!-- Dans un gabarit fluid: -->

<head>

<title>{title}</title>

</head>

Page 27: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

La vue

Les variables peuvent être des objets

// Dans le contrôleur

$this->view->assign('conference', $conference);

<!-- Dans un gabarit fluid: -->

<div class="venue">

<p>Venue Street: {conference.venue.street}</p>

</div>

Page 28: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

La vue - Conditions

// Dans le contrôleur

$this->view->assign('post', $blogPost);

<!-- Dans un gabarit fluid: -->

<f:if condition="{post.comments}">

<f:then>There are some comments.</f:then>

<f:else>There are no comments.</f:else>

</f:if>

Page 29: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

La vue - Boucles

// Dans le contrôleur

$this->view->assign('ages', array("Karsten" => 34, "Robert" => 35));

<!-- Dans un gabarit fluid: -->

<ul>

<f:for each="{ages}" as="age" key="name">

<li>{name} is {age} year old.</li>

</f:for>

</ul>

Page 30: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

La vue - Boucles

// Dans le contrôleur

$this->view->assign('post', $blogPost);

<!-- Dans un gabarit fluid: -->

<f:if condition="{post.comments}">

<ul>

<f:for each="{post.comments}" as="comment" >

<li>{post.title}</li>

</f:for>

</ul>

</f:if>

Page 31: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Templating – Formulaire (modèle)<?phpnamespace Infoglobe\Demo\Domain\Model;

use TYPO3\FLOW3\Annotations as FLOW3;

/** * A Film * * @FLOW3\Scope("prototype") * @FLOW3\Entity */class Film {

/** * The name * @var string */protected $name;

Page 32: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Templating – Formulaire (Vue)<f:layout name="Default" /><f:section name="Title">New film</f:section><f:section name="Content">

<p>Just fill out the following form to create a new film:</p>

<f:form action="create" name="newFilm"><ol>

<li><label for="name">Name</label><f:form.textfield property="name" id="name" />

</li>

<li><f:form.submit value="Create" />

</li></ol>

</f:form></f:section>

Page 33: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Validation

● Validation pour la sécurité et validation pour l'intégrité

● les données entrantes doit être validée pour des raisons de

sécurité● Balisage malin dans le contenu soumis

● Injection d'SQL

● l'intégrité du modèle de domaine doit être assurée● un courriel doit être (syntaxiquement) valide

● Les numéros de carte de crédit ne doit comporter que des chiffres

Page 34: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Validation dans FLOW3

● vous ne voulez pas coder des validations dans vos

contrôleurs

● FLOW3 sépare la validation des préoccupations de votre

contrôleur

● pas de code PHP nécessaire pour la validation

● déclaré à travers les annotations

● Exemple@FLOW3\Validate(type="StringLength", options={ "minimum"=1, "maximum"=5 })

Page 35: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Les validateurs

● Les validateurs fournis par FLOW3 peuvent être appelés par leur

alias

● Count, Float, NotEmpty, RegularExpression, Uuid, DateTime,

NumberRange, StringLength, Alphanumeric, Integer, Number, String,

EmailAddress, Label, Raw, Text

● Les validateurs personnalisés doivent implémenter le

« ValidatorInterface »

Page 36: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Mise à jour automatique de la bd

● lors du premier démarrage de FLOW3 la structure de la

bd sera créé

● quand un modèle change, la structure est mise à jour

● Il faut être prudent avec les données existantes, les mise

à jour peuvent effacer des données.

● pour l'environnement de production, vous devez gérer

manuellement les modifications de structure

Page 37: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Support par ligne de commande

● Permettre aux administrateurs de l'application de la gérer

facilement pour le déploiement et pour d'autres actions

comme la création d'utilisateur par exemple.

● Permettre de créer vos propres actions en ligne de

commande.

Page 38: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Sécurité

● Sécurité accrue par défaut

● la sécurité est centralisée (AOP)

● calquée sur l'expérience du projet TYPO3 et Spring

Security (framework Java)

● assure l'authentification, l'autorisation, la validation, le

filtrage ...

● extensible pour une nouvelle authentification ou des

mécanismes d'autorisation

Page 39: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Programmation Orientée Aspect - AOP

● Paradigme de programmation

● POO pour conception par objets

● AOP conception transversale sur les aspects

● Avec FLOW3, il est facile (et possible) d'utiliser l'AOP en

PHP

Page 40: À La découverte de flow3 -  t3con12

À la découverte de FLOW 3

Mehdi Guermazi

Merci

● Les diapositives http://tinyurl.com/brogs4w

● Me suivre sur twitter @DjBouZz

● Me contacter [email protected]

● Joindre Robert Lemke [email protected]

● Suivre Robert Lemke @t3rob