質問

次のディレクトリ構造があります。

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

わかりました:

致命的なエラー:class 'api_apicontroller'は/application/modules/api/controllers/inventorycontroller.phpにありません。

Zend Frameworkがモジュール/API/Controllers/Apicontroller.phpにMap API_APICONTROLLERをマップしないのはなぜですか?

アピコントローラーをライブラリに配置し、名前空間を登録することで、これを回避する方法を見つけましたが、それは私にとってはハックのように思えます。

役に立ちましたか?

解決

「問題」は、コントローラーが通常介してロードされるため、ZFがオートローダーのコントローラーディレクトリを登録しないことです。 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 または、オートローダーを修正して、コントローラーディレクトリも含めます。

他のヒント

重く編集。私の以前の答えを無視してください。質問を誤解しました。私の側の不注意。

ブートストラップにオートローダーをインスタンス化しましたか?何かのようなもの:

protected function _initAutoloader()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '',
        'basePath'  => APPLICATION_PATH . '/modules',
    ));
    return $autoloader;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top