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.

War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top