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 10 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 10 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 10 anni fa
dacdam
modificato 10 anni fa
X 0 X

Istanzi esplicitamente l'autoloader oppure stai usando Zend_Application?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Istanzio esplicitamente l'autoloader

   //AUTOLOADER

   require_once 'Zend/Loader/Autoloader.php';

   Zend_Loader_Autoloader::getInstance();   

risposto 10 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 10 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 10 anni fa
dacdam
X 0 X

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

No, non è richiesta una "profondità" minima

 :bye:

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