Symfony

De Wiki de Romain RUDIGER
Aller à : navigation, rechercher

Installation

L'installation s'effectue via PEAR :

C:\wamp\bin\php\php5.2.9-2>pear channel-discover pear.symfony-project.com
	Adding Channel "pear.symfony-project.com" succeeded
	Discovery of channel "pear.symfony-project.com" succeeded

C:\wamp\bin\php\php5.2.9-2>pear remote-list -c symfony
	CHANNEL SYMFONY AVAILABLE PACKAGES:
	===================================
	PACKAGE VERSION
	pake    1.1.4
	symfony 1.2.7
	
C:\wamp\bin\php\php5.2.9-2>pear install symfony/symfony
	downloading symfony-1.2.7.tgz ...
	Starting to download symfony-1.2.7.tgz (2,695,475 bytes)
	.........................................done: 2,695,475 bytes
	install ok: channel://pear.symfony-project.com/symfony-1.2.7

Pour vérifier l'installation :

C:\wamp\bin\php\php5.2.9-2>symfony -V
	symfony version 1.2.7 (C:\wamp\bin\php\php5.2.9-2\PEAR\symfony)

Premier projet

Initialisation

C:\>cd wamp\www\tuto_symfony
	
C:\wamp\www\tuto_symfony>mkdir monProjet

C:\wamp\www\tuto_symfony>cd monProjet

C:\wamp\www\tuto_symfony\monProjet>symfony init-project monProjet
	>> dir+      C:\wamp\www\tuto_symfony\monProjet\apps
	>> dir+      C:\wamp\www\tuto_symfony\monProjet\cache
	>> dir+      C:\wamp\www\tuto_symfony\monProjet\config
	>> file+     C:\wamp\www\tuto_symfony\monProjet\config/databases.yml
	[..]
	>> chmod 777 C:\wamp\www\tuto_symfony\monProjet\symfony
	>> chmod 777 C:/wamp/www/tuto_symfony/monProjet/web/uploads/assets

C:\wamp\www\tuto_symfony\monProjet>symfony init-app monAppli
	>> dir+      C:\wamp\www\tuto_symfony\monProjet\apps/monAppli\config
	>> file+     C:\wamp\www\tuto_symfony\monProjet\apps/monAppli\config/app.yml
	[..]
	>> chmod 777 C:/wamp/www/tuto_symfony/monProjet/web/uploads/assets
	>> dir+      C:\wamp\www\tuto_symfony\monProjet\test/functional/monAppli

Configuration

Routage

  • Editez le fichier monProjet\apps\monAppli\config\routing.yml et modifiez le chemin par défaut
homepage:
  url:   /
  param: { module: monModule, action: index }

Mise en page

  • Editez le fichier monProjet\apps\monAppli\config\view.yml

Nous utiliserons exclusiment utf8 pour la réalisation de ce tutoriel.

default:
  http_metas:
    content-type: text/html; charset=utf-8

  metas:
    title:        Mon premier projet !
    description:  C'est la première fois que l'utilise symfony
    keywords:     symfony, monProjet
    language:     fr
    robots:       index, follow

  stylesheets:    [main.css]

  javascripts:    []

  has_layout:     on
  layout:         layout

C'est la configuration par défaut de notre site, nous verrons plus tard comment modifier ces éléments en fonction des pages.

Base de données

  • Editez le fichier monProjet\config\schema.yml
propel:
  blog_post:
    id:           ~
    title:        { type: varchar(255), required: true }
    excerpt:      { type: longvarchar }
    body:         { type: longvarchar }
    created_at:   ~
  blog_comment:
    id:           ~
    blog_post_id: ~
    author:       { type: varchar(255) }
    email:        { type: varchar(255) }
    body:         { type: longvarchar }
    created_at:   ~
C:\wamp\www\tuto_symfony\monProjet>symfony propel:build-model
	>> schema    converting "C:/wamp/www/tuto_sy...rojet/config/schema.yml" to XML
	>> schema    putting C:/wamp/www/tuto_symfon...jet/config/generated-schema.xml
	>> propel    Running "om" phing task
	>> file-     C:/wamp/www/tuto_symfony/monProjet/config/generated-schema.xml
	>> file-     C:/wamp/www/tuto_symfony/monPro...enerated-schema-transformed.xml
	>> autoload  reloading autoloading

C:\wamp\www\tuto_symfony\monProjet>symfony configure:database "mysql:dbname=monProjet;host=localhost" root ""

C:\wamp\www\tuto_symfony\monProjet>symfony propel:build-sql
	>> schema    converting "C:/wamp/www/tuto_sy...rojet/config/schema.yml" to XML
	>> schema    putting C:/wamp/www/tuto_symfon...jet/config/generated-schema.xml
	>> propel    Running "sql" phing task
	>> file-     C:/wamp/www/tuto_symfony/monProjet/config/generated-schema.xml
	>> file-     C:/wamp/www/tuto_symfony/monPro...enerated-schema-transformed.xml

C:\wamp\www\tuto_symfony\monProjet>php symfony propel:insert-sql

	  This command will remove all data in your database.
	  Are you sure you want to proceed? (y/N)
	
	y
	>> schema    converting "C:/wamp/www/tuto_sy...rojet/config/schema.yml" to XML
	>> schema    putting C:/wamp/www/tuto_symfon...jet/config/generated-schema.xml
	>> propel    Running "insert-sql" phing task
	>> file-     C:/wamp/www/tuto_symfony/monProjet/config/generated-schema.xml

En cas d'erreur :

[propel-om] Could not perform XLST transformation.  Make sure PHP has been compiled/configured to support XSLT.

Il faut décommenter la ligne suivante dans votre php.ini et redemarrez WAMP

extension=php_xsl.dll
  • Créez les formulaires associés aux tables de la base :
C:\wamp\www\tuto_symfony\monProjet>symfony propel:build-forms
	>> propel    generating form classes
	>> tokens    C:/wamp/www/tuto_symfony/monPro...e/BaseBlogCommentForm.class.php
	>> tokens    C:/wamp/www/tuto_symfony/monPro...base/BaseBlogPostForm.class.php
	>> tokens    C:/wamp/www/tuto_symfony/monPro...b/form/BaseFormPropel.class.php
	>> tokens    C:/wamp/www/tuto_symfony/monPro.../form/BlogCommentForm.class.php
	>> tokens    C:/wamp/www/tuto_symfony/monPro...lib/form/BlogPostForm.class.php
  • Créez un module pour la gestion de la table post
C:\wamp\www\tuto_symfony\monProjet>symfony propel:generate-module --non-verbose-templates --with-show monAppli post BlogPost
	>> dir+      C:\wamp\www\tuto_symfony\monPro...s\monAppli\modules/post\actions
	>> file+     C:\wamp\www\tuto_symfony\monPro.../post\actions/actions.class.php
	[..]
	>> dir-      C:/wamp/www/tuto_symfony/monPro...765b380b46b67e/autoPost/actions
	>> dir-      C:/wamp/www/tuto_symfony/monPro...e6055934765b380b46b67e/autoPost
  • Il ne reste qu'à tester notre page à l'adresse suivante :

http://localhost/tuto_symfony/monProjet/web/monAppli_dev.php/post

Pour utiliser le module de gestion des commentaires, il faut implémenter la méthode toString de la classe BlogPost

  • Editez le fichier monProjet\lib\model\BlogPost.php
  public function __toString()
  {
    return $this->getTitle();
  }

Mise en page

  • Modifiez un peu la feuille de style monProjet\web\css\main.css
body, td {
	font-family: Arial, Verdana, sans-serif;
	font-size: 12px;
}

td { 
	margin: 4px; padding: 4px; 
}
  • Modifiez le template pour naviguer entre les modules
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <?php include_http_metas() ?>
    <?php include_metas() ?>
    <?php include_title() ?>
    <link rel="shortcut icon" href="/favicon.ico" />
  </head>
  <body>
	<div id="container" style="width:700px;margin:0 auto;border:1px solid grey;padding:10px">
	  <div id="navigation" style="display:inline;float:right">
	    <ul>
	      <li><?php echo link_to('List of posts', 'post/index') ?></li>
	      <li><?php echo link_to('List of comments', 'comment/index') ?></li>
	    </ul>
	  </div>
	  <div id="title">
	    <h1><?php echo link_to('My first symfony project', '@homepage') ?></h1>
	  </div>
	 
	  <div id="content" style="clear:right">
	    <?php echo $sf_data->getRaw('sf_content') ?>
	  </div>
	</div>
  </body>
</html>
  • Créez le module principal de l'application
C:\wamp\www\tuto_symfony\monProjet>symfony generate:module monAppli monModule
	>> dir+      C:\wamp\www\tuto_symfony\monPro...Appli\modules/monModule\actions
	>> file+     C:\wamp\www\tuto_symfony\monPro...odule\actions/actions.class.php
	>> dir+      C:\wamp\www\tuto_symfony\monPro...pli\modules/monModule\templates
	>> file+     C:\wamp\www\tuto_symfony\monPro...dule\templates/indexSuccess.php
	>> file+     C:\wamp\www\tuto_symfony\monPro...nAppli/monModuleActionsTest.php
	>> tokens    C:\wamp\www\tuto_symfony\monPro...nAppli\monModuleActionsTest.php
	>> tokens    C:/wamp/www/tuto_symfony/monPro...odule/actions/actions.class.php
	>> tokens    C:/wamp/www/tuto_symfony/monPro...dule/templates/indexSuccess.php
  • Supprimez l'implémentation de la méthode executeIndex dans monProjet\apps\monAppli\modules\monModule\actions\actions.class.php
  • Voilà notre premier "projet" est opérationnel

Conclusion

Certains l'auront remarqué, le fonctionnement de symfony ressemble beaucoup à ruby on rails. Il reste encore beaucoup de chose à étudier, notamment l'utilisation des helpers, des controllers, ... Pour rédiger cet article je me suis bien entendu appuyé sur d'autres articles, les références sont listées dans le paragraphe suivant.


Liens utiles

Rémi Rudiger 26 juin 2009 à 14:43 (UTC)