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

Symfony PHP Discussion :

Refactorisation


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 260
    Par défaut Refactorisation
    Bonjour, Je veux qu'à l'appelle de l'action show qui affiche une news, la valeur de la colonne rank soit incrémentée de 1 dans la base de donnée. Or comme bonne conduite, je place toutes les requêtes dans le fichiers newsTable.class.php. Dans ce cas précis, où dois-je place ma requête update ? dans l'action show ou plutôt dans le modèle et faire l'appel depuis l'action ? Eclairez-moi s'il vous plait.

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Le problème de créer une méthode show qui incrémente est qu'a chaque utilisation de la requête, tu incrémentes.

    Maintenant, tu peux faire une méthode avec un paramètre :
    public function getArticleById( $id, $incremant = true )

    Et de faire un test dans la méthode, par défaut il incrémente, mais tu à la possibilité de ne pas incrémenter, si une personne réaffiche 10 fois l'article de suite, par exemple.

    Ou de gérer cela dans la requête elle même
    public function getArticleByIdForUser( $id, $user, $incremant = true )
    où le paramètre $user est un pointeur sur l'objet sfUser. A toi d'y initialiser un paramètre avec le numéro de l'article précédant, s'il est identique, $incremant sera mis à false. Donc la même intérrogation 10 fois de suite n'incrémente qu'à la première demande.

    Et on garde l'indépendance du modèle par rapport au contrôleur, vu que c'est le contrôleur qui donne l'objet sfUser à traiter.

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 260
    Par défaut
    Bon, j'ai fait un truc barbare qui n'a pas non plus l'air de trop réussir.
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
    // Dans emissionTable.class.php :
     
    public function findEmission($slug, $userIp) // Fonction appelée par l'executeShow
    {
    	...
    	if($result = $q->fetchOne())
    	{
    		$this->rankEmission($result->getId(), $request->getRemoteAddress());	
    	}
    }
     
    // Le principe est de n'incrémenter pour le même visiteur que s'il revient plus de 5 mn après sa précédente visite.
    // 5 mn après, on peut considérer comme une nouvelle visite. Un pur postulat:D
    // Y a une table pour enregistrer les visites dont voici la définition en yaml
    // rankemission:
    //   columns:
    //     ip:
    //       type: integer
    //     temps:
    //       type: timestamp
    //     emission:
    //       type: integer
     
     
    public function rankEmission($id, $uip)
    {
    	$ip = ip2long($uip); // Recuperer l ip de l utilisateur
    	$timestamp5mn = time() - (60*5); 
     
    	// Verifier que l utilisateur a deja consulter la page une fois
     
    	$rk = Doctrine::getTable('rankemission')
    		->createQuery('r')
    		->where('r.ip = ?', $ip)
    		->andWhere('r.emission = ?', $id);
     
    		// sinon on enregistre sa visite
     
    	if($rk->count() < 1)
    	{
    		$newrank = new rankemission();
    		$newrank->setIp($ip);
    		$newrank->setEmission($id);
    		$newrank->setTemps(date('Y-m-d H:i:s'));
    		$newrank->save();
     
    		// Et j incremente l emission et le programme associe
    		// programme est en relation 1:n avec emission
     
    		$this->rankIt($id, $timestamp5mn);
     
    	}
    	else  // Il a deja visite la page
    	{
    		$w = $rk->fetchOne();
     
    		// Y a t il plus de 5 mn
     
    		if(myFunctions::datetime2timestamp($w->getTemps()) < $timestamp5mn)
    		{
    			// J incremente l emission et le programme associe
     
    			$this->rankIt($id, $timestamp5mn);
     
    		}
    	}
    }
     
     
    public function rankIt($id, $timestamp5mn)
    {
    	// J incremente l emission et le programme associe
    	// Mise a jour du champ rank de l emission
     
    	$q = Doctrine_Query::create()
    		->update('emission e')
    		->where('e.id = ?', $id)
    		->set('rank', '?', 'e.rank'+1)
    		->execute();
     
    	// Recuperation du programme associe a l emission
     
    	$prog = Doctrine_Core::getTable('emission')->find($id);
     
    	// Mise a jour du programme associe a l emission
     
    	$m = Doctrine_Query::create()
    		->update('programme p')
    		->where('p.id = ?', $prog->getProgrammeId())
    		->set('rank', '?', 'p.rank'+1)
    		->execute();
     
    	// Je Supprime les entrees vieilles de plus de 5 mn
    	// dans la table rankemission
     
    	/*$d = Doctrine_Query::create()
    		->delete('rankemission r')
    		->where('r.temps < ?', date('Y-m-d H:i:s') - date('Y-m-d H:i:s', $timestamp5mn))
    		->execute();*/
    }
    Ce code enregistre bien la première visite et effectue les premières incrémentations, mais ne vas pas au delà.

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Ceci me semble inutillement compliqué.

    Si tu gardes ce système, je mettrait un random sur l'action de suppression, pour qu'il ne le fasse pas à chaque fois, ceci devrait donner plus de perf.

    Je ne comprend pas l'intérêt de récupérer l'adresse Ip alors que tu associes déjà un utilisateur qui a une session, ceci n'apporte aucune aide, sauf dans le cas, peu probable, où un utilisateur se ferait pirater sa session, et, pour un simple comptage je ne vois pas l'intérêt.

    Perso, j'aurais plutôt stocké les informations sur la visite dans l'objet user (parameter). Et si la personne ferme la session et ouvre une nouvelle session, on peut considérer cela comme une nouvelle visite.

    Si tu veux suivre la fréquentation du site, tu as des outils d'analyse tout fait qui peuvent aussi apporter des aides précieuses et, peut-être, plus pertinentes.

Discussions similaires

  1. La refactorisation est-elle réellement utile ?
    Par Amine Horseman dans le forum Débats sur le développement - Le Best Of
    Réponses: 43
    Dernier message: 25/06/2015, 08h41
  2. [2.x] Refactoriser code controleur
    Par badjinmb dans le forum Symfony
    Réponses: 2
    Dernier message: 11/01/2013, 17h15
  3. Refactoriser du code existant
    Par SrK dans le forum Général Java
    Réponses: 6
    Dernier message: 24/04/2012, 14h48
  4. Refactorisation possible ?
    Par Juli3ns dans le forum jQuery
    Réponses: 4
    Dernier message: 09/02/2011, 18h42

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