ホームページ  >  記事  >  php教程  >  PHP フレームワークを段階的に書く (3)

PHP フレームワークを段階的に書く (3)

WBOY
WBOYオリジナル
2016-06-21 08:50:41854ブラウズ

前回お話ししたように、基本的な MVC アーキテクチャは構築されましたが、モデルが毎回 DB に接続し、DB を閉じるなど、それ自体にはまだ多くの問題があります。コードの冗長性、ビューは依然として PHP コードである、各ファイルは多くのインクルード コードを使用する必要があるなど。

フレームワークを作成するには、まず標準のディレクトリ構造を定義する必要があります。このディレクトリ構造は一時的に修正されており、ユーザーによる変更は許可されていません。これにより、コードの量が減り、誰でも簡単に変更できるようになります。もっとはっきりと見えます。

以前に Toper を作成したことがあるので、デモンストレーションのために Toper のディレクトリ構造を使用します。

ライブラリ(フレームワーク格納ディレクトリ)

テスト (このフレームワークの名前が test であると仮定します)

UserApps (ユーザーの APP 保存ディレクトリ)

Configs (設定ファイル格納ディレクトリ)

モジュール (モジュール格納ディレクトリ)

コントローラー (すべてのコントローラーが保存されるディレクトリ)

Models (モデル格納ディレクトリ)

ビュー (保存ディレクトリの表示)

ヘルパー (補助ファイルディレクトリ)

プラグイン (プラグイン保存ディレクトリ、一時的に利用不可)

パブリック (Web サイトのルート ディレクトリ)

index.php (最も重要なエントリ ファイル)

この場所については説明が必要です。Public ディレクトリは Web サイトのルート ディレクトリであり、Library ディレクトリと UserApps ディレクトリは Web サイトのルート ディレクトリの外に保存されているため、ユーザーはこの PHP に直接アクセスできません。ブラウザファイル経由でアクセスすると、Web サイトのセキュリティが向上します。

以前はすべてのルーティング関数をエントリ ファイルに入れていましたが、実際には、これはエントリ ファイルでは処理できないため、以前にエントリ ファイルに保存されていたコードをテストに移行しました。エントリファイルで以前に完了していた関数はルーティングだったので、コードを Route.php に移行しました。このファイルでルーティング関数が完了します。

OK、Route.php ファイルの内容を見てみましょう:

01

01

02 class Route {

03 public static function run() { <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>02<🎜><🎜> <🎜><🎜>クラスルート {<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>03<🎜><🎜> <🎜><🎜> パブリック静的関数 run() {<🎜><🎜>

04 $controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //设置了默认的控制器

05 $action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //设置了默认的Action

06 $controllerBasePath = dirname(__FILE__) . '/../../UserApps/Modules/Controllers/';

07 $controllerFilePath = $controllerBasePath . $controller . 'Controller.php';

08 if(is_file($controllerFilePath)) {

09 include $controllerFilePath;

10 $controllerName = $controller . 'Controller';

11 if(class_exists($controllerName)) {

12 $controllerHandler = new $controllerName();

13 if(method_exists($controllerHandler,$action)) {

14 $controllerHandler->$action();

15                 } else {

16                     echo 'the method does not exists';

17                 }

18             } else {

19                 echo 'the class does not exists';

20             }

21         } else {

22             echo 'controller not exists';

23         }

24     }

25 }

この時点では、以前にエントリ ファイルに配置されていたコードを Route.php ファイルにコピーしただけであることがわかりましたか?

エントリーファイルのコードが少ない! ! !

1

1

2 include dirname(__FILE__) . '/../Library/Test/Route.php';

3 Route::run();

<テーブル>

2

ディレクトリ名(__FILE__) を含めます。 '/../Library/Test/Route.php';

<テーブル>

3

Route::run();

1

コードはわずか 2 行で、十分に簡潔です。 !

2 defined('APP_PATH') define('APP_PATH',dirname(__FILE__) . '/..');

3 defined('FRAMEWORK_PATH') define('FRAMEWORK_PATH',APP_PATH . '/Library/Test');

しかし、現在のパスを決定するために dirname を使用する必要があるたびに問題が発生します。このフレームワークに 20 個のファイルがある場合、ファイルを取得するために dirname が使用される場所が各ファイルに 3 か所あります。絶対パスなので、恐ろしいことに、90 個の重複コードが存在します。将来パスが変更されたら、それは悪夢になります。 !

4 include FRAMEWORK_PATH . '/Route.php';

5 Route::run();

したがって、エントリ ファイルにパスを定義することもできます。このパスは、ライブラリの下のテスト ディレクトリ パスをよく使用するため、フレームワーク パスも設定します。エントリ ファイルが変更されました:

<テーブル>

1

01
<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>2<🎜><🎜> <🎜><🎜>define('APP_PATH')define('APP_PATH',dirname(__FILE__) . '/..');<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>3<🎜><🎜> <🎜><🎜>define('FRAMEWORK_PATH')define('FRAMEWORK_PATH',APP_PATH . '/Library/Test');<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>4<🎜><🎜> <🎜><🎜>FRAMEWORK_PATH を含めます。<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>5<🎜><🎜> <🎜><🎜>Route::run();<🎜><🎜> <🎜> <🎜> <🎜> <🎜> <🎜><🎜> 次に、それに応じて Route.php も変更する必要があります: <🎜><🎜><🎜> <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>01<🎜><🎜> <🎜><🎜><🎜>

02 class Route {

03 public static function run() {

04 $controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //设置了默认的控制器

05 $action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //设置了默认的Action

06 $controllerBasePath = APP_PATH . '/UserApps/Modules/Controllers/';

07 $controllerFilePath = $controllerBasePath . $controller . 'Controller.php';

08 if(is_file($controllerFilePath)) {

09 include $controllerFilePath;

10 $controllerName = $controller . 'Controller';

11 if(class_exists($controllerName)) {

12 $controllerHandler = new $controllerName();

13 if(method_exists($controllerHandler,$action)) {

14 $controllerHandler->$action();

15                 } else {

16                     echo 'the method does not exists';

17                 }

18             } else {

19                 echo 'the class does not exists';

20             }

21         } else {

22             echo 'controller not exists';

23         }

24     }

25 }

次に、このコードがはるかに優れているかどうかを確認してください。 ! !

ただし、MVC を通じてアプリケーションを構築する場合、1 つのファイルに多くのクラスが含まれることが多いため、フレームワークがクラ​​スを手動で含めるのではなく自動的にインポートできるかどうか、引き続き私のログに注目してください。 !



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。