estensione su tre livelli dei model

so che titolo del post non è chiaro ma provo a spiegarmi. Il problema è più che altro una questione di struttura delle cartelle e di come ZF carica in automatico le classi nei file.

In una struttura a moduli vorrei estendere gerarchicamente i models

vorrei creare quindi un model esterno ai modulli

class Model_Std {}

dove gestire la connessione alle varie fonti dati utilizzate nel progetto

da poter poi estendere all'interno dei singoli moduli

class ModuloA_Model_Std extends Model_Std {}
class ModuloB_Model_Std extends Model_Std {}

in cui inserire metodi di utilità generale per ciascun modulo

ed infine estendere i model Std dei Moduli per gestire le funzionalità specifiche

class ModuloA_Model_Pippo extends ModuloA_Model_Std {}
class ModuloA_Model_Pluto extends ModuloA_Model_Std {}
class ModuloB_Model_Paperino extends ModuloB_Model_Std {}
class ModuloA_Model_Pluto extends ModuloB_Model_Std {}

spero che siano chiare le intenzioni.

quindi... se facessi tutto in un singolo file php all'esterno di ZF non ci sarebbero problemi ma quì non riesco a trovare un posto (cartella) dove collocare il file della prima classe in modo che venga caricato automaticamente in fase di bootstrap e sia disponibile quando lo estendo nei Moduli.

che ne dite?

inviato 6 anni fa
fabio.pellati
X 0 X

La puoi mettere all'interno della directory library e fare una struttura del genere:

_ library
      |__mymodel
               |__std.php
               |__modulo
                       |__moduloA.php
                       |__moduloB.php
                       |__estensioni
                                   |__estensioneA.php
[ ...]

Le classi in tal caso le fai assumere questa demonimiazione:

class Mymodel_Std.php
class Mymodel_Std_ModuloA extends Mymodel_Std
[...]
class Mymodel_Std_ModuloA_EstensioneA extends Mymodel_Std_ModuloA

e così via.

Praticamente è lo stesso pattern usato dalle classi di Zend Framework.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

grazie,

la implemento e vi faccio sapere

risposto 6 anni fa
fabio.pellati
X 0 X

non l'ho ancora implementato ma nel frattempo sto cercando di inserire in library una struttura per mettere delle classi di tools generali.

mi rendo conto che ho un limite: non ho ancora capito bene il namespace di ZF.

e questo mi succede perchè non ho ancora trovato il posto dove viene spiegato (sulla guida?)

non è che voi, santa gente, sapreste dirmi dove hanno messo il documento che definisce il namespace?

 :)

grazie ciao

risposto 6 anni fa
fabio.pellati
X 0 X

Premettendo che ad ogni problema si deve aprire una discussione.

Ti rispondo comunque qui. Ti do un link che forse ti può interessare:

http://devzone.zend.com/article/12263-Zend-Config-tree-solution

Per l'ultima domanda dovresti leggere questa documentazione:

http://zendframework.com/manual/en/learning.autoloading.html

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Finalmente ho avuto tempo per rivedere il codice ed implementare questa questione.

la soluzione proposta da Mario funziona benissimo con un paio di attenzioni.

l'aldero di library è

library
         | Tools
                   | xxx.php  (classi con vari funzioni)
                   | yyy.php 
         | Models
                   | Global.php  (classe con il Model Globale)

è stato però necessario inserire questa istruzione nel file index.php

$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('My_');

prima attenzione

per poter richiamare le classi così

class Miomodello1_Model_Std extends My_Models_Global {

la seconda attenzione riguarda il costruttore: se si personalizza il costruttore del model_Global non bisogna dimenticarsi di richiamarlo esplicitamente nelle classi Model che lo estendono

class Miomodello1_Model_Std extends My_Models_Global {

    public function  __construct() {
        parent::__construct();
    }
  
}
risposto 6 anni fa
fabio.pellati
X 0 X

Ottimo  :D

risposto 6 anni fa
Mario Santagiuliana
X 0 X

chiedo scusa, rileggendo ho visto un errore

l'albero di library non è come avevo scritto

library
         | Tools
                   | xxx.php  (classi con vari funzioni)
                   | yyy.php 
         | Models
                   | Global.php  (classe con il Model Globale)

bensì

library
        | My
                 | Tools
                            | xxx.php  (classi con vari funzioni)
                            | yyy.php 
                 | Models
                            | Global.php  (classe con il Model Globale)

sennò non avrebbe senso quello che ho scritto in seguito

 :bye:

risposto 6 anni fa
fabio.pellati
X 0 X

Grazie per la precisazione  O0

risposto 6 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda