6

オンライン注文のすべてを処理する「olo」というモジュールがあります。

ここで、「olosec」という新しいモジュールを作成しました。これは、フローを少し変更した別のバージョンを作成し、一部のコントローラーでその他の変更を加えたいからです。

「olo」のコントローラーで「olosec」のコントローラーを拡張することは可能ですか?

今のところ私は試しました

class Olosec_CartController extends Olo_CartController

次のようなエラーがスローされます

Warning: include_once(Olo/CartController.php): failed to open stream: 
No such file or directory in /httpdocs/library/Zend/Loader.php on line 146 Warning:
include_once(): Failed opening 'Olo/CartController.php' for inclusion.
bla bla bla (include path) bla bla bla

私のディレクトリ構造は次のようなものです(感謝tree \F \AEditPlus++

+---application
|   +---views
|   |   +---scripts
|   |   +---layouts
|   |   |   +---default
|   |   |   +---admin
|   |   +---languages
|   |   +---helpers
|   +---modules
|   |   +---admin
|   |   +---mobile
|   |   +---olo
|   |   |   +---controllers
|   |       |       IndexController.php
|   |       |       MenuController.php
|   |       |       CartController.php
|   |       |       OrderlistController.php
|   |   |   |
|   |   |   +---models
|   |   |   \---views
|   |   |       +---helpers
|   |   |       \---scripts
|   |   |           +---index
|   |   |           +---menu
|   |   |           +---cart
|   |   |           \---orderlist
|   |   \---olosec
|   |       +---controllers
|   |       |       IndexController.php
|   |       |       MenuController.php
|   |       |       CartController.php
|   |       |       OrderlistController.php
|   |       |
|   |       +---models
|   |       \---views
|   |           +---helpers
|   |           \---scripts
|   |               +---index
|   |               +---menu
|   |               +---cart
|   |               \---orderlist
|   +---models
|   +---controllers
|   \---configs
+---library
+---public
|   +---cli
|   \---default
+---tests
\---data

アップデート

私はこの「厄介な」ハックを使用しました

require_once( APPLICATION_PATH . '/modules/olo/controllers/CartController.php');

更新 @ Rakesh

私はブートストラップにこれを持っています..

function _initAutoloader() {
    $autoloader = Zend_Loader_Autoloader::getInstance();
    $autoloader->setFallbackAutoloader(true);
    return $autoloader;
}

私のapplication.iniで

autoloadernamespaces.0 = "Zend"
autoloadernamespaces.1 = "My"
autoloadernamespaces.2 = "Something"
4

2 に答える 2

1

Zend Autoloader からクラスをインスタンス化した場合、エラーは解消されます。

bootstrap.php ファイルに次のコードが含まれている必要があります。

protected function _initAutoloader()
{
    $autoloader = new Zend_Application_Module_Autoloader(array(
       'namespace' => '',
       'basePath'  => APPLICATION_PATH . '/modules',
    ));
    return $autoloader;
}

一般に、コントローラは Zend_Controller_Dispatcher を介してロードされます。Zend_Application_Module_Autoloader を使用して、他のコントローラからクラスをインスタンス化する必要があります。

于 2011-05-25T05:14:36.917 に答える
1

共通クラス用のカスタム ライブラリ フォルダーを用意しない理由

application/
    library/    < for common classes

1 つのコントローラーだけでなく、プロジェクト内の多くの場所でいくつかのクラスを使用している場合、これは適切なアプローチです。

この新しいapplication/library/フォルダーをinclude pathブーストラップ ファイルに追加するだけです。

もう 1 つの方法は、アクション ヘルパーを使用することです。しかし、私が説明したように、共通クラス フォルダーは適切な解決策になるはずです。ただし、いくつかの興味深いリソースを見つけました。それらのほとんどはクロスモジュールコーディングに関するものですが、とにかく役立つかもしれませんhttp://zend-framework-community.634137.n4.nabble.com/Code-re-use-across-modules-td668554 .htmlZend Framework の異なるモジュールで同じモデルを使用する方法は?


別のアプローチについて説明しましょう

class BasicController extends Zend_Controller_Action
{
    public static $variable = '';

    public function init()
    {
        self::$variable = 'assign value';
    }
}

class HomeController extends BasicController
{
    public function indexAction()
    {
        $bioVar = parrent::$variable;
    }
}

コントローラはアクションを表し、各アクションには対応するビュー スクリプトがあるため、これは単純にコントローラを拡張するよりも優れています。ただし、すべてのクラスをオートローダーに登録する必要があります。

于 2011-05-05T10:23:00.517 に答える