JLoader :: registerPrefixを使用したクラスの自動読み込みに関する問題


8

これはおそらく本当に愚かな質問ですが、私は答えを見つけることができず、試行錯誤が失敗しました。

私はJoomla 3.xのコンポーネントを開発していますが、使用したいクラスがいくつかあります。JLoader::registerPrefix()メソッドを実装しようとしています。私が2つのクラスHelperとを持っているとしましょうNotHelpfulHelperは次の場所に格納されている静的クラスです。

JPATH_LIBRARIES。'/foo/bar/Helper.php'

またNotHelpful、次の場所に保存されている非静的クラスです。

JPATH_LIBRARIES。'/foo/baz/NotHelpful.php'

これらを登録したい場合、私の理解は次のとおりです。

JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo'); 

これはエントリー・ポイントからアプリケーションまでです。

次に、を呼び出すHelperには、単に使用するFooBarHelper::method1();か、新しいインスタンスNotHelpfulを作成します$Class = new FooBazNotHelpful();

私にとって不明確なのは、Helper.phpまたはNotHelpful.php内の実際のクラス名がどうあるべきかです。それがあるべきFooBarHelperHelperBarHelper完全に他の、または何か?

私が呼び出そうとするとFooBarHelper::method1();、クラスの名前に関係なくエラーが発生します:

PHPの致命的なエラー:クラス 'FooBarHelper'が見つかりません

私は明らかに少なくとも一つのことを間違っています。それらの1つ以上が何であるかを誰かに教えてもらえますか?

回答:


1

プレフィックスローダーについての私の理解では、ファイル名は常にすべて小文字になります。

これはいい: JLoader::registerPrefix('Foo', JPATH_LIBRARIES . '/foo');

ただし、クラス名は別のクラスパスに変換されます。

FooBarHelper => JPATH_LIBRARIES . '/foo/bar/helper.php'

FooBazNotHelpful => JPATH_LIBRARIES . '/foo/baz/not/helpful.php'

接頭辞システムは、ここのドキュメント基づいて、常にこの規則に従います

クラス名はキャメルケースである必要があり、名前の各セグメントはフォルダパスを表します。名前の最後のセグメントはクラスファイルの名前です。

最後の質問に答えるために、クラス名はCamelCaseである必要があります。また、クラス名は小文字の名前で、すべて小文字のフォルダにある必要があります。


したがって、この例ではhelpful.php内のクラス定義は以下のようになりますclass Helpful { ...か、class FooBazNotHelpful { ...または他の何か?
アンディ

クラスFooBazNotHelpful @andy
David Fritsch

4

あなたが探しているスキーマは、実際には[ComponentName] [Directory] ​​[Name]です。コンポーネントには通常、少なくとも次のディレクトリがあります:コントローラー、モデル、ビュー、ヘルパー。helper.phpというヘルパーファイルを含むcom_mycomponentというコンポーネントの場合、MycomponentHelperHelperになります。キャメルケースのフォーマットは、クラスが正しく認識される上で特に重要です。

コンポーネントが他のコンポーネントで利用できるようにするクラスを提供しているのでない限り、JLoader :: registerPrefix()を使用する必要はありません。代わりに、JLoader :: discover()を使用して、それらのクラスをコンポーネントに提供することもできます。com_mycomponent / helpersの場合、これは

JLoader :: discover( 'Helpers'、JPATH_COMPONENT。 '/ helpers');

JLoader :: registerNamespace()を使用してPHP名前空間を使用することもできます。

これらのメソッドの詳細については、http://docs.joomla.org/Using_own_library_in_your_extensionsを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.