• Aucun résultat trouvé

[PDF] Formation pour démarrer facilement avec Symfony | Cours Informatique

N/A
N/A
Protected

Academic year: 2021

Partager "[PDF] Formation pour démarrer facilement avec Symfony | Cours Informatique"

Copied!
28
0
0

Texte intégral

(1)

Symfony

SYMFONY, UN OUTIL PHP

POUR GAGNER DU TEMPS...

(2)

I : Introduction

1 : Présentation du Framework

2 : Qu'est ce qu'un modèle MVC

3 : Avantages principaux de Symfony (+ utilisations principales)

4 : Mise en place du Framework (Linux + Eclipse)

II Utilisation de Symfony

1 : Architecture du Framework (conventions, principes et structures à connaitre)

2 : Réécriture d’URL

3 : Création d’un Bundle

4 :

M

odèle : Virtualisation de la base de données

5 : Vue : Génération d'une vue

6 : Contrôleur : / Création d'un Contrôleur

III : Autres

1 : Sécurité

2 : Communauté

3 : Principaux concurrents

(3)

I

(4)

Symfony 2.0 webframework php 5.3.2 ou> ORM doctrine 2.1 php5-sqlite Intl apc

MySQL

1. Présentation du Framework

Depuis ces 10 dernières années le monde du web explose.

De plus en plus d'entreprises utilisent internet pour leurs applications ainsi que pour communiquer et partager des informations.

Depuis sa création, le langage PHP (PHP: HypertextPreprocessor) a grandement contribué à l'accessibilité de la création de sites internet.

Parmi tous les modèles de développement nous retiendrons les la structure MVC (Model Vue Contrôleur) qui permet d'allier rapidité, efficacité et productivité.

Ainsi, comment pourrions-nous intégrer le Framework MVC Symfony dans le cadre d'une application web afin de d'améliorer son développement?

Informations Générales :

Channel IRC : #symfony-fr

Forum : http://forum.symfony-project.org/ (anglais) Site Officiel : http://symfony.com

(5)

3. Qu'est ce qu'un modèle MVC ?

Une architecture MVC est constituée de trois principaux composants :

- Un contrôleur qui analysera la demande de l'utilisateur et qui récupérera dans le Modèle (source de données) les informations demandées.

- Un modèle qui représente les sources de données (stockage des informations).

- Une vue qui se charge de mettre en forme les informations qu'elle reçoit du contrôleur. Cheminement des données:

- Un utilisateur se connecte sur une page

- Il émet une requête afin d'obtenir l'affichage de la page.

- Le server reçoit le message le transmet au contrôleur suivant une route spécifique. - La route elle, va par rapport à la page demandée, appeler un contrôleur et son action. - Le contrôleur traite alors l'action et une fois terminée il répond à l'utilisateur avec la page

demandée. Exemple de situation:

1 Un utilisateur A se connecte à :

http://monsite.com/index.php

2 Le server reçoit une requête provenant de A pour la page index.php 3 La route appel le contrôleur et son action

4 Le contrôleur traite l'action

(6)

4.1 : Avantages principaux de Symfony

Symfony est parmi les meilleures bases de développement. En effet c'est un Framework MVC qui facilite considérablement le développement asynchrone.

Inspiré de RoR (Ruby on Rails), son code est tout aussi compréhensible ainsi que sa zone d’administration de type CRUD (Create Read Update Delete) est également très complète.

Il possède :

- Une gestion des routes très puissante - Un ORM intégré (Doctrine)

- Une gestion complète des formulaires (protection CSRF par exemple, génération automatique de code etc … ).

La communauté :

La communauté est très active. De plus les auteurs n'hésite pas à mettre des astuces ou des outils pour faciliter le développement de certaine fonctionnalité (des milliers de plug-in disponible). La documentation :

La documentation n'est pas négligée. Bien au contraire, elle est trés détaillé complète et dispose de nombreux exemples. Il reste flexible, en effet plusieurs ORM sont proposé (Doctrine, Propel sont les plus évolué), il en est de même pour le JavaScript (Prototype, JQuery, Mootools.

Support de nombreux Utilitaires :

Enfin il support de nombreux utilitaires tel que APC, eAccelerator pour accélérer l'exécution de code. La partie test :

N'oublions pas la partie test car Symfony intègre automatiquement une gestion des tests pour chaque Bundle/Contrôleur.

4.2 : Mais …

Bien que Symfony soit très puissant, et bien fait il n’en est pas pour autant le meilleur. Avant de se lancer dans un projet il faut en définir les aspects et c’est cette étape qui détermine qui détermine si votre Framework doit implanter ou non telle ou telle fonctionnalité.

Il en résulte donc obligatoirement des inconvénients connus et nécessaires venant de sont environnement général, le web.

Le Framework Symfony est très lourd non en regard de son poids - une quarantaine de méga-octets - De plus il est nécessaire d'avoir de bonnes bases de programmation avancés afin de d'optimiser le temps de développement qui reste crucial lors de d'un projet.

(7)

5.1 Installation Apache2 / PHP5

Installation pour Ubuntu Version 10.04 LTS lors d’une installation neuve. Les paramètres modifiés précédemment par vous ne seront évidemment pris en compte.

#Installer Apache2 et PHP5

 sudo apt-get install apache2  sudo apt-get install php5

 sudo apt-get install libapache2-mod-php5  sudo /etc/init.d/apache2 restart

#Installer MySQL Server / Client

 sudo apt-get install mysql-server  sudo apt-get install mysql-client  sudo apt-get install php5-mysql # Installation de tous les packages nécessaires:

 sudo apt-get install php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache mhash ming ps pspell recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-json #Installation OpenJDK 6 - JAVA

(8)

5.2 Installation Eclipse Indigo 3.7.1

Téléchargez Eclipse “Classic” 3.7.1

http://www.eclipse.org/downloads/?osType=linux

# L’extraire

 tar xzf eclipse-SDK-3.7.1-linux-gtk.tar.gz # Déplacez le dans le dossier /opt/ folder

 sudo mv eclipse /opt

 cd /opt

 sudo chown -R root:root eclipse  sudo chmod -R +r eclipse # Créez un executable eclipse dans votre dossier

 sudo touch /usr/bin/eclipse  sudo chmod 755 /usr/bin/eclipse  sudo nano /usr/bin/eclipse

#Copier le code suivant dans le fichier ouvert par Nano (Commande précédente):

# Créer un raccourcis de menu Gnome

 sudo gedit /usr/share/applications/eclipse.desktop Copier ce code dans la fenêtre Gedit qui vient de s’ouvrir :

# Launch Eclipse for the first time

 /opt/eclipse/eclipse -clean &

(9)

5.3 Installation Symfony (+GIT)

Lors de cette installation, vous aurez à redémarrer plusieurs fois le service apache, lorsqu’il vous le sera indiqué, il faudra donc entrer dans la ligne de commande la ligne suivante :

 sudo /etc/init.d/apache2 restart #GIT est nécessaire pour pouvoir télécharger les “VENDORS”

 sudo apt-get install git-core  cd /var/www

 sudo wget http://symfony.com/download?v=Symfony_Standard_ Vendors_2.0.8.tgz -O symfony.tgz

 sudo tar zxvf symfony.tgz  cd Symfony

 php bin/vendors install --reinstall #Ouvrez votre Navigateur Web et allez à l’adresse suivante :

http://localhost/Symfony/web/config.php

Voici comment résoudre les erreurs indiquées : **SQLite3 Missing

 sudo apt-get install sqlite3

 sudo apt-get install php5-dev libpcre3-dev  sudo /etc/init.d/apache2 restart

** File permission

 rm –rf app/cache/*  rm –rf app/logs/*

 sudo chmod -R 777 app/cache/  sudo chmod -R 777 app/logs/  sudo /etc/init.d/apache2 restart

** date.timezone

Il faut changer la propriété date.timezone dans le fichier php.ini (d’apache)  sudo vi /etc/php5/apache2/php.ini

*Chercher le terme date.timezone( /timezone to search in vi)

*Décommentez la ligne et attribuez lui la valeur suivante : Europe/Paris *Enregistrez et quittez

(10)

Recommendations : ** PHP accelerator

 sudo pecl install apc *configure it by default hit enter for each request *si phpize Error:

 sudo apt-get install php5-dev libpcre3-dev  sudo pecl install apc

*You should add "extension=apc.so" to php.ini

 sudo vi /etc/php5/apache2/php.ini *Recherchez les emplacements des extensions dynamiques :

Sauvez, Quittez en redémarrez Apache **Install and enable the intl extension

 sudo apt-get install libicu42  sudo apt-get install libicu-dev  sudo apt-get install g++

*Set short_open_tag to off in /etc/php5/cli/php.ini*.

 sudo vi /etc/php5/apache2/php.ini Modifier la ligne short_open_tag = On en short_open_tag = Off

(11)

5.4 Configuration de Symfony (SQL)

Après avoir créer votre base de donnée, ainsi que ses utilisateurs et privilèges :

Rendez-vous sur la page : http://localhost/ProgWeb_Projet_Symfony/web/app_dev.php

Cliquer sur configuration et rentrer les informations suivantes : - Driver : MySQL(PDO)

- Host : Localhost - Name : Symfony - Port : 3306

- User : (utilisateur de la Database créée précédemment) - Password : (Password de la Database créée précédemment) - PasswordAgain

(12)

5.5 Configuration de Symfony (CSRF)

La page suivante propose de configurer le Global Secret par exemple :

caf7c209106a8d2e16dacec7f7c4c72a4

CSRF - Prononcé « Sea Surf » - est une vulnérabilité très répendue et connue dans le monde des sites internet. En effet, le Cross-Site Request Forgery consiste en l’exécution d’un script malveillant de façon transparente et inconsciente pour celui qui l’exécute.

il suffit d’envoyer ce script (par des moyens illégaux comme le fait de cacher le script dans une image par exemple (Sténographie)) à une personne disposant des droits d’utilisateurs suffisant pour faire l’action choisie, puis de le faire exécuter par cette personne ou évidemment de récupérer les identifiants de cette personne lors de sa connexion.

Sans qu’elle se sache, elle aura par exemple changé la page d’un site internet, supprimé un article, modifié des droits ou permit à la personne malveillante de se connecter.

La clé CSRF est donc un moyen préventif, mais nécessite tout de même le respect de notions importantes en sécurité web :

- Utiliser la méthode POST pour tous les formulaires

- Demander des confirmations aux utilisateurs pour toutes les actions critiques - S’assurer que son site n’est pas vulnérable au XSS

- Demander les anciennes informations lors de la modification de celles-ci (email/mot de passe)

- Utiliser la clé CSRF pour chacun des formulaires

Concrètement, pour chaque formulaire, un jeton de validité est créé en fonction de la clé CSRF originale (voir suite), puis placée dans le formulaire en tant que valeur ainsi que dans une variable de session.

Il suffit ensuite à la réception des valeurs de formulaire de vérifier qu’elle existe et de comparer la clé récupérée dans la variable de session ainsi que celle récupérée par POST. Ce qui donne :

(13)

Créons donc tout de suite notre clé CSRF

Finalement, à la dernière page si votre utilisateur de session actuelle linux n’a pas les droits suffisant, il se peut que vous vous retrouviez avec une page d’erreur vous indiquant que Symfony ne peut pas modifier le fichier lui-même.

Dans ce cas faites le vous-même :

 /var/www/ProgWeb_Projet_Symfony/app/config/parameters.ini Collez votre Global Secret dans le fichier de configuration à l’endroit indiqué

(14)

II

Utilisation de

Symfony

(15)

1 : Architecture du Framework

L'architecture de symfony est plutôt flexible. Nous parlerons de la version standard (Standard Edition) qui comporte par default la structure recommandée pour une application Symfony:

1 app/: Configuration de l'application

2 src/: Emplacement du code PHP de l'application 3 vendor/: Plugin tiers

4 web/: Dossier racine web

5 Authentification / Autorisation : Sécurité et gestion des utilisateurs 1 Le dossier « app/ »

Il contient le noyau de l'application et toute sa configuration. 2 Le dossier « src/ »

Il contient tous les bundles propres à l'application. Un bundle et généralement associé et définit comme une fonctionnalité de l'application. Mais il contient aussi des librairies, « Helpers » (outils d’aide au développement), ou autres outils pour nos contrôleurs.

3 Le dossier « vendor/ »

Ce dossier contiendra tout les plugins tiers que l'on souhaite ajouter à notre application (par exemple : Forum, blog clés en mains).

4 Le dossier « web/ »

Le dossier web contient tous les éléments public de notre application comme les images, feuilles de styles(CSS), ou des script (JavaScript).

(16)

2 : Réécriture d’URL

Dans un Framework MVC la redirection des routes est omniprésente, ce seront-elles qui définiront quelle action d'un contrôleur sera exécuté lors d'une requête.

La personnalisation des routes est ici la fonctionnalité la plus intéressante. En effet quoi de plus lourd que de renommer un lien qui pointe sur une ancienne page qui n'existe plus?

Il pourrait falloir rechercher le lien sur chaque page de l'application et le remplacer.

Vous aurez vite comprit que si l'application contient 4000 pages cela devient presque irréalisable... Dans symfony2 si on décide de refactoriser un lien il suffit d'ajouter une route personnalisée. Reprenons notre utilisateur Toto qui va sur monsite.fr/homepage, cependant on décide de renommer l’URI pour que cette page soit accessible depuis monsite.fr/index ou monsite.fr/accueil. Pour cela il suffira de rajouter une règle de route disant: "toute requête provenant de /index ou /accueil se redirigée vers le contrôleur 'homepageController'".

Il existe 3 façons de définir les routes: le YML, XML ou en PHP, nous nous attarderons sur le format par défaut – l’YML.

Exemple de redéfinitions de routes pour /accueil au niveau du contrôleur principale (Routing.yml):

De cette manière tout la définition des routes et centralisé clair et paramétrable à souhait. Exemple :

Un visiteur Toto se connecte sur monsite.fr/homepage, l'url sera donc monsite.fr (le domaine) suivit de /homepage (l'URN). Le routage de l'URI commence par la réception de l'URN par le contrôleur principal. Celui-ci va regarder s'il existe une définition personnalisée de cette URN dans sa table de route: si une définition existe alors il utilisera cette définition sinon celle par default qui consiste à prendre le premier paramètre de l'URN comme contrôleur et le second comme action le reste des URN étant des paramètres de l'action. Dans notre cas il n'existe que le nom du contrôleur. Symfony2 va donc prendre l'action par défaut de notre contrôleur 'homepageController' qui se trouve être 'indexAction'. si cette action par défaut n'existe pas une erreur 404 est affichée.

(17)

3 : Création d’un Bundle

Déclaration du nouveau BUNDLE

 php app/console generate:bundle

--namespace=Blogger/BlogBundle --format=yml Tapez entrée par défaut pour toutes les questions

Nettoyage

Nettoyage car nous n’avons pas besoin de certains des fichiers par défaut créés par le générateurs

 rm src/Blogger/BlogBundle/Controller/DefaultController.php  rm -R src/Blogger/BlogBundle/Resources/views/Default/  rmsrc/Blogger/BlogBundle/Resources/config/routing.yml

Création et présentation du BUNDLE

 vim src/Blogger/BlogBundle/Resources/views/layout.html.twig

Insérer le code suivant et enregistrer :

(18)

4 :

Modèle

->

Virtualisation de la BDD

Le modèle d'une application Symfony2 correspond aux sources de données sous forme de code objet. On appel cette retranscription le mappage, on a ainsi accès à une source de donnée en passant par un BAL (Database Abstraction Layer).

Symfony2 utilise Doctrine.

 La première étape est la configuration d'un accès à une ressource comme une base de données MySQL (le plus commun):

 sudo vim app/config/parameters.ini

 Insérez-y le texte suivant

Le fait de séparer la configuration permet de disposer de plusieurs configurations (utilisation de base de données de test pour un serveur de développement et une seconde pour la production).

Astuce : Il est possible par la suite de créer automatiquement la base de données grâce à la console avec la commande suivante:

 php app/console doctrine:database:create

La création d'entité

Notre application dispose d'utilisateurs. Pour utiliser l'application, cette dernière doit disposer des informations sur les utilisateurs (nom, login, mot de passe, droits) qui proviennent de la base de données. Il faut donc un objet représentant les utilisateurs provenant de la base de données.

Exemple d'objet de l'entité utilisateur:

Astuce : il est également possible de générer une entité à l'aide de la console:  php app/console doctrine:generate:entity

entity="AcmeStoreBundle:Utilisateur" --fields="name:string(255) login:string(255) password:string(32)"

(19)

Mappage

Afin que Doctrine puisse savoir comment interagir avec la base de données il faut définir leurs caractéristiques grâce à des annotations:

Astuce : l'annotation de la base de données est optionnelle, si elle n'est pas spécifiée, la table prendra le nom de l'entité (attention aux mots réservé tel que Group et User).

De plus il existe dans doctrine, une multitude de définitions de champs (http://symfony.com/doc/2.0/book/doctrine.html#book-doctrine-field-types).

(20)

Maintenant que Doctrine sait comment interagir avec votre source de données on génère les accesseur et mutateur:

 php app/console doctrine:generate:entities Acme/StoreBundle/Entity/Utilisateur

Il est possible de générer le schéma SQL à partir de la console, ainsi vous assurez la compatibilité mappage ORM et Base de données:

 php app/console doctrine:schema:update --force

Interactions avec la base de données

(21)

Modification et suppression dans la base de données depuis l’ORM :

(22)

Doctrine dispose également de son propre système de génération de requêtes :

Il existe aussi d’autres méthodes plus complexes que nous n’aborderons pas ici, car elles nécessitent un niveau de connaissances plus avancé que ce que nous avons vu dans ce tutoriel, à savoir les méthodes permettant d’exploiter les tables contenant des clés étrangères.

Vous pouvez cependant retrouvez tous les détails nécessaires à ces opérations dans la documentation Symfony2 disponible à cette adresse : http://symfony.com/doc/current/

Point sur le modèle :

L’exportation des sources de données vers du code objet permet d’optimiser le déploiement d’une application car la base de données est mappée en objet, ce qui permet de regrouper toutes les manipulations sur les données en un seul lieu, et ainsi améliorer la qualité, l’évolutivité, la compréhension du code.

De plus, l’ORM étant présent pour générer les requêtes, les erreurs de syntaxes deviennent quasi-inexistantes.

(23)

5 :

Vue

->

Génération d’une vue

Symfony2 intègre un nouveau système de template très puissant permettant de gérer ses vues grâce à un moteur, TWIG.

TWIG est un moteur de template PHP intégré à Symfony2 facilitant grandement le travail en équipe avec des intégrateurs (ils n’auront qu’à modifier les templates dans : views/ du bundle concerné) et très puissant permettant de :

-

Gérer l’héritage entre templates et layout

-

Séparer les couches présentation / métier Nous remarquerons 3 principaux types de balises :

-

{{ variable }} : Affiche le résultat ou contenu d’une valeur / fonction

-

{% for page in arrPages %} : Permettant d’exécuter une fonction ou de définir un bloc

-

{# Les commentaires #}

Le véritable avantage (et incontestable) est donc l’héritage des templates, pouvant par exemple intégrer la balise {{ parent() }} ce qui aurait pour effet d’afficher le contenu du template parent. Mais passons à un exemple de code plus concret :

 Après avoir complètement créé votre Bundle :

 Allez tout d’abord consulter le layout de base de votre projet (seulement pour information):

app/Resources/views/base.html.twig

 Une fois que vous en avez pris connaissance ouvrez le fichier Default/index.html.twig

 et ajoutez-y les lignes suivantes :

Vous avez donc étendu votre page index.html.twig avec votre fichier base.html.twig et son contenu bien entendu.

Mais pas uniquement, vous avez également affiché un bloc « title » et un bloc « body »

Le bloc Title : le deuxième bloc récupère le contenu de son parent par héritage puis le concatène à son propre contenu. Ce qui donne : “Hello World Title” Le bloc Body : affiche simplement “Hello World Body” dans les balises body

En plus d’être simple et rapide d’utilisation, TWIG est un moteur de template vraiment très puissant, principalement via les possibilités d’héritage.

(24)

6 :

Contrôleur

->

Création d’un contrôleur

 Disposition du contrôleur

 vimsrc/Blogger/BlogBundle/Controller/AccueilController.php Insérer le code suivant et enregistrer :

 mkdirsrc/Blogger/BlogBundle/Resources/views/Accueil/  vimsrc/Blogger/BlogBundle/Resources/views/Accueil/index.

html.twig

** Insérer le code suivant et enregistrer :

 vim src/Blogger/BlogBundle/Resources/config/routing.yml ** Insérer le code suivant et enregistrer :

 vim app/config/routing_dev.yml Mettez en commentaires (#) la première route entière

Création du Bundle terminée, rendez-vous ici pour voir le résultat :

(25)

III

Informations

(26)

1 : Sécurité

Authentification :

Ce qui gère l’authentification dans Symfony2 est le firewall (Voir schéma architecture du Framework) Les Firewalls :

Défini plusieurs zones de sécurités en étant lié à des Providers (Fichier de configuration, entité Doctrine2, autre source). Il se définit donc par un Pattern ainsi que des informations de connexion.

L’encoder :

Encode et Hash les mots de passes utilisateur Autorisation :

Ce qui gère l’autorisation dans Symfony2 est l’Acess Control. Rôles :

Règles d’autorisations appliquées à des utilisateurs permettant d’autoriser ou non l’accès à des pages en fonction de celui-ci (ROLE_ADMIN, ROLE_MODERATEUR …)

Access Control :

Vérifie et autorise ou refuse les utilisateurs en fonction de leurs droits. 3 manières différentes de sécurisation de connexions :

- Accès a une page de façon anonyme et sans droits particuliers

- Accès a une page de façon anonyme mais nécessitant tout de même des droits - Accès à une page de façon identifiée mais sans les droits suffisants

Protection contre les attaques de type :

- CSRF (voir Présentation du Framework -> 5.5 ) - XSS

- Injections SQL Le fichier security.yml :

Il est un fichier de configuration de la sécurité du Framework, il permet de configurer l’encodeur, la hiérarchie des rôles, les providers, les firewalls, ainsi que l’Access Control.

(27)

2 : Communauté

La communauté de symfony2 est une communauté fidèle car satisfaite de la première version de Symfony, mais également très fournie et vivante.

Par le biais de forums, chat, documentation ou support technique il est possible de discuter, apprendre et réaliser des travaux ou projets en étant assuré d’une aide précieuse.

Le support technique quand à lui propose correctifs et solution de façon régulière et réactive. Tous les éléments sont donc réunis pour garantir une bonne approche de ce Framework.

3 : Principaux concurrents

CakePHP

PHP 4 /5, MySQL, PosrtgreSQL, SQLite, AdoDB

 Très proche de l’esprit Rail

Mojavi

PHP 4 /5, MySQL, PosrtgreSQL, DPO, Creole

Phocoa

PHP5, MySQL, Smarty, Phing

 Venant du Framework Cocoa d’Apple  Portage en PHP

 Focumentation générée grâce à phpDoc mais complète.

PHP on Trax

PHP5, PEAR::DB

 Documentation Succinte

 Nécessite des extensions PEAR pour certaines fonctionnalités

Seaqull

PHP5, PEAR

 Basé sur Mojavi / Propel / Rails

 Ajout des fonctionnalités : Internationalisation automatique, gestion de tâches, pagination

WACT

PHP4&5, MySQL

 Très porté sur la sécurité

Zend Framework

PHP5.0.4, PECL::PDO

 Grande communauté

 Incorpore de nombreux modules  Documentation très complète

(28)

Conclusion

Bien que lourd en apprentissage et fonctionnalité, Symfony2 reste un des Framework les plus appréciés du moment de par son architecture, son modèle MVC, ses cotés « Rails », sa rapidité d’utilisation une fois bien maîtrisé.

Au cours de nos recherches, nous n’avons tout simplement pas trouvé de site ou forum rabaissant ce Framework et ça se comprend.

Le gain de temps, la simplicité, l’évolutivité, la communauté, la sécurité, le support, la

documentation, la facilité d’intégration / installation, la possibilité d’utilisation dans Eclipse et NetBeans sont autant de raisons retrouvées sur toutes les pages de tutoriels, d’exercices, de définitions ou forums faisant sans cesse pencher la balance en la faveur de Symfony.. Après une première utilisation de ce Framework, il est apparut évident qu’il s’imposera naturellement dans la réalisation des projets web futurs d’une certaine taille ou complexité minimum.

Symfony est donc à conseiller à tous ceux :

- Qui ont le temps de s’investir dans un apprentissage assez poussé d’un Framework, - Qui souhaiteraient réaliser un projet sur le long terme

- Qui disposent d’une ou plusieurs équipes de développement - Qui ont des besoins de mises à jour régulières (CRUD)

Nous pouvons d’ailleurs constater la récente évolution du site internet DailyMotion vers le

framework Symfony2, ce qui une fois de plus, renforce la notoriété de ce dernier dans le monde du développement PHP.

Références

Documents relatifs

L’enquête met au jour les enjeux méthodologiques de cette démarche pour ses organisateurs: de la projection dans un futur à faire advenir à la construction d’un public pour

In this paper, we use a game-theoretic model to highlight coordination failure that hinder the emergence of networks. of female entrepreneurs necessary to

Nous avons aussi démontré que plusieurs résultats sur les séries universelles au sens usuel (i.e. celles dont les sommes partielles sont denses dans l’espace considéré) étaient

On peut donc à la fois obtenir des intervalles de valeurs théoriquement admissibles pour ces élasticités, même lorsque la dominance au sens de Lorenz ne peut être utilisée, et

La première difficulté est que plusieurs notions distinctes sont ici regroupées sous celles, un peu vagues, de clarté ou du caractère direct de l’expression : le fait d’appeler

Cadahía e Lucena (2000) citam, dentre as principais vantagens da análise da seiva em relação à análise convencional de tecido foliar, a variação na concentração de

provinciales, associations, prennent des formes variées et non spécifiquement romaines. La non-adéquation entre le culte impérial romain et les cultes impériaux provinciaux se traduit

who has been mainly studied in the literature in the special case of proximal gradient algorithms [5]–[7], we develop a distributed asynchronous version of ADMM+. As a first step,