前回は自動インポートを使用してクラスの遅延ロードを実装することについて話しました。今回は設定ファイルについて話したいと思います。
前回の記事で設定ファイルについて触れていなかったことにお気づきかわかりませんが、プロジェクトでは設定ファイルが不可欠です。
次に、Route.php のデフォルトのコントローラーとアクションが構成可能になっているとします。
最も単純な方法を使用します:
1 |
2 | $defaultController = 'Index'; |
<テーブル>
1 |
2 | include APP_PATH . '/config.php'; |
1 | $controller = empty($_GET['c']) ? $defaultController : trim($_GET['c']); //设置了默认的控制器 |
2 | $action = empty($_GET['a']) ? $defaultAction : trim($_GET['a']); //设置了默认的Action |
<テーブル>
テーブル>
1
1
<🎜>
<テーブル>
2
return array(
テーブル>
<🎜>
<🎜>
<🎜>
<🎜>
<🎜>
<🎜>
<テーブル>
<🎜><🎜>2<🎜><🎜>
<🎜><🎜>APP_PATH を含めます。<🎜><🎜>
テーブル>
<🎜>
<🎜>
<テーブル>
<🎜><🎜>1<🎜><🎜>
<🎜><🎜>$controller = empty($_GET['c']) ? $defaultController :trim($_GET['c']) //デフォルトのコントローラーが設定されています <🎜><🎜> td >
テーブル>
<🎜>
<🎜>
<🎜>
<🎜>
<🎜><🎜>もちろん、次の方法も使用できます: <🎜><🎜><🎜>
<🎜>
<🎜>
<🎜>
<テーブル>
<🎜><🎜>2<🎜><🎜>
<🎜><🎜>$action = empty($_GET['a']) ? $defaultAction :trim($_GET['a']) //デフォルトのアクションが設定されています<🎜><🎜>
テーブル>
<🎜>
<🎜>
<テーブル>
<🎜><🎜>1<🎜><🎜>
<🎜><🎜><🎜>
テーブル>
<🎜><🎜>2<🎜><🎜>
<🎜><🎜>配列を返す(<🎜><🎜>
3 | 'defaultController' => 'Index', |
4 | 'defaultAction' => 'index' |
5 | ); |
または Route.php に次のように含めます:
1 |
2 | $config = include APP_PATH . '/config.php'; |
<テーブル>
1 | $controller= empty($_GET['c']) ? $config['defaultController'] : trim($_GET['c']); //设置了默认的控制器 |
2 | $action = empty($_GET['a']) ? $config['defaultAction'] : trim($_GET['a']); //设置了默认的Action |
しかし、構成ファイルはフレームワーク実行プロセス全体ですべてのクラスで使用される可能性が高く、最初の 2 つのメソッドは特定のクラスの特定のメソッドでのみ使用できるため、どのように使用できますか?どのクラスも利用できますか?
この問題を解決するには、構成情報を保存する Config クラス、構成情報を読み取る Config::get、構成情報を設定する Config::set を定義するなど、静的メソッドを使用できます。具体的な方法を自分で試してみてください。
もちろん、私はこの方法を採用するつもりはありません。Thinkphp のソースコードを見ていて、そのエレガントな特殊関数 C に魅了されたのかもしれません。その後、Toper を書くときにもいくつかの特殊関数を使用しました。 C は主に構成情報の設定と読み取りを担当します。私の個人的な観点からは、オブジェクト指向が必要ですが、すべてがオブジェクト指向である必要はないため、いくつかのパブリック関数を格納する function.php を定義します。これをパブリック関数ライブラリと呼びます。
パブリック関数ライブラリのおかげで、前の記事の自動インポート (__autoload) をこのファイルに転送することもできます。Route.php に __autoload コードの一部があるのは非常に奇妙だからです。 !
さて、先ほどの機能による構成情報の設定と読み込みを実装するにはどうすればよいでしょうか?
さて、まず Toper での実装を示しましょう:
<テーブル>
01 | function C($name = null,$val = null) { |
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)) { |
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 |
2 | defined('APP_PATH') define('APP_PATH',dirname(__FILE__) . '/..'); |
4 | defined('MODULES_PATH') define('MODULES_PATH',APP_PATH . '/UserApps/Modules'); |
2
5 | include FRAMEWORK_PATH . '/function.php'; |
6 | include FRAMEWORK_PATH . '/Route.php'; |
7 | Route::run(); |
C 関数の先頭では、要素が格納されていないことに気づいたかもしれません。では、構成ファイルの内容を初期化して C 関数に書き込むにはどうすればよいでしょうか。
設定ファイルをプロジェクトのルート ディレクトリに保存する前は、実際には以前に合意した仕様に準拠していませんでした。そのため、利便性を高めるために、設定ファイルを /UserApps/Configs ディレクトリに切り出します。このパスでは、構成ファイルへのパスを指す CONFIGS_PATH を定義します。
次に、エントリ ファイルがどのようになったかを見てみましょう:
<テーブル>
1 |
2 | defined('APP_PATH') define('APP_PATH',dirname(__FILE__) . '/..'); |
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'; |
7 | C(include CONFIGS_PATH . '/config.php'); //写入配置信息 |
8 | include FRAMEWORK_PATH . '/Route.php'; |
9 | Route::run(); |
次に、Route.php を変更します
<テーブル>
01 |
02 | class Route { |
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)) { |
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 | } |