Estensione della classe Zend_controller_action

Ciao a tutti.

Volevo garantirmi l'opportunità di poter centralizzare alcune parti di codice comuni a tutti i controller...

Per raggiungere questo obbiettivo ho pensato di creare una classe "Estensione_Controller_Action" che estendesse la Zend_Controller_Action in una cartella presente nell'include path di PHP. All'interno di questa classe ho implementato il metodo init() così da potervi inserire il codice in comune a tutti i controller, tipo il reperimento dal registry della connessione al db.

Successivamente ho modificato tutti i miei controller per far sì che estendano "Estensione_Controller_Action" invece di Zend_Controller_Action.... ma niente, lanciando l'applicazione ottengo un errore di classe non tovata nel file IndexController.

Non capisco il perchè, ho anche provato a mettere la mia classe all'interno della directory del framework, dove si trova Zend_controller_action... qualche idea ?

Grazie e ciao.

inviato 7 anni fa
dacdam
X 0 X

Immagino che tu stia usando un autoloader, vero? Tieni presente che di default l'autoloader non provvede al caricamento di qualsiasi classe ma solo quelle che incominciano per Zend_ e ZendX_

Per aggiungere un ulteriore "namespace" puoi fare così:

$autoloader->registerNamespace('Estensione_');

tieni presente inoltre che l'autoloader desume il percorso del file da includere estrapolandolo dal nome stesso, ecco perché i prefissi delle classi vengono chiamati "namespace"

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

Scusa Gianni, ma anche seguendo i tuoi consigli non riesco a risolvere la cosa.

Ho provato sia a:

- Aggiundere il namespace.

- Prefissare la mia casse con 'Zend_'.

- Prefissare la classe con 'model_', essendo che si trova nella cartella model appunto.

Ogni volta ho fatto in modo che il nome del file php coincidesse col nome della classe al suo interno.

ma niente da fare: non funziona.

Il tutto si risolve facendo la require della classe....

Cosa sto sbagliando ?

Ciao.

risposto 7 anni fa
dacdam
modificato 7 anni fa
X 0 X

Istanzi esplicitamente l'autoloader oppure stai usando Zend_Application?

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

Istanzio esplicitamente l'autoloader

   //AUTOLOADER

   require_once 'Zend/Loader/Autoloader.php';

   Zend_Loader_Autoloader::getInstance();   

risposto 7 anni fa
dacdam
X 0 X

Allora supponiamo di voler caricare la classe Estensione_Controller_Action

Zend_Loader_Autoloader::getInstance();

$autoloader->registerNamespace('Estensione_');

Supponendo che tu abbia messo le classi dello Zend in una cartella "lib/Zend", allora la tua nuova classe va salvata in "lib/Estensione/Controller/Action.php"

 :bye:

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

Appena posso provo ma mi sembra che così facendo si ottiene un errore di invocazione di un metodo su una variabile che non è un oggetto. Io avevo risolto facendo:

$autoloader = Zend_Loader_Autoloader::getInstance();

$autoloader->registerNamespace('Estensione_');

Non sono obbligato a tenere una certa profondità delle librerie, vero ? Ovvero: devo per forza fare Estensione_controller_Action o posso anche fare Estensione_Action ?

Comunque appena posso provo.

risposto 7 anni fa
dacdam
X 0 X

Si, mi ero dimenticato di recuperare l'oggetto $autoloader  :-[

No, non è richiesta una "profondità" minima

 :bye:

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