4

私は次のディレクトリ構造を持っています:

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

init()メソッドは複数のコントローラー間で共通であるため、次のような親コントローラークラスにリファクタリングしたいと思います。

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

私が試してみると:

class Api_InventoryController extends Api_ApiController

私は得る:

致命的なエラー:クラス'Api_ApiController'が4行目の/application/modules/api/controllers/InventoryController.phpに見つかりません

ZendFrameworkがApi_ApiControllerをmodules/api / controllers / ApiController.phpにマップしないのはなぜですか?

ApiControllerをlibrary/に配置し、名前空間を登録することでこれを回避する方法を見つけましたが、それは私にはハックのようです。

4

2 に答える 2

7

「問題」は、コントローラが通常Zend_Controller_Dispatcher. 一方Zend_Application_Module_Autoloader、ブートストラッパーでインスタンス化された は、登録するだけです

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

したがって、基本コントローラ スクリプトを含めるかrequire_once、コントローラ ディレクトリも含めるようにオートローダーを変更します。

于 2010-05-27T17:24:59.123 に答える
0

【加筆修正しました。以前の回答は無視してください。質問を読み違えました。私の不注意です。]

Bootstrap でオートローダーをインスタンス化しましたか? 何かのようなもの:

protected function _initAutoloader()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '',
        'basePath'  => APPLICATION_PATH . '/modules',
    ));
    return $autoloader;
}
于 2010-05-27T16:34:51.103 に答える