it-swarm-ja.tech

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

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

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

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つ以上が何であるかを教えてもらえますか?

8
Andy

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

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

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

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

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

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

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

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

1
David Fritsch

あなたが探しているスキーマは、実際には[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 を参照してください。

4
Jeremy Proffitt