Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
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 .
Hors ligne
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
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
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)
[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
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
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