Zend Framework - Extend Modulsteuerung
-
05-10-2019 - |
Frage
Ich habe die folgende Verzeichnisstruktur:
modules/
api/
controllers/
ApiController.php
InventoryController.php
OtherController.php
Die Methode init () ist unter mehreren Controllern gemeinsam so ich refactor möchten, dass in einem übergeordneten Controller-Klasse wie zum Beispiel:
class Api_ApiController extends Zend_Controller_Action
{
public function init()
{
// common code
}
}
Wenn ich versuche:
class Api_InventoryController extends Api_ApiController
ich:
Fatal error: Class 'Api_ApiController' nicht gefunden /application/modules/api/controllers/InventoryController.php in Zeile 4
Warum Zend Framework Karte nicht Api_ApiController zu modules / api / controllers / ApiController.php?
Ich habe Figur aus einem Weg, um diesen durch die ApiController in der Bibliothek setzen / und die Namespace Registrierung, aber es scheint wie ein Hack zu mir.
Lösung
Das „Problem“ ist, dass ZF nicht registriert das Controller Verzeichnis im Autoloader als die normalerweise Regler über die Zend_Controller_Dispatcher
geladen werden. Die Zend_Application_Module_Autoloader
, die nur in dem Bootstrap-Programm auf der anderen Seite instanziiert Register
'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',
)
Also entweder Sie schließen Ihre Basis-Controller Skript mit require_once
oder Sie modifizieren Ihr Autoloader auch die Controller-Verzeichnisse enthalten.
Andere Tipps
[Stark bearbeitet. Bitte ignorieren Sie meine Antwort; Ich die Frage falsch verstanden. Unachtsamkeit meinerseits.]
Haben instanziiert Sie den Autoloader in Ihrem Bootstrap? So etwas wie:
protected function _initAutoloader()
{
$autoloader = new Zend_Application_Module_Autoloader(array(
'namespace' => '',
'basePath' => APPLICATION_PATH . '/modules',
));
return $autoloader;
}