2

私は、モジュールに移植しているZend Framework(1.11)アプリケーションに取り組んでいます。これにより、開発者はソフトウェアにさまざまな追加機能をプラグアンドプレイして、同じように簡単に削除できます。

私が抱えている問題(そして答えを見つけることができないようです)私は信頼できるライブラリコードを持っています、すなわち私の構造は現在これです

- application
  - (the standard ZF stuff)
  - modules
     - testModule
        - Bootstrap.php
        - controllers
        - configs
        - views
 - library
    - CoreStuff
       - Class.php
       - SpecialClass.php
    - testModuleLibrary
       - Class.php
       - SpecialClass.php

そして、私が本当に望んでいるのは、他の開発者がモジュールをシステムにインストールしやすくするためです。

 - application
   - (the standard ZF stuff)
   - modules
      - testModule
         - Bootstrap.php
         - controllers
         - configs
         - views
         - library
            - Class.php
            - SpecialClass.php
 - library
    - CoreStuff
       - Class.php
       - SpecialClass.php

モジュールBootstrapでオートローダーを使用できますか?または、インクルードパスに追加する必要がありますか?

[編集]

これは私の現在のモジュールのブートストラップです。危険なグーグルでこのコードを何度も見ましたが、違いはないようです。

<?php

    class Notifications_Bootstrap extends Zend_Application_Module_Bootstrap {

        protected function _initLibraryAutoloader () {
            return $this->getResourceLoader()->addResourceType('library', 'library', 'library');
        }

}
4

4 に答える 4

1

次のように、アプリケーション構成ファイルでライブラリパスを定義できます。これはYMLの例です。

project:
    bootstrap:
        path: APPLICATION_PATH/Bootstrap/index.php
        class: Bootstrap_Index
    Autoloadernamespaces:
        - Zend_
        - Library1_
        - Library2_
    resources:
        FrontController:
            moduledirectory:
                - APPLICATION_PATH/modules
......

これがINI形式の例です

[bootstrap]
        Autoloadernamespaces[] = "Zend_"
        Autoloadernamespaces[] = "Library1_"
        Autoloadernamespaces[] = "Library2_"

        resources.FrontController.moduleDirectory = APPLICATION_PATH"/modules"
        resources.FrontController.resetRouterOnEveryRequest = true

        bootstrap.path = APPLICATION_PATH "/Bootstrap/index.php"
        bootstrap.class = "Bootstrap_Index"

プロジェクトのディレクトリ構造に関しては、次のようなものを使用することをお勧めします。

- application 
    - Bootstrap
        - index.php
    - Modules
        - Mod1
            - controllers
            - views
        - Mod2
            - controllers
            - views
        ...
- library 
    - Zend
        - ...
    - Library1
        - ...
    - Library2
        - ...

ディレクトリ構造を作成すると、/:module /:controller /:actionのようなURLを使用して、すべてのサードパーティコードを独自のプールライブラリディレクトリに個別に保持できます。

于 2012-11-15T10:26:48.627 に答える
1

次のコードで問題を解決しました。私は文字通り私が以前にこれを思い付かなかった理由がわかりません:(:(

class Notifications_Bootstrap extends Zend_Application_Module_Bootstrap {
    protected function _initConfig () {
        set_include_path(implode(PATH_SEPARATOR, array(
            dirname(__FILE__) . '/library',
            get_include_path(),
        )));
    }
}
于 2012-11-14T15:25:02.873 に答える
0

モジュールのBoostrap.phpを使用するだけでもかまいません。機能を提供する

protected function _initAutoload(){}

libを利用可能にします。したがって、モジュールを開発してリソースをロード可能にする作業の一部であるため、モジュール開発者にそれを行わせることができます:)

于 2012-11-14T12:11:53.827 に答える
0

うまくいけば、元の質問に答えるだけでなく、ここに提出されたいくつかの項目についていくつかの説明を提供するために、この応答を追加します。私はZF1.11のモジュールの積極的な開発者であり、私たちが維持しているいくつかのモジュールの1つで毎日説明しようとしていることを使用しています。

この回答が長かったことを前もってお詫び申し上げます。カバーして考慮すべきいくつかの項目があります。

まず、実装について。

私の知る限り、提供された次のスニペットは約1.8で機能し、1.11では必要ありません。

<?php

class Notifications_Bootstrap extends Zend_Application_Module_Bootstrap {

    protected function _initLibraryAutoloader () {
        return $this->getResourceLoader()->addResourceType('library', 'library', 'library');
    }

}

ただし、以下で説明するいくつかの重要な要素があれば、以下は問題なく機能します。

protected function _initLibraryAutoloader () {
    return $this->getResourceLoader()->addResourceType('library', 'library', 'Library_');
}

3番目のパラメーター(名前空間)にわずかな違いがあります。これを最もよく説明するのは、関数を次のように更新することです。

protected function _initLibraryAutoloader () {
    $this->getResourceLoader()->addResourceType('library', 'library', 'Library_');
    var_dump($this->getResourceLoader()->getResourceTypes());die;
}

出力は次のようになります。

Array
(
[dbtable] => Array
    (
        [namespace] => Admin_Model_DbTable
        [path] => /path/to/trunk/application/modules/admin/models/DbTable
    )

[mappers] => Array
    (
        [namespace] => Admin_Model_Mapper
        [path] => /path/to/trunk/application/modules/admin/models/mappers
    )

[form] => Array
    (
        [namespace] => Admin_Form
        [path] => /path/to/trunk/application/modules/admin/forms
    )

[model] => Array
    (
        [namespace] => Admin_Model
        [path] => /path/to/trunk/application/modules/admin/models
    )

[plugin] => Array
    (
        [namespace] => Admin_Plugin
        [path] => /path/to/trunk/application/modules/admin/plugins
    )

[service] => Array
    (
        [namespace] => Admin_Service
        [path] => /path/to/trunk/application/modules/admin/services
    )

[viewhelper] => Array
    (
        [namespace] => Admin_View_Helper
        [path] => /path/to/trunk/application/modules/admin/views/helpers
    )

[viewfilter] => Array
    (
        [namespace] => Admin_View_Filter
        [path] => /path/to/trunk/application/modules/admin/views/filters
    )

[library] => Array
    (
        [namespace] => Admin_Library
        [path] => /path/to/trunk/application/modules/admin/library
    )

)

これを3番目のパラメーターとして以前の「ライブラリ」と比較すると、なぜそれがこのような重要な違いを生むのかがすぐにわかります。

繰り返しになりますが、この時点で、プレフィックスが「Library_」のライブラリタイプを宣言しました。これは「Admin_Library」に変換されます。これを実装するには、メインのアプリケーションモジュールと同じように、わずかな調整を加えて、ライブラリフォルダをモジュールに配置します。管理モジュール固有のコントローラーアクション(Admin_Library_Controller_Action)を作成するには、クラス名がAdmin_Library_Controller_Actionのlibrary / Controller/Action.phpを使用します。これは最初は最も混乱するものですが、モジュールで使用する必要がある他のリソース名前空間と非常によく似ています。

これで技術的な説明は終わりです。これ以上読まない場合は、モジュールに固有のライブラリを用意し、完全に自己完結型にして、再利用可能なモジュールの簡単なコピー/貼り付けの実装を行うことができます。

ここで私が見た他の応答のいくつかについてのいくつかのコメントのために。

無限大

「構造に従うと、最終的に-Module1(Lib1、Lib2)-Module2(Lib1、Lib3)になる可能性があるため、必要なライブラリの複製を開始します。」

これは技術的には正しいですが、あちこちで同じライブラリを日常的に使用していることに気付いた場合、実際の開発スタイルでより多くの問題が明らかになります。通常、これらの一般的なアイテムは、Zendと同じ外部として使用する別のライブラリに保存され、メインのアプリケーションライブラリフォルダーのZendと一緒に配置されます。

すでにそれを行っている場合、追加の説明が必要になる可能性があると思われる場合は、名前空間を正しく使用していれば、ライブラリクラス名の衝突について心配する必要はまったくありません。短期間、複数のモジュールに同じコードのクラスが必要になる場合がありますが、これが発生したらすぐに、前述のZendに加えて共通ライブラリを検討する必要があります。

この回答が長かったことを改めてお詫び申し上げます。モジュールでのライブラリの実装を必要としているこの投稿に出くわす可能性のある人に役立つことを願っています。

于 2013-01-17T19:58:33.257 に答える