0

何時間も経った後、デバッグと変更を行っても、これが可能かどうかわかりません。教えてください。

私のフレームワークは、サーバー上の多くのサイトで使用されています。SplClassLoaderを実装しようとしていますが、ほとんどまたはまったく成功していません。別のパスを追加する必要があるまで(ディスパッチが完了したとき)、ローダーは(いくつかの変更を加えて)動作します。

ローダーは、フレームワークがアプリと同じディレクトリに配置されている場合にのみ動作するように見えますが、逆には動作しません。

このローダーを使用することは可能ですか

  • 適切な名前空間のサポート
  • ハックがほとんどまたはまったくない

ライブラリが集中化され、多くのアプリがそれを使用するのはいつですか?

私のセットアップ:

/lib
  /Framework
    /Controller
      Front.php
/site1
  /App
    /App1
    /App2
      /Controllers
/site2

site1/public/index.phpディスパッチを行ってから実際のコントローラーを開始するフロントコントローラーを開始します。

私の(おそらく間違っている)名前空間の設定:

Frameworkusing namespace内のすべてのクラスFramework。フレームワークからクラスを拡張するコントローラーを開始するまでは、これで問題ありません。これは物事がうまくいかないところです。上記の SplClassLoader は、これらのようなパスを処理できません。エラーログからわかるのは、主な問題は、私にとって受け入れられないlib下に配置されていないことです。site1

4

1 に答える 1

1

編集:

PEAR の名前付け/名前空間を使用しているとは言いませんでした。その場合、動作が少し異なります。

最初に、フレームワークのクラスの命名を調整する必要があります。それらにはFrameworkセグメントが必要なので:

Controller_Front

する必要があります

Framework_Controller_Front

これにより、コントローラーの一意の ns が得られます。

次に、ローダーを使用して、次のようなプレフィックスを登録します。

$loader->registerPrefix('Framework', 'absolute/path/to/lib');

PEAR 命名で ClassLoader を使用したことがないので_、プレフィックスに末尾を残す必要があるかどうかはわかりませんが、試行錯誤でそれを理解できるはずです。また、「absolute/path/to/lib」または「absolute/path/to/lib/Framework」へのパスを指すかどうかもわかりません-再度試行錯誤してそれを指摘する必要があります:-)


どこが間違っているのかわかりませんが、これを行いましょう。

次の内容のファイルを作成します/libautoload.php

// require/use statements for the Symfony ClassLoader Component

$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    'Framework' => __DIR__                    
));

$loader->register();

return $loader;

この時点で、クラス・ローダーがセットアップされます。次に、各サイトのindex.php(またはブートストラップ手順を実行するために使用するものは何でも:

// configure the path to the framework from SITE/public and require the autoload.php
$frameworkDir = realpath(__DIR__ . '/../../lib');
$siteDir = realpath(__DIR__ . '/../'); // whatever gives us site1

$loader = require_once($frameworkDir . '/autoload.php');

// now lets start mapping our application specific namespaces
$loader->registerNamespace('App1', $siteDir . '/App/App1');
$loader->registerNamespace('App2', $siteDir . '/App/App2');

// then the rest of your bootstrapping and FC initialization

Symfony Components ClassLoaderを試してみるのもいいかもしれません- それは私が普段使っているものです。名前空間を絶対パスで登録している限り、それは問題ではありません。

$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    'Framework' => __DIR__ . '/lib',
    'AppOne'    => $somevarHoldingTheABSPrefixToTheAppOneCode . '/lib',
    'AppTwo'    => $somevarHoldingTheABSPrefixToTheAppTwoCode . '/lib',
    'AppTwo\\SomeVendor' => $somevarHoldingTheABSPrefixToTheAppTwoCode . '/vendor/somevendor/lib'                    
));

$loader->register();
于 2012-11-21T15:10:32.403 に答える