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

Bibliothèques et frameworks PHP Discussion :

[DOCTRINE 2.0] Exemple simple avec code source complet


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 74
    Points : 106
    Points
    106
    Par défaut [DOCTRINE 2.0] Exemple simple avec code source complet
    Bonjour,

    Je me fais un comparatif d'ORM dans le but de me faciliter la vie dans mon DEV PHP.

    Ma question est :

    1) Est-ce que quelqu'un à un projet ou une url d'un exemple Doctrine 2 (2 table liés en CRUD par exemple) avec code source complet ?

    Sur google, j'ai surtout trouvé pour doctrine 1.0 et sur le site de doctrine, il n'y a pas d'exemple simple avec le code source téléchargeable.

    2) Si quelqu'un a des noms d'autres ORM simple (projets < 20 tables), qu'il n'hésite pas a me les mentionner.


    Merci

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Tiens voici une classe qui sert d'ORM léger: https://github.com/bdelespierre/php-...odel.class.php
    Et voici un 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
    46
    <?php
    class User extends Model {
     
     
        protected function _init ($statement) {
            if (isset($this->_statements[$statement]))
                return $this->_statements[$statement];
     
            switch ($statement) {
                case 'create':
                    $query = 'INSERT INTO `users` VALUES (NULL,:login,:password,:name,:surname,:group,CURRENT_TIMESTAMP,NULL)';
                    break;
                case 'retrieve':
                    $query = 'SELECT * FROM `users` WHERE `id`=:id';
                    break;
                case 'update':
                    $query = 'UPDATE `users` SET `login`=:login, `password`=:password, `name`=:name, `surname`=:surname, '.
                             '`group`=:group, `creation`=:creation, `last_connection`=:last_connection WHERE `id`=:id';
                    break;
                case 'delete':
                    $query = 'DELETE FROM `users` WHERE `id`=:id';
                    break;
                default:
                    throw new RuntimeException("$statement is unexepected for " . __METHOD__);
            }
     
            return $this->_statements[$statement] = Database::prepare($query);
        }
     
        public static function exists ($username, $password) {
            $query = "SELECT `id` FROM `users` WHERE `login`=:login AND `password`=:password";
            $stmt = Database::prepare($query);
     
            $password = md5($password);
            $stmt->bindParam(':login', $username, PDO::PARAM_STR);
            $stmt->bindParam(':password', $password, PDO::PARAM_STR);
     
            if ($stmt->execute()) {
                if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false)
                    return new self($row['id']);
                return false;
            }
            else
                throw new RuntimeException("Error with query");
        }
    }
    Pour de touts petits projets ça suffit amplement.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 74
    Points : 106
    Points
    106
    Par défaut
    Merci Benjamin

    J'ai finalement choisit RedBean (http://redbeanphp.com) qui est un ORM sous forme d'extension PDO, un peu comme ton lien Axiom mais en plus complet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    require_once('../fonctions/rb.php');
     $commune = R::load('communes', $id);
     $commune->code_insee = $_POST['code_insee'];
     $commune->code_postal = $_POST['code_postal'];
     $commune->libelle = $_POST['libelle'];
     $id 	= R::store($commune);
    Tu écris ça et sans configuration autre que les paramètres de ta base et ça te fait INSERT/Update suivant la valeur de ton $id.

    0 = INSERT
    >0 = UPDATE

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    J'ai aussi une classe qui fait ça pour MySQL: https://github.com/bdelespierre/php-...ject.class.php

    Usage:
    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
    <?php
    $user = new Axiom_MySQLObject('users');
    $user->create(array(
      'name' => 'foo',
      'surname' => 'bar',
    ));
    var_dump($user->getData());
     
    // update
    $user = new Axiom_MySQLObject('users', 1);
    $user->surname = "another";
    var_dump($user->update());
     
    // delete
    $user = new Axiom_MySQLObject('users', 1);
    var_dump($user->delete());
     
    // list
    $users = Axiom_MySQLObject::all('users', $search_params, $options);
    foreach ($users as $user) {
      var_dump($user);
    }
    La différence c'est que j'ai pas fait de factory (ça viendra dans une prochaine release). Mais sache que peu importe ma solution ou celle de RedBean, ça consome des ressources en requêtes SQL de découvrir un schéma (peut être que son implem fait de la mise en cache contrairement à la mienne, à voir).

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 74
    Points : 106
    Points
    106
    Par défaut
    Il y a un système de cache non activé par défault sous forme d'une classe additionnelle.

    Pour les performances, là je suis dans l'admin CRUD.

    En front END il permet d'écrire des requêtes hybrides SQL qui je pense n'utilise pas de requête sur le schema de la BDD.

    J'ai fait des essais, de 100 requêtes à la suite et ca reste instantané, je pense qu'en dev web d'appli de gestion classique le gain en perf est plus sur l'optim des images et des aller retours http request.

    Pour les BDD il suffit de placer les bons index sur les grosses tables.

    J'ai mis ton framework en lien pour aller pêcher des idées.

    Il faut que je fasse un module d'authentification par exemple

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Pour les BDD il suffit de placer les bons index sur les grosses tables.
    C'est pas si simple. Un modèle de données performant ça commence par de la normalisation. Voir http://fr.wikipedia.org/wiki/Forme_n...ationnelles%29

    L'optimisation des index est certes importante (attention cependant à la taille de l'index), mais il faut aussi bien choisir son moteur de stockage en fonction des besoins. On peut aussi recourir au partitionnement de tables ou au cluster pour améliorer les performances. Enfin, on peut mettre un cache coté application pour éviter l'enchainement trop fréquent des requêtes lourdes.

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

Discussions similaires

  1. Index personnalité pour JavaDoc avec code source inclus?
    Par Gary31 dans le forum EDI et Outils pour Java
    Réponses: 0
    Dernier message: 16/06/2010, 12h27
  2. Excel avec code source protégé
    Par ComfortablyNumb dans le forum Langage
    Réponses: 0
    Dernier message: 11/10/2008, 21h01
  3. Pb avec code source "lister les images d'un dossier"
    Par Mimisator dans le forum Langage
    Réponses: 2
    Dernier message: 19/10/2005, 16h25

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