PHP フレームワークをステップバイステップで作成する (5)

WBOY
リリース: 2016-06-21 08:50:43
オリジナル
1207 人が閲覧しました

前回は自動インポートを使用してクラスの遅延ロードを実装することについて話しました。今回は設定ファイルについて話したいと思います。

前回の記事で設定ファイルについて触れていなかったことにお気づきかわかりませんが、プロジェクトでは設定ファイルが不可欠です。

次に、Route.php のデフォルトのコントローラーとアクションが構成可能になっているとします。

最も単純な方法を使用します:

1

1

2 $defaultController = 'Index';

3 $defaultAction = 'index';

<テーブル>

2

$defaultController = 'インデックス';

<テーブル>

1
3

2 include APP_PATH . '/config.php';

$defaultAction = 'index';

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

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

次に、このファイルを Route.php に含めます:

<テーブル>

1

1

2 return array(
<🎜> <テーブル> <🎜><🎜>2<🎜><🎜> <🎜><🎜>APP_PATH を含めます。<🎜><🎜> <🎜> <🎜> <🎜> <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>1<🎜><🎜> <🎜><🎜>$controller = empty($_GET['c']) ? $defaultController :trim($_GET['c']) //デフォルトのコントローラーが設定されています <🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>2<🎜><🎜> <🎜><🎜>$action = empty($_GET['a']) ? $defaultAction :trim($_GET['a']) //デフォルトのアクションが設定されています<🎜><🎜> <🎜> <🎜> <🎜> <🎜> <🎜><🎜>もちろん、次の方法も使用できます: <🎜><🎜><🎜> <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>1<🎜><🎜> <🎜><🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>2<🎜><🎜> <🎜><🎜>配列を返す(<🎜><🎜>

3 'defaultController' => 'Index',

4        'defaultAction' => 'index'

5 );

または Route.php に次のように含めます:

1

1

2 $config = include APP_PATH . '/config.php';

<テーブル>

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

2

2 $action = empty($_GET['a']) ? $config['defaultAction'] : trim($_GET['a']); //设置了默认的Action
<🎜><🎜>$config = include '/config.php';<🎜><🎜> <🎜> <🎜> <🎜> <🎜> <🎜> <🎜> <テーブル> <🎜><🎜>1<🎜><🎜> <🎜><🎜>$controller= empty($_GET['c']) ? $config['defaultController'] : trim($_GET['c']); //デフォルトのコントローラーが設定されています<🎜> < 🎜> <🎜> <🎜> <テーブル> <🎜><🎜>2<🎜><🎜> <🎜><🎜>$action = empty($_GET['a']) ? $config['defaultAction'] :trim($_GET['a']) //デフォルトのアクションを設定します<🎜>< 🎜 >

しかし、構成ファイルはフレームワーク実行プロセス全体ですべてのクラスで使用される可能性が高く、最初の 2 つのメソッドは特定のクラスの特定のメソッドでのみ使用できるため、どのように使用できますか?どのクラスも利用できますか?

この問題を解決するには、構成情報を保存する Config クラス、構成情報を読み取る Config::get、構成情報を設定する Config::set を定義するなど、静的メソッドを使用できます。具体的な方法を自分で試してみてください。

もちろん、私はこの方法を採用するつもりはありません。Thinkphp のソースコードを見ていて、そのエレガントな特殊関数 C に魅了されたのかもしれません。その後、Toper を書くときにもいくつかの特殊関数を使用しました。 C は主に構成情報の設定と読み取りを担当します。私の個人的な観点からは、オブジェクト指向が必要ですが、すべてがオブジェクト指向である必要はないため、いくつかのパブリック関数を格納する function.php を定義します。これをパブリック関数ライブラリと呼びます。

パブリック関数ライブラリのおかげで、前の記事の自動インポート (__autoload) をこのファイルに転送することもできます。Route.php に __autoload コードの一部があるのは非常に奇妙だからです。 !

さて、先ほどの機能による構成情報の設定と読み込みを実装するにはどうすればよいでしょうか?

さて、まず Toper での実装を示しましょう:

<テーブル>

01 function C($name = null,$val = null) {

01

02 static $_config = array();

関数 C($name = null,$val = null) {

03 if(empty($name)) {

04 return $_config;
<テーブル>

02

05 } elseif(is_string($name)) {

06 if(empty($val)) {
static $_config = array();

07 if(!strpos($name,'=>')) {
03 if(empty($name)) { テーブル> 04 return $_config; テーブル> 05 } elseif(is_string($name)) { テーブル> 06 if(empty($val)) { テーブル> 07 if(!strpos($name,'=>')) { テーブル>

08                 //一维

09                 return isset($_config[$name]) ? $_config[$name] : null;

10             } else {

11                 //目前只支持二维

12                 $name = explode('=>',$name);

13                 returnisset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;

14             }

15         } else {

16             if(!strpos($name,'=>')) {

17                 //直接设置

18                 $_config[$name] = $val;

19             } else {

20                 //设置二维

21                 $name = explode('=>',$name);

22                 $_config[$name[0]][$name[1]] = $val;

23             }

24         }

25     } elseif(is_array($name)) {

26         foreach($name as $key=>$value) {

27             $_config[$key] = $value;

28         }

29         return ;

30     } else {

31         throw new Exception('参数类型出错');

32         return ;

33     }

34 }

コードは非常に長いように見えますが、実際、原理は非常に単純です。パラメータが 1 つだけ渡された場合、2 番目のパラメータは NULL であるかどうかを識別します。最初のパラメータが文字列の場合、この関数は読み取りとして認識されます。2 番目のパラメータが空でない場合、または最初のパラメータが配列である場合、この関数は設定として認識されます。 !

私は今は比較的怠け者で、この関数の使用に非常に慣れているので、ここでは例としてこの関数を使用します。詳細については、Toper の /Library/Toper /function.php を参照してください。

たとえば、defaultController を今読みたい場合は、C('defaultController') を使用してください。設定したい場合は、C('defaultController','Index') を使用してください。 ! !

次に、この function.php をエントリ ファイルにインポートするだけです:

1

1

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

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

4 defined('MODULES_PATH') define('MODULES_PATH',APP_PATH . '/UserApps/Modules');
<テーブル>

2

5 include FRAMEWORK_PATH . '/function.php';
<🎜> <🎜><🎜>define('APP_PATH')define('APP_PATH',dirname(__FILE__) . '/..');<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>3<🎜><🎜> <🎜><🎜>define('FRAMEWORK_PATH')define('FRAMEWORK_PATH',APP_PATH . '/Library/Test');<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>4<🎜><🎜> <🎜><🎜>define('MODULES_PATH')define('MODULES_PATH',APP_PATH . '/UserApps/Modules');<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>5<🎜><🎜> <🎜><🎜>FRAMEWORK_PATH を含めます。<🎜><🎜>

6 include FRAMEWORK_PATH . '/Route.php';

7 Route::run();

C 関数の先頭では、要素が格納されていないことに気づいたかもしれません。では、構成ファイルの内容を初期化して C 関数に書き込むにはどうすればよいでしょうか。

設定ファイルをプロジェクトのルート ディレクトリに保存する前は、実際には以前に合意した仕様に準拠していませんでした。そのため、利便性を高めるために、設定ファイルを /UserApps/Configs ディレクトリに切り出します。このパスでは、構成ファイルへのパスを指す CONFIGS_PATH を定義します。

次に、エントリ ファイルがどのようになったかを見てみましょう:

<テーブル>

1

1

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

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

4 defined('MODULES_PATH') define('MODULES_PATH',APP_PATH . '/UserApps/Modules');
<テーブル>

2

5 defined('CONFIGS_PATH') define('CONFIGS_PATH',APP_PATH . '/UserApps/Configs');

6 include FRAMEWORK_PATH . '/function.php';
define('APP_PATH')define('APP_PATH',dirname(__FILE__) . '/..');

7 C(include CONFIGS_PATH . '/config.php'); //写入配置信息

<テーブル>

8 include FRAMEWORK_PATH . '/Route.php';
3<🎜><🎜> <🎜><🎜>define('FRAMEWORK_PATH')define('FRAMEWORK_PATH',APP_PATH . '/Library/Test');<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>4<🎜><🎜> <🎜><🎜>define('MODULES_PATH')define('MODULES_PATH',APP_PATH . '/UserApps/Modules');<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>5<🎜><🎜> <🎜><🎜>define('CONFIGS_PATH')define('CONFIGS_PATH',APP_PATH . '/UserApps/Configs');<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>6<🎜><🎜> <🎜><🎜>FRAMEWORK_PATH を含めます。<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>7<🎜><🎜> <🎜><🎜>C(include CONFIGS_PATH . '/config.php') //設定情報を書き込みます<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>8<🎜><🎜> <🎜><🎜>FRAMEWORK_PATH を含めます。<🎜><🎜>

9 Route::run();

次に、Route.php を変更します

<テーブル>

01

01

02 class Route {

03 public static function run() {

04 $controller= empty($_GET['c']) ? C('defaultController') : trim($_GET['c']); //设置了默认的控制器
<テーブル>

02

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

06 $controllerBasePath = APP_PATH . '/UserApps/Modules/Controllers/';
クラスルート {

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

<テーブル>

08 if(is_file($controllerFilePath)) {
03

09 include $controllerFilePath;

パブリック静的関数 run() {

10 $controllerName = $controller . 'Controller';
<🎜> <🎜> <テーブル> <🎜><🎜>04<🎜><🎜> <🎜><🎜> $controller= empty($_GET['c']) ? C('defaultController') : trim($_GET['c']) //デフォルトのコントローラーが設定されています<🎜>< 🎜 > <🎜> <🎜> <テーブル> <🎜><🎜>05<🎜><🎜> <🎜><🎜> $action= empty($_GET['a']) ? C('defaultAction') : trim($_GET['a']); // デフォルトのアクション<🎜><🎜 が設定されています> <🎜> <🎜> <テーブル> <🎜><🎜>06<🎜><🎜> <🎜><🎜> $controllerBasePath = APP_PATH . '/UserApps/Modules/Controllers/';<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>07<🎜><🎜> <🎜><🎜> $controllerFilePath = $controllerBasePath . 'Controller.php';<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>08<🎜><🎜> <🎜><🎜> if(is_file($controllerFilePath)) {<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>09<🎜><🎜> <🎜><🎜> include $controllerFilePath;<🎜><🎜> <🎜> <🎜> <テーブル> <🎜><🎜>10<🎜><🎜> <🎜><🎜> $controllerName = $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 }



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!