1

最近、PHP でカスタム MVC フレームワークを書き始めました。それは基本的に学習演習です。

私のクラスは次のディレクトリにあります。

  • システム/ライブラリ/
  • システム/コントローラー/
  • システム/モデル
  • アプリケーション/ライブラリ/
  • アプリケーション/コントローラー/
  • アプリケーション/モデル

名前空間と Apache 2 ハンドラー スタイルの URL (コントローラー/アクション/ID) を使用してコントローラーをインスタンス化する方法がわからないため、名前空間を使用していません。他のクラスを自動ロードする Bootstrap クラスを作成しました。

class Bootstrap
{
  public function autoloadClasses($class)<br/>
  {
    $class .= '.php';

    $classDirectories = array(
        SYSTEM_LIBS_DIR,
        SYSTEM_CONTROLLERS_DIR,
        SYSTEM_MODELS_DIR,
        APPLICATION_LIBS_DIR,
        APPLICATION_CONTROLLERS_DIR,
        APPLICATION_MODELS_DIR
    );

    foreach ($classDirectories as $classDirectory) {
        $directoryIterator = new DirectoryIterator($classDirectory);
        foreach($directoryIterator as $file) {
            if ($file == $class) {
                include $classDirectory . $class;
                break 2;
            }
        }
    }

  }


  public function register()
  {
    spl_autoload_register(array($this, 'autoloadClasses'), true);
  }


  public function init()
  {
    $this->register();
    $loader = new Loader($_GET);
    $controller = $loader->createController();
    $controller->executeAction();
  }
}

それは正常に動作します。ただし、PSR-0 で推奨されている実装を実際に使用する必要があることはわかっています。

https://gist.github.com/221634

ただし、名前空間なしで機能させる方法がわかりません。名前空間はオプションのパラメーターのようです。ただし、次のようにしても何も起こりません。Apache ログにエラーが記録されることさえありません。

$libLoader = new SplClassLoader('', 'system/libraries');
4

2 に答える 2

0

PSR-0 の目標は、外部サードパーティ ライブラリクラスの命名方法と、それらのクラスを含むファイルをディスク上のどこに置くかを指定しようとすることでした。この目標は達成されました大まかに言えば、それほど悪いことではありません。相互運用性があり、他のライブラリをすべて踏まないことは良いことです。

あなたのディレクトリ レイアウトとクラス命名スキームは PSR-0 と一致しません。つまり、SplClassLoader はほとんど役に立たないでしょう。

次の 2 つのオプションがあります。

  1. すべてのクラスの名前を変更し、それらを名前空間階層にシャッフルして、それを考慮する必要がある残りのコードをリファクタリングするか、または
  2. SplClassLoader を使用せず、独自のオートローダーを作成してください。

外部配布用のライブラリを構築している場合は、PSR-0 に準拠することをお勧めします。PSR-0 は非常にシンプルで論理的で、手間がかからないためです。

自分で使用するために独自のアプリを構築していて、それをライブラリとして使用するつもりがない場合、そのすべての作業を行う必要はありませ。これは事実のように見えるので、私は大きな脂肪で終わることができます:気にしないでください.

于 2012-12-17T19:59:22.280 に答える
0

私はそれを働かせました。わーい!

これが私のフロント コントローラー (index.php) からのコードです。何らかのタイプのブートストラップ クラスを 1 回呼び出すだけの方がクリーンなので、リファクタリングします。

<?php
use NeilMVC\system\libraries\Loader;
require_once('conf/conf.php');
require_once('SplClassLoader.php');

$loadSystemLibraries = new SplClassLoader('NeilMVC\system\libraries'); 
$loadSystemControllers = new SplClassLoader('NeilMVC\system\controllers');
$loadSystemModels = new SplClassLoader('NeilMVC\system\models');

$loadApplicationLibraries = new SplClassLoader('NeilMVC\application\libraries');
$loadApplicationControllers = new SplClassLoader('NeilMVC\application\controllers');
$loadApplicationModels = new SplClassLoader('NeilMVC\application\models');

$loadSystemLibraries->register();
$loadSystemControllers->register();
$loadSystemModels->register();

$loadApplicationLibraries->register();
$loadApplicationControllers->register();
$loadApplicationModels->register();

$loader = new Loader($_GET);
$controller = $loader->createController();
$controller->executeAction();

完全修飾クラスを MVC スタイルの URL で使用される非修飾名に解決するために、一部のクラスをリファクタリングする必要がありました。それほど難しくはありませんでしたが、理解するためにいじくり回さなければなりませんでした。詳細を知りたい方は、私のウェブサイトhttp://neilgirardi.comからメールでお問い合わせください。

乾杯とハッピーホリデー!

于 2012-12-19T15:48:42.857 に答える