Pregunta

Tengo la siguiente estructura de directorios:

modules/
  api/
    controllers/
      ApiController.php
      InventoryController.php
      OtherController.php

El método init () es común entre varios controladores, así que quiero perfeccionar por que en una clase de controlador de matriz tales como:

class Api_ApiController extends Zend_Controller_Action
{
    public function init()
    {
        // common code
    }
}

Cuando intento:

class Api_InventoryController extends Api_ApiController

Puedo obtener:

Fatal error: Class 'Api_ApiController' no se encuentran en /application/modules/api/controllers/InventoryController.php en la línea 4

¿Por qué Zend Framework se asigna a los módulos Api_ApiController / api / controladores / ApiController.php?

Tengo averiguar una forma de evitar esto poniendo el ApiController en la biblioteca / y registrar el espacio de nombres, pero parece que un truco para mí.

¿Fue útil?

Solución

El "problema" es, que ZF no registra el directorio de controladores en el cargador automático como los controladores normalmente se cargan a través de la Zend_Controller_Dispatcher. El Zend_Application_Module_Autoloader, que se crea una instancia en el programa previo por el contrario solamente registros

        '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',
        )

Así que, o incluir su script del controlador base con require_once o actualiza tu cargador automático para incluir también los directorios de controladores.

Otros consejos

[pesadamente corregida. Por favor, ignore mi respuesta anterior; Leí mal la pregunta. El descuido de mi parte.]

¿Lo instancia del cargador automático en su Bootstrap? Algo así como:

protected function _initAutoloader()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '',
        'basePath'  => APPLICATION_PATH . '/modules',
    ));
    return $autoloader;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top