Zend Framework - Estendere modulo di controllo
-
05-10-2019 - |
Domanda
Ho la seguente struttura di directory:
modules/
api/
controllers/
ApiController.php
InventoryController.php
OtherController.php
Il metodo init () è comune tra più controller quindi voglio refactoring che in una classe Controller padre, ad esempio:
class Api_ApiController extends Zend_Controller_Action
{
public function init()
{
// common code
}
}
Quando provo:
class Api_InventoryController extends Api_ApiController
I ottenere:
Fatal error: Class 'Api_ApiController' non si trovano in /application/modules/api/controllers/InventoryController.php sulla linea 4
Perché Zend Framework non mappa Api_ApiController ai moduli / api / controller / ApiController.php?
Ho capire un modo per aggirare questo mettendo l'ApiController nella libreria / e registrare lo spazio dei nomi, ma sembra un trucco per me.
Soluzione
Il "problema" è che ZF non registra la directory controllori nel caricatore automatico, come i controllori normalmente vengono caricati tramite il Zend_Controller_Dispatcher
. Il Zend_Application_Module_Autoloader
, che è un'istanza del programma di avvio automatico d'altra parte solo i registri
'dbtable' => array(
'namespace' => 'Model_DbTable',
'path' => 'models/DbTable',
),
'mappers' => array(
'namespace' => 'Model_Mapper',
'path' => 'models/mappers',
),
'form' => array(
'namespace' => 'Form',
'path' => 'forms',
),
'model' => array(
'namespace' => 'Model',
'path' => 'models',
),
'plugin' => array(
'namespace' => 'Plugin',
'path' => 'plugins',
),
'service' => array(
'namespace' => 'Service',
'path' => 'services',
),
'viewhelper' => array(
'namespace' => 'View_Helper',
'path' => 'views/helpers',
),
'viewfilter' => array(
'namespace' => 'View_Filter',
'path' => 'views/filters',
)
Quindi, o si includono lo script controller di base con require_once
o modifiy il caricatore automatico per includere anche le directory del controller.
Altri suggerimenti
[pesantemente modificato. Si prega di ignorare la mia risposta precedente; Ho letto male la domanda. Disattenzione da parte mia.]
Hai istanziare il caricatore automatico nel vostro Bootstrap? Qualcosa di simile:
protected function _initAutoloader()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH . '/modules',
));
return $autoloader;
}