IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

Zend, MVC et écriture dans un fichier XML


Sujet :

MVC PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 20
    Par défaut Zend, MVC et écriture dans un fichier XML
    Bonjour,

    Je travaille sur un projet en Zend mais je bosse tout seul donc je dois chercher mes infos un peu à droite à gauche.
    Je dois générer des fichiers XML. Pour faire vite dans un premier temps, j'en ai généré un que j'affiche dans ma fenêtre de navigateur, avec les entêtes XML. C'est ma vue qui s'en charge : déjà je me demande si c'est bien malin, en voici le code (elle fait appel à un helper de vue pour dérouler le contenu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-cache, must-revalidate");
    header("Pragma: no-cache");
    header("content-type: application/xml");
     
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<rubs>';
    $this->affFonctionnalitesVehiculeXml($this->tabListeRubriques, $this->tabContenusRubriques, $this->tabParents);
    echo '</rubs>';
    ?>
    Ce que je voudrais faire, c'est qu'au lieu d'afficher la vue dans la sortie standard (navigateur), ça m'en écrive le contenu dans un fichier sur le disque (fichier xml). Je me demandais donc si c'était possible, et si oui, comment puis-je faire ?

    Cordialement,

    Thomas

  2. #2
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Février 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Février 2008
    Messages : 71
    Par défaut
    Salut,

    Si l'objectif de ton action est de générer un fichier XML à stocker sur le serveur, alors je pense que la génération du flux est du ressort du modèle, et non de la vue.

    Plus précisément, j'opterais pour 2, voire 3 objets de modèle :

    Option 1 : un modèle composé de 2 objets :

    dans cette option, on a 2 objets :
    - 1 entité qui contient tes données
    - 1 objet qui est en charge de la sérialisation/désérialisation de ton entité en Xml

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    <?php
    /**
     * Cette classe est l'entité représentant ton véhicule en PHP
     */
    class Model_Vehicule
    {
    	protected $_marque;
     
    	public function setMarque($marque)
    	{
    	$this->_marque = $marque;
    	return $this;
    	}
     
    	public function getMarque()
    	{
    		return $this->_marque;
    	}
    }
    /**
     * Cette classe gère l'ouverture et l'écriture en Xml de l'objet PHP
     */
    class Model_DataMapper_Vehicule
    {
    	/**
    	 * Méthode d'ouverture d'un fichier Xml
    	 * 
    	 * Cette méthode Ouvre un véhicule contenu dans un fichier Xml et le transforme en objet 
    	 * de type Model_Vehicule en PHP 
    	 */
    	public function ouvreVehiculesXml($fichierVehiculeXml)
    	{
    		//Ici, ouverture du fichier XML
    		// ...
     
    		//On retourne l'objet Model_Vehicule en PHP
    		return $vehiculePHP;
    	}
     
    	public function sauveVehiculePhpEnXml(Model_Vehicule $vehiculePhp,$emplacementFichier)
    	{
    		//Ici, transformation de l'objet PHP en XML et sauvegarde dans un fichier.
    	}
    }
    Cette méthode est la plus simple, mais elle est peu évolutive car les méthodes d'ouverture/écriture ne peuvent générer que du Xml. Pour changer de format (CSV ou json par exemple, tu vas te retrouver à recoder la quasi totalité du modèle).

    C'est pourquoi, si tu penses qu'un jour tu pourrais avoir besoin d'écrire un fichier respectant un autre format, tu peux ajouter un 3ème objet, en fonction du format de fichier à créer. Le datamapper délèguera à ce nouvel objet l'écriture réelle du fichier.

    Cette solution est plus souple et plus pérenne :

    Option 2 : un modèle composé de 3 objets

    L'entité (ici la classe Model_Vehicule) ne change pas, mais le dataMapper délègue l'écriture à un objet spécialisé, qu'il suffit de changer pour changer le format du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    /**
     * Cette classe assure le lien entre l'entité PHP et son fichier, quelque soit le format du fichier
     * La principale différence avec l'exemple précédent est que le datamapper délègue l'ouverture et l'écriture réelles du 
     * fichier à un objet lié à chaque format.
     */
    class Model_DataMapper_Vehicule
    {
     
    	private $_serializer;
     
     
    	public function __construct($serializer)
    	{
    		$this->_serializer = $serializer; 
    	}
     
     
    	/**
    	 * Méthode d'ouverture d'un fichier Xml
    	 * 
    	 * Cette méthode Ouvre un véhicule contenu dans un fichier Xml et le transforme en objet 
    	 * de type Model_Vehicule en PHP 
    	 */
    	public function ouvreVehiculesXml($fichierVehiculeXml)
    	{
    		//Ici, ouverture du fichier XML
    		$vehicule = $this->_serializer->open($fichierVehicule);
     
    		//On retourne l'objet Model_Vehicule en PHP
    		return $vehiculePHP;
    	}
     
    	public function sauveVehiculePhpEnXml($vehiculePhp,$emplacementFichier)
    	{
    		$this->_serializer->write($vehiculePhp, $emplacementFichier);
    	}
    }
    Dans ce cas, tu peux utiliser une interface pour assurer que les objets qui vont effectuer la sérialisation contiennent bien les méthodes utilisées dans le datamapper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    interface Model_Datamapper_Serializer_Interface
    {
    	public function open($fichier);
     
    	public function write($objetPhp, $emplacementFichier)
    }
    et l'objet de sérialisation XML répondant à cette interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Model_Datamapper_Serializer_Xml implements Model_Datamapper_Serializer_Interface
    {
    	public function open($fichierXml)
    	{
    		//ouverture du fichier XML et transformation en objet PHP
    	}
     
    	public function write($objetPhp, $emplacementFichier)
    	{
    		//Ecriture du fichier XML 
    	}
    }
    Avec cette seconde option, tu as plus d'objets, mais chaque objet à sa propre responsabilité :

    - l'entité est responsable de l'organisation des données
    - le datamapper est responsable des opérations de persistance des données
    - le serializer est responsable du format de fichier des données

    Voila pour le modèle. Avec cette organisation, ta vue n'est plus responsable de la génération du fichier XML, et du coup tu peux :

    - la désactiver complètement (pour le lancement d'une action en tâche de fond par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Dans ton controller : 
    public function fooAction()
    {
        $this->_helper->viewRenderer->setNoRender();
        //Ici, traitement du modèle
    }
    - afficher le résultat de ton opération.

    Voilà, c'est un peu long et je pense qu'on peut factoriser un peu tout ça, mais j'espère que ça t'aidera...

    @+

    - benjamin

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 20
    Par défaut
    Bonjour,

    Merci pour cette réponse, un peu tardive certes mais très claire et je pense qu'elle me sera utile. Le projet pour le moment n'avance pas trop mais rien que pour ma culture personnelle, je vais me pencher sur ce que tu proposes.

    Merci encore.

    Tom

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. écriture dans un fichier xml en mode ajout
    Par princessemira dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 17/05/2010, 13h18
  2. Réponses: 7
    Dernier message: 05/05/2010, 11h40
  3. [SimpleXML] Écriture dans un fichier XML
    Par Nounet12 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 24/06/2008, 11h43
  4. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo