Toute application Web dite dynamique nécessite une base de données ainsi que des outils qui permettront de manipuler ces données.
Dans la palette des outils à la disposition des développeurs PHP, on trouve entre autres les DBAL (DataBase Abstraction Layer ou couche d'abstraction de base de données) ou les ORM (Object Relational Mapping ou mapping objet-relationnel).
Ce deuxième cours concerne les tuples, séquences non modifiables d'éléments. On peut les étendre en tuples nommés en ajoutant un nom à chacune des entrées du tuple, appelées alors champs. Enfin, on peut aller plus loin et définir des objets en associant des fonctions à des données. Cette seconde partie introduit à la programmation orientée objet.
Ce premier cours présente les notions d'objet et de classe, et le lien entre elles. Il présente aussi le premier concept clé de la programmation orientée objet, à savoir l'encapsulation des données. Les exemples sont fournis dans plusieurs langages (Python, C#, Java, C++ et PHP).
objectif général : Acquérir les compétences nécessaires pour développer des sites Web dynamiques.
objectifs opérationnels :
Stocker et utiliser des données à l’aide des variables et des opérateurs.
Manipuler des tableaux et des chaînes de caractères.
Contrôler le flux d’exécution des instructions.
Définir et utiliser des fonctions.
Transférer des données.
Interfacer PHP avec MySQL.
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
L’arrivée de PHP 5.3 en milieu d’année 2009 a bouleversé la manière de développer des applications web. En effet, cette nouvelle version a apporté de nouveaux outils au langage tels que les espaces de nommage qui favorisent la réutilisabilité du code lorsqu’ils sont employés à bon escient. Les nouveaux frameworks de développement rapide ont aussi suivi le mouvement et reposent sur la base de PHP 5.3. C’est le cas de Symfony2 dont la version stable est prévue prochainement.
Cette présentation offre un tour d’horizon de la nouvelle architecture du framework qui s’articule autour de “bundles”, de librairies externes et de nombreux composants indépendants tels que le conteneur d’injection de dépendances. Nous dresserons un panorama des principales fonctionnalités offertes par le framework telles que la couche d’ORM Doctrine 2, le moteur de templating Twig et la gestion des formulaires. Nous nous intéresserons également à la gestion du cache HTTP, à la couche de sécurité ainsi qu’aux outils de débogage destinés à améliorer la productivité du développeur et la maintenance de l’application.
Ce cours présente comment définir de nouveaux objets en définissant des classes. Un objet est une instance d'une classe qui définit les variables d'instances (attributs) et méthodes (fonctionnalités) que les objets créés à partir de la classe auront.
Php 2 - Approfondissement MySQL, PDO et MVCPierre Faure
Introduction au langage de programmation PHP.
Présentation réalisée la première fois le lundi 10 mars 2014 à l'IIM : Institut de l'Internet et du Multimédia pour les années préparatoires.
Cette présentation a pour but d'approfondir les compétences PHP des élèves : utiliser des bases de données, comprendre PDO et le modèle MVC (basique).
Après présentation orale de ces slides, des exercices de mise en pratique ont été réalisés en Atelier avec les élèves.
L'exercice principal était de construire une plateforme similaire à twitter selon un modèle MVC.
Voici le plan de la présentation :
• Les bases de données : MySQL
- Principe
- phpMyAdmin
- Interagir avec une BDD
• Les fonctions
- La machine à carottes
- Exemple avec MySQL
- Les fonctions PHP
• Modèle Vue Contrôleur - MVC
- Principe
- Mise en pratique
• Quelques trucs à savoir a.$_FILES et $_POST
- $_SESSION
- L’indentation
- PHP + HTML = ?
Ce deuxième cours concerne les tuples, séquences non modifiables d'éléments. On peut les étendre en tuples nommés en ajoutant un nom à chacune des entrées du tuple, appelées alors champs. Enfin, on peut aller plus loin et définir des objets en associant des fonctions à des données. Cette seconde partie introduit à la programmation orientée objet.
Ce premier cours présente les notions d'objet et de classe, et le lien entre elles. Il présente aussi le premier concept clé de la programmation orientée objet, à savoir l'encapsulation des données. Les exemples sont fournis dans plusieurs langages (Python, C#, Java, C++ et PHP).
objectif général : Acquérir les compétences nécessaires pour développer des sites Web dynamiques.
objectifs opérationnels :
Stocker et utiliser des données à l’aide des variables et des opérateurs.
Manipuler des tableaux et des chaînes de caractères.
Contrôler le flux d’exécution des instructions.
Définir et utiliser des fonctions.
Transférer des données.
Interfacer PHP avec MySQL.
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
L’arrivée de PHP 5.3 en milieu d’année 2009 a bouleversé la manière de développer des applications web. En effet, cette nouvelle version a apporté de nouveaux outils au langage tels que les espaces de nommage qui favorisent la réutilisabilité du code lorsqu’ils sont employés à bon escient. Les nouveaux frameworks de développement rapide ont aussi suivi le mouvement et reposent sur la base de PHP 5.3. C’est le cas de Symfony2 dont la version stable est prévue prochainement.
Cette présentation offre un tour d’horizon de la nouvelle architecture du framework qui s’articule autour de “bundles”, de librairies externes et de nombreux composants indépendants tels que le conteneur d’injection de dépendances. Nous dresserons un panorama des principales fonctionnalités offertes par le framework telles que la couche d’ORM Doctrine 2, le moteur de templating Twig et la gestion des formulaires. Nous nous intéresserons également à la gestion du cache HTTP, à la couche de sécurité ainsi qu’aux outils de débogage destinés à améliorer la productivité du développeur et la maintenance de l’application.
Ce cours présente comment définir de nouveaux objets en définissant des classes. Un objet est une instance d'une classe qui définit les variables d'instances (attributs) et méthodes (fonctionnalités) que les objets créés à partir de la classe auront.
Php 2 - Approfondissement MySQL, PDO et MVCPierre Faure
Introduction au langage de programmation PHP.
Présentation réalisée la première fois le lundi 10 mars 2014 à l'IIM : Institut de l'Internet et du Multimédia pour les années préparatoires.
Cette présentation a pour but d'approfondir les compétences PHP des élèves : utiliser des bases de données, comprendre PDO et le modèle MVC (basique).
Après présentation orale de ces slides, des exercices de mise en pratique ont été réalisés en Atelier avec les élèves.
L'exercice principal était de construire une plateforme similaire à twitter selon un modèle MVC.
Voici le plan de la présentation :
• Les bases de données : MySQL
- Principe
- phpMyAdmin
- Interagir avec une BDD
• Les fonctions
- La machine à carottes
- Exemple avec MySQL
- Les fonctions PHP
• Modèle Vue Contrôleur - MVC
- Principe
- Mise en pratique
• Quelques trucs à savoir a.$_FILES et $_POST
- $_SESSION
- L’indentation
- PHP + HTML = ?
The quest for global design principles (SymfonyLive Berlin 2015)Matthias Noback
If you’re a programmer you make design decisions every second. You need to think, and often think hard, about everything. Luckily there are many useful design principles and patterns that you can apply. But some of them merely expose code smells. Others only help you design your classes. And some are applicable to packages only. Wouldn’t it be nice to have some more general, always useful, invariably applicable, foundational design principles? In this talk we’ll look at software from many different perspectives, and while we’re zooming in and out, we’ll discover some of the deeper principles that form the basis of proper object-oriented design. After attending this talk you will be able to make better design decisions by reflecting on the stream of messages that is flowing from object to object, and from application to application.
Replacing dependents with doubles is a central part of testing that every developer has to master. This talk goes over the different types of doubles and explains their place in testing, how to implement them in a mainstream mocking framework, and which strategies or doubles to use in different message exchange scenarios between objects. After this talk you will have moved a step forward in your understanding of testing in the context of object oriented programming.
Marcello reflects over the craftsmanship manifesto and its elements to uncover some interesting insights regarding the application of the underlying principles in real life projects and in the context of organisations and communities struggling to live up to the expectations it creates.
Writing infinite scalability web applications with PHP and PostgreSQLGabriele Bartolini
PostgreSQL 9.2 introduced native support for the JSON data type, as well as V8/Javascript and Coffeescript procedural languages.
Learn how you can write web applications in PHP using an intelligent and horizontally sharded cluster of PostgreSQL databases, bringing you infinite scalability and parallel processing.
This talk will guide you through the development lifecycle of the application, focusing on architecture, technologies, testing and deployment.
Si le tdd est mort alors pratiquons une autopsie mix-it 2015Bruno Boucard
Si Michel-Ange avait été développeur quels auraient été ses secrets. Quelle était la posture de cet artiste ? Quelle place occupent nos modèles mentaux lorsque nous développons ? La notion de design émergent qui accompagne les approches test-first (TDD, BDD,…) peut rendre plus d’une personne sceptique. En effet, comment concilier nos intuitions et projections mentales avec cette approche a priori minimaliste et contre-intuitive ?
L'ABC du BDD (Behavior Driven Development)Arnauld Loyer
Une introduction au Behavior Driven Development, avec plein d'idées pour tout de suite! et applicable à tout projet. Il sera question:
* de passer de l'incompréhension à savoir qu'on ne sait pas
* des westerns spaghetti aux Three Amigos,
* de reléguer le Comment au second plan pour laisser sa place au Pourquoi!
* de rendre des spécifications exécutables
* de découvrir qu'un concombre n'est pas qu'un Cucurbitacée aux feuilles tri-lobées
* d'automatisation comme outil de non-regression
Au cours de cette session, nous expliquerons ce qu'est le BDD. Nous verrons qu'il n'est pas question d'outils ou de tests, mais de collaboration et de discussion entre les différentes parties prenantes: du métier aux développeurs en passant par les testeurs. Cette presentation s'adresse à l'ensemble de ces populations en expliquant l'importance qu'il y a à se comprendre, et qu'il n'est pas nécessaire d'avoir des outils sophistiqués pour avoir des bénéfices immédiats.
Nous verrons quelques pratiques de discussion qui permettent d'arriver à une meilleure compréhension et à une description du besoin. Nous verrons aussi comment des exemples concrets permettent de s'assurer d'une compréhension commune et comment ils permettent de construire un langage unique et non ambigu. Nous verrons comment rendre ces spécifications executables en réutilisant les exemples construits précédemment et en les automatisant. Ceux-ci viendront renforcer les tests d'acceptance et devenir des tests de non regressions. Enfin, nous verrons que cette démarche nous permettra d'avoir une documentation vivante et toujours à jour de notre système.
Idées pour tout de suite
Communication, Clarification par des Exemples concrets, Spécifications exécutables
PhpSpec is a SpecBDD tool that enables you to use a TDD workflow that can transform the way you write PHP. In this session we will look at the TDD workflow and see how PhpSpec can be used to speed up your development; add regression safety, and improve your object-oriented design.
The Wonderful World of Symfony ComponentsRyan Weaver
Wow, Symfony Components!
In this talk, we'll look at the history of PHP, and the struggles as a community to create shared libraries between our large community. Find out the significance of PSR-0 and Composer in *your* life and how you can leverage libraries from all of PHP in your projects.
We'll also look at the most fundamental Symfony2 components - HttpFoundation, HttpKernel, EventDispatcher, & Routing - including those that have been adopted by Drupal 8. We'll also check out a bunch of the other interesting Symfony2 components that can be used as tools in any PHP project.
The goal of this talk is to show you just how easy finding and using high quality libraries has become in PHP. By the end, you'll be excited and ready to high-five all of your PHP friends.
Toute application Web dite dynamique nécessite une base de données ainsi que des outils qui permettront de manipuler ces données.Dans la palette des outils à la disposition des développeurs PHP, on trouve entre autres les DBAL (DataBase Abstraction Layer ou couche d'abstraction de base de données) ou les ORM (Object Relational Mapping ou mapping objet-relationnel).
Open close principle, on a dit étendre, pas extends !Engineor
Conférence en français sur le principe d'ouverture fermeture proposé à l'AFUP de Paris en février 2019, comportant des exemples d'implémentation du principe à l'aide de design patterns, avec ou sans utilisation d'un framework.
Vous avez déjà travaillé avec de vieux projet PHP (3,4), du “include-ception” ou tout simplement un framework non PSR-0? Voici un retour sur les étapes employé dans différent cas de migration de “legacy” vers Symfony 2.
Quelle place pour le framework Rails dans le développement d'application web5pidou
Cette présentation a été réalisée dans le cadre des Rencontres Mondiales décentralisées du Logiciel Libre (RMLLd) qui se sont déroulées du 1er au 3 Juillet 2011 à Saint-Joseph (Ile de la Réunion).
Ce cours présente la notion d'héritage entre classes qui permet de construire une relation de type "is-a". On crée une sous-classe à partir d'une super-classe, pour en hériter une partie de ses membres. On peut ensuite y ajouter des membres spécifiques. Ce cours présente également la redéfinition de méthodes, et comment utiliser les modificateurs de visibilité des membres.
Qu'est ce que PHP ? Dans ce diaporama, vous allez découvrir les principes de base de PHP dans une courte introduction et apprendre à créer vous aussi des sites web dynamiques.
Pour plus de tuto: https://www.funinformatique.com/comment-pirater-un-compte-facebook/
Découvrez le noyau d'internationalisation du Zend FrameworkMickael Perraud
Le Zend Framework est fourni avec un noyau d’internationalisation (I18N) complet.
Avec ce premier Webinar à propos du noyau I18N, vous découvrirez les bases de l’internationalisation. Ce Webinar traitera des détails de traduction, décrira les différences entre les « adapters » disponibles et vous expliquera comment mettre en place les traductions.
Vous découvrirez comment utiliser des traductions au sein d’une vue ou d’un contrôleur et comment travailler avec les pluriels.
1. {
Accès aux bases de
données relationnelles
et ORM en PHP
2. { Accès aux bases de données
relationnelles et ORM en PHP
Toute application Web dite dynamique
nécessite une base de données ainsi que des
outils qui permettront de manipuler ces
données.
Dans la palette des outils à la disposition des
développeurs PHP, on trouve entre autres les
DBAL (DataBase Abstraction Layer ou couche
d'abstraction de base de données) ou les ORM
(Object Relational Mapping ou mapping objet-
relationnel).
30/03/2011 Mickaël Perraud 2
3. { Accès aux bases de données
relationnelles et ORM en PHP
3 interventions :
Présentation de différents DBAL
Présentation de 2 ORM :
Propel
Doctrine2
30/03/2011 Mickaël Perraud 3
4. { Accès aux bases de données relationnelles
Contributeur ZF depuis 2007 (Zend_Db, Zend_Barcode)
Responsable documentation française
Donne des webinars sur ZF en partenariat avec Zend
Travaille sur l'aide à la traduction et propose les
versions déconnectées de la documentation PDF / CHM
Vice-trésorier AFUP 2011
@mikaelkael / http://mikaelkael.fr
30/03/2011 Mickaël Perraud 4
5. { Retournons en arrière
On a commencé par tout écrire en dur :
$lien = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$lien) {
die('Impossible de se connecter : ' . mysql_error());
}
$db = mysql_select_db('foo', $lien);
if (!$db) {
die ('Impossible de sélectionner la base de données : ' . mysql_error());
}
$requete = 'SELECT * FROM maTable WHERE id = ' . $_GET['id'];
$resultat = mysql_query($requete);
while($ligne = mysql_fetch_assoc($resultat)) {
echo $ligne['id'].': '.$ligne['valeur'];
}
30/03/2011 Mickaël Perraud 5
6. { Retournons en arrière
Puis on a ”amélioré” :
//config.php
define('DB_HOST', 'localhost');
define('DB_USERNAME', 'mysql_user');
define('DB_PASSWORD', 'mysql_password');
define('DB_DATABASE', 'mysql_base');
//db.php
require_once 'config.php';
$lien = mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD);
if (!$lien) {
die('Impossible de se connecter : ' . mysql_error());
}
$db = mysql_select_db(DB_DATABASE, $lien);
if (!$db) {
die ('Impossible de sélectionner la base de données : ' . mysql_error());
}
30/03/2011 Mickaël Perraud 6
7. { Retournons en arrière
Puis les classes sont arrivées :
class BDD {
var $connexion;
function BDD() {
$this->connexion = $this->connecte(DB_TYPE);
}
function connecte($type = 'mysql') {
switch($type) {
case 'mysql':
return mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD);
break;
case 'oci8':
//...
30/03/2011 Mickaël Perraud 7
8. { PDO
PDO = PHP Data Object
Ecrit en C
Introduit en PHP 5.0 en 2004
Activé par défaut avec PHP 5.1
Fournit une interface d'abstraction à l'accès
aux données
Plus sécurisé (si bien utilisé)
30/03/2011 Mickaël Perraud 8
10. { PDO : reprenons notre exemple
La connexion :
try {
$dbh = new PDO('mysql:host=localhost;dbname=' . DB_DATABASE, DB_USER, DB_PASSWORD);
echo 'Connected!';
} catch (PDOException $e) {
echo $e->getMessage();
}
En changeant de driver :
try {
$dbh = new PDO('oci:dbname=' . DB_DATABASE, DB_USER, DB_PASSWORD);
echo 'Connected!';
} catch (PDOException $e) {
echo $e->getMessage();
}
Ce qui va suivre est désormais indépendant du driver
30/03/2011 Mickaël Perraud 10
11. { PDO : requêtes préparées
PDO peut être utilisée avec ou sans requêtes
préparées
Pour des raisons de sécurité, préférez les
requêtes préparées :
$stmt = $dbh->prepare('SELECT nom, prenom FROM utilisateurs WHERE id_utilisateur = :id');
$stmt->bindParam('id', $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$resultat = $stmt->fetchAll();
L'assignation peut être nommée (ci-dessus) ou
numérique
30/03/2011 Mickaël Perraud 11
12. { PDO : lecture des résultats
Il existe plusieurs manières de récupérer les résultats
via PDO :
$resultat = $stmt->fetchAll(PDO::FETCH_...); // Toutes les lignes
//ou
$resultat = $stmt->fetch(PDO::FETCH_...); // Ligne par ligne
Et plusieurs mode de récupération (PDO::FETCH_*) :
PDO::FETCH_ASSOC :
Array
(
[nom] => Perraud
[prenom] => Mickael
)
30/03/2011 Mickaël Perraud 12
14. { PDO : lecture des résultats
Le meilleur pour la fin ? PDO::FETCH_CLASS
Prend un résultat et le retourne sous la forme
d'une classe
On peut instancier la classe directement par
PDO
30/03/2011 Mickaël Perraud 14
15. { PDO::FETCH_CLASS
Notre classe : class Utilisateur {
private $_nom;
private $_prenom;
public function __set($attribut, $valeur)
{
$this->{"set".ucfirst($attribut)} = $valeur;
}
public function setNom($nom)
{
$this->_nom = $nom;
}
public function getNom()
class Utilisateur { {
public $nom; return $this->_nom;
public $prenom; }
} public function setPrenom($prenom)
{
$this->_prenom = $prenom;
}
public function getPrenom()
{
return $this->_prenom;
}
public function __toString()
{
return $this->_prenom . ' ' . $this->_nom;
}
}
30/03/2011 Mickaël Perraud 15
16. { PDO::FETCH_CLASS
Interrogeons la base :
$stmt = $dbh->prepare('SELECT * FROM utilisateurs');
$resultat = $stmt->fetchAll(PDO::FETCH_CLASS, 'Utilisateur');
foreach($resultat as $class) {
echo $class;
// Affiche par exemple : Mickael Perraud
}
30/03/2011 Mickaël Perraud 16
17. { Ce que PDO ne fait pas
Ne fournit pas une abstraction de base de données :
il ne réécrit pas le SQL
Il n'émule pas des fonctionnalités manquantes
30/03/2011 Mickaël Perraud 17
18. { Zend_Db
Composant d'accès aux bases de données de Zend
Framework
Contient différents sous composants :
Zend_Db_Adapter : abstraction de base de données
Zend_Db_Select : abstraction de requête de type
”SELECT”
Zend_Db_Table : ”Table Data Gateway” -
http://martinfowler.com/eaaCatalog/tableDataGateway.html
Zend_Db_Table_Row : ”Row Data Gateway” -
http://martinfowler.com/eaaCatalog/rowDataGateway.html
30/03/2011 Mickaël Perraud 18
19. { Zend_Db_Adapter
Surcharge PDO et certaines extensions
(MySQLi, Oci8, Db2, Sqlsrv) en fournissant une
interface commune
Instanciation via la fabrique de Zend_Db :
$db = Zend_Db::factory('Pdo_Mysql', array('host' => 'localhost',
'username' => 'mysql_user',
'password' => 'mysql_password',
'dbname' => 'mysql_database'));
30/03/2011 Mickaël Perraud 19
21. { Zend_Db : lecture des résultats
Outre fetchAll() ou fetch() de PDO
(renommé en fetchRow()), on dispose de :
fetchAssoc()
fetchCol()
fetchOne()
fetchPairs()
30/03/2011 Mickaël Perraud 21
22. { Zend_Db : autres fonctions
Gestion du schéma :
listTables()
describeTable()
Interface générique de gestion des
transactions (beginTransaction(), commit(),
rollback())
Abstraction de la clause limit()
30/03/2011 Mickaël Perraud 22
23. { Zend_Db_Select
Abstraction DQL : permet de construire des
requêtes de type ”SELECT” en PHP
// Construire cette requête :
// SELECT produit_id, produit_nom, prix
// FROM "produits"
// WHERE (prix > 100.00)
// AND (prix < 500.00)
$prixminimum = 100;
$prixmaximum = 500;
$select = $db->select()
->from('produits',
array('produit_id', 'produit_nom', 'prix'))
->where('prix > ?', $prixminimum)
->where('prix < ?', $prixmaximum);
30/03/2011 Mickaël Perraud 23
24. { DoctrineDBAL
Partie de Doctrine destinée à l'abstraction des bases
de données :
Plusieurs sous-composants :
DoctrineDBALDriver : surcouche de PDO et
quelques drivers (pas de SQL)
DoctrineDBALPlatform : abstraction de la
génération de requêtes et de fonctionnalités (SQL)
DoctrineDBALSchema : abstraction de la gestion du
schéma
DoctrineDBALType : abstraction du typage avec
mapping PHP
30/03/2011 Mickaël Perraud 24
25. { DoctrineDBAL
Connexion :
$connexion = DriverManager::getConnection(array('dbname' => 'mysql_database',
'user' => 'mysql_user',
'password' => 'mysql_password',
'host' => 'localhost',
'driver' => 'pdo_mysql'));
Exécution de requêtes préparées :
$sql = "SELECT * FROM utilisateurs WHERE id = ? AND status = ?";
$stmt = $connexion->prepare($sql);
$stmt->bindValue(1, $id);
$stmt->bindValue(2, $status);
$stmt->execute();
On retrouve une API de récupération de
données très similaire à ce qui précède pour
Zend_Db
30/03/2011 Mickaël Perraud 25