À la découverte de flow3 - t3con12
Post on 30-Jun-2015
260 Views
Preview:
TRANSCRIPT
À la découverte de FLOW 3
Mehdi Guermazi
À 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
À 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...
À 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
À 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
À 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
À 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>
À 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'
À la découverte de FLOW 3
Mehdi Guermazi
Résultat
À 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/
À 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 . '!';}
À 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.
À 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.
À 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
À 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());
}
À 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;
À 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;
À 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
À 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>
À 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.
À 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.');
À 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;
}
À 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
À 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
À 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)
À 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>
À 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>
À 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>
À 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>
À 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>
À 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;
À 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>
À 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
À 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 })
À 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 »
À 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
À 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.
À 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
À 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
À la découverte de FLOW 3
Mehdi Guermazi
Merci
● Les diapositives http://tinyurl.com/brogs4w
● Me suivre sur twitter @DjBouZz
● Me contacter mguermazi@infoglobe.ca
● Joindre Robert Lemke robert@typo3.org
● Suivre Robert Lemke @t3rob
top related