Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 22-02-2014 08:04:02

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

fabriques et paramètres

bonjour à tous
je fais appel à votre aide sur le sujet suivant:
j'ai 2 tables A et B avec chacune un module MVC associé.
La table A contient des données brutes.
La table B contient des données traitées à partir de la table A.

Pour réaliser les traitements du module B, je fais appel à des fonctions (requetes select) existantes dans le module A. Donc dans le module B, j'utilise une fabrique qui me permet de créer un objet à partir du module A. Jusque là, tout va bien.

Maintenant, je veux créer un traitement dans B avec une requete paramètrée de A. Et là, c'est le drame, par quel moyen passer un paramètre à une fabrique ?
dans le createservice ?

merci d'avance pour votre aide
Arnica

Hors ligne

 

#2 22-02-2014 18:17:25

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: fabriques et paramètres

Salut, je comprend pas pourquoi tu veux passer par une fabrique ... Pourquoi tu passes pas simplement par un constructeur classique ?
Les fabriques t'en as pas besoin tout le temps big_smile.

Hors ligne

 

#3 23-02-2014 08:06:38

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: fabriques et paramètres

salut, je voulais passer par une fabrique dans B pour accèder aux fonctions de A.
Si j'utilise un constructeur B, pour faire appel aux fonctions de A, il faut que j'utilise servicelocatorinterface, me semble-t-il ?
ce qui donnerait :
public function __construct(ServiceLocatorInterface $sm, $monparam)    {}

est-ce correct ?
Arnica

Hors ligne

 

#4 23-02-2014 11:15:42

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: fabriques et paramètres

Salut, en fait je comprend pas très bien ton problème :s.

Déjà il faut que tu saches une chose : si tu utilises une fabrique pour injecter A dans B et une autre pour injecter B dans A tu vas te retrouver avec une boucle infinie si tu utilises le service locator. Car si on prend l'exemple de B dans A tu vas faire $sl->get('A'), ceci va déclencher la fabrique de A qui va injecter B via $sl->get('B') qui a son tour déclenche la fabrique de B etc ...

Si tu as juste besoin d'avoir une instance de B dans A sans avoir besoin du service locator. On peut très bien imaginer que A et B sont des classes métiers qui font juste du traitement logique dans ce cas tu peux très bien faire un constructeur où tu passes B dedans.

Pour t'aider plus faudrait que tu nous mettes le code parce que là j'ai l'impression que tu veux absolument utiliser le service locator alors que t'en as peut être pas besoin.

Hors ligne

 

#5 23-02-2014 21:45:37

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: fabriques et paramètres

Ok, je vais essayer d'être plus explicite.
Mes 2 tables se nomment :
Operation qui contient des données renseignées par un utilisateur (date, transaction, montant,...)
BilanparMois contient le résultat de traitement sur les données de la table Operation (totaux par mois, par type de transaction,...).

Dans le module BilanparMois, je veux créer un certain nombre de fonctions qui vont traiter les données stockées dans la table Operation.
par exemple pour les totaux par mois, je veux sélectionner les données de la table Operation pour le mois de janvier et faire la somme du champ montant.

Dans le module Operation, j'ai déjà créé des fonctions qui permettent de sélectionner les données de la table operation pour un mois donné.
Je souhaite réutiliser ces fonctions dans le module BilanparMois pour créer un objet qui correspond à une ligne de la table BilanparMois (mois, totalcrédité, totaldébité, solde, ...).

voici le code associé à l'objet BilanparMois (en essayant d'utiliser servicelocator)

Code:

[lang=php]
<?php
namespace Bilanparmois\Model;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
//ces imports permettent de valider les données entrées dans le formulaire d'ajout de operations
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

//classe représentant chaque bilan stocké dans la table (1 ligne = 1 mois)
class Bilanparmois implements ServiceLocatorAwareInterface
{
//    public $Bilanparam;
    public $NumMois;
    public $TotalCreditMois;
    public $TotalDebitMois;
    public $SoldeMois;
    //protected $inputFilter;
    protected $services;
    
    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->services = $serviceLocator;
    }
    
    public function getServiceLocator()
    {
        return $this->services;
    }
    
    public function exchangeArray($data)
    {
        $this->NumMois     = (isset($data['NumMois'])) ? $data['NumMois'] : null;
        $this->TotalCreditMois     = (isset($data['TotalCreditMois'])) ? $data['TotalCreditMois'] : null;
        $this->TotalDebitMois = (isset($data['TotalDebitMois'])) ? $data['TotalDebitMois'] : null;
        $this->SoldeMois = (isset($data['SoldeMois'])) ? $data['SoldeMois'] : null;
    }

    public function getArrayCopy()
    {
        return get_object_vars($this);
    }

    public function setInputFilter(InputFilterInterface $inputFilter)
    {
        throw new \Exception("Not used");
    }
   
    public function __construct($Nmois)
    {
        //accéder à la table Operation par operationTable
        $MesOperations = $this->getServiceLocator()->get('OperationTable'); //ligne 60
         $bilancredit = 0;
        $bilandebit = 0;
        $bilansolde = 0;
        //récupère la liste des opérations par mois pour credit et débit
        $credit = $MesOperations->CreditParMois($Nmois);
        $debit = $MesOperations->DebitParMois($Nmois);
        
        // pour chaque mois, calcul la somme des montants
        foreach ($credit as $row)
        {
            $bilancredit = $bilancredit + (float)$row->Montant;
        }
            
        foreach ($debit as $row)
        {
            $bilandebit = $bilandebit + (float)$row->Montant;
        }
            
        //calcule le solde
        $bilansolde = $bilancredit - $bilandebit;
        
        $this->NumMois = $Nmois;
        $this->TotalCreditMois = $bilancredit;
        $this->TotalDebitMois = $bilandebit;
        $this->SoldeMois = $bilansolde;
        
    }    
  
   
}

avec ce code, j'ai droit à l'erreur  "Fatal error: Call to a member function get() on a non-object in /opt/lampp/htdocs/compte_courant_test/module/Bilanparmois/src/Bilanparmois/Model/Bilanparmois.php on line 60"
'OperationTable' est définie dans module.php

voila, j'espère que c'est plus clair comme ça.
Bonne soirée

Hors ligne

 

#6 23-02-2014 22:16:26

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: fabriques et paramètres

Pour l'erreur c'est normal si tu mets l'interface ServiceLocatorAwareInterface pour injecter automatiquement le service locator tu dois utiliser le service locator (en gros faire un $sl->get('xxx')).

Dans ton cas je pense que le problème vient juste de l'architecture. Un modèle (donc une table) n'est pas censé faire de traitements donc tu dois passer par une couche service qui a accès aux deux et qui fait les manipulations dont tu as besoin !

Hors ligne

 

#7 24-02-2014 13:31:19

arnica33
Membre
Date d'inscription: 23-11-2013
Messages: 25

Re: fabriques et paramètres

ok, je n'étais pas très satisfait de cette façon de faire,
merci d'avoir pris le temps de me répondre, je vais revoir mon architecture.
on peut clore le sujet, ...pour le moment.
Arnica

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages