À la découverte de flow3 - t3con12

Post on 30-Jun-2015

260 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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