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.

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top