PHP MVC フレームワーク コア クラス
それでは、コア フレームワークの例をいくつか挙げてみましょう: Framework/core の下に Framework.class.php ファイルを作成します。次のコードを記述します。
//framework/core/Framework.class.php
class Framework {
public static function run() {
echo "run()" }
require "framework/core/Framework.class.php";
Framework::run();
ブラウザでindex.phpにアクセスして結果を確認できます。通常、この静的メソッドの名前は run() または bootstrap() です。このメソッドでは、次の 3 つの主要なことを行う必要があります。
class Framework {
public static function run() {
// echo "run()";
self::init()
self:: autoload(); ;
self::dispatch();
}
プライベート静的関数init() {
}
プライベート静的関数dispatch() {
}
}
初期化
init()メソッド:
// 初期化
private static function init() {
// パス定数を定義
define("DS", DIRECTORY_SEPARATOR);
define("ROOT", getcwd() . DS);定義("APP_PATH", ROOT . 'アプリケーション' . DS);
define("FRAMEWORK_PATH", ROOT . "フレームワーク" . DS);
define("CONFIG_PATH", APP_PATH . "config" . DS);
define("CONTROLLER_PATH", APP_PATH . "コントローラー" . DS);
define("VIEW_PATH", APP_PATH . "ビュー" . DS);
define("CORE_PATH", FRAMEWORK_PATH . "core" . DS); ;
define("LIB_PATH", FRAMEWORK_PATH ."ライブラリ" .DS);
define("HELPER_PATH", "ヘルパー" .DS); ;
// プラットフォーム、コントローラー、アクションを定義します。例:
//index.php?p=admin&c=Goods&a=add
define("PLATFORM", isset($_REQUEST['p' ]) ? $ _REQUEST['p'] : 'ホーム');
define("コントローラー", isset($_REQUEST['c']) ? $_REQUEST['c'] : 'インデックス'); ", isset($_REQUEST['a']) ? $_REQUEST['a'] : 'index');
define("CURR_CONTROLLER_PATH", CONTROLLER_PATH . PLATFORM . DS);
define(" CURR_VIEW_PATH", VIEW_PATH . PLATFORM . DS);
require CORE_PATH .
require DB_PA TH . php";
require CORE_PATH . "Model.class.php";
// 設定ファイルをロード
$GLOBALS['config'] = include CONFIG_PATH . "config.php";
// セッションを開始
session_start( );
}
各ステップの目的はコメントで確認できます。
自動ロード
プロジェクトでは、スクリプトでクラスを使用するときに手動でロードしたり、ロードを要求したりしたくないため、PHP MVC フレームワークには自動ロード機能があります。たとえば、symfony では、lib の下にクラスをロードしたい場合、それは自動的にインポートされます。すごいですよね?次に、フレームワークに自動ロード機能を追加しましょう。
ここでは、PHP の組み込み関数 spl_autoload_register を使用します。
// 自動ロード
private static function autoload(){
spl_autoload_register(array(__CLASS__,'load'));
}
/ / カスタム ロード メソッドを定義します
private static function load($classname){
// ここでは単にアプリのコントローラーとモデル クラスを自動ロードします
if (substr($classname, -10) == "Controller"){
// コントローラー
Require_once Curr_Controller_Path. "$ ClassName.class.php";
} Elseif (Substr ($ className, -5) == "Model") "$ ClassName .class.php";
}
すべてのフレームワークには独自の命名規則があり、私たちのフレームワークも例外ではありません。コントローラー クラスの場合は、xxxController.class.php のような名前を付ける必要があり、モデル クラスの場合は、xxModel.class.php という名前を付ける必要があります。フレームワークを使用するときに、その命名規則に従う必要があるのはなぜですか?自動読み込みも理由の 1 つです。
ルーティング/ディストリビューション
// ルーティングとディスパッチ
private static functiondispatch(){
// コントローラークラスをインスタンス化し、そのアクションメソッドを呼び出します
$controller_name = "Controller" .
$action_name = ACTION . "アクション";
$controller = new $controller_name;
$controller->$action_name();
このステップでは、index.php が対応する Controller::Aciton( ) にリクエストを分配します。方法。
基本コントローラークラス
通常、フレームワークのコアクラスには基本コントローラーがあります。 symfony では sfAction と呼ばれ、iOS では UIViewController と呼ばれます。ここでは、Controller という名前を付け、framework/core の下に Controller.class.php を作成します
// Base Controller
class Controller{
// Base Controller には $loader というプロパティがあり、これは Loader class(後で紹介します)
protected $loader;
public function __construct(){
$this->loader = new Loader();
}
public function redirect($url,$message,$wait = 0){
if ( $ wait == 0) {
header ("local: $ url");
} else {
include curr_view_path. $loader、これは Loader クラスのインスタンス化です (後述)。正確に言うと、$this->loader はインスタンス化された Load クラスを指す変数です。ここではあまり説明しませんが、これは確かに非常に重要な概念です。私は、次のステートメントの後に、
$this->loader = new Loader();
$this->load がオブジェクトであると信じている PHP 開発者に会いました。いや、あくまで参考ですよ。これは Java から使用されており、Java が登場する前は、C++ および Objective C ではポインターと呼ばれていました。参照はカプセル化されたポインタ型です。たとえば、iOS (O-C) では、次のオブジェクトを作成します:
UIButton *btn = [UIButton alloc] init];
Load クラス
framework.class.php で、アプリケーション コントローラーと自動読み込みのモデルをカプセル化しました。しかし、フレームワーク ディレクトリにクラスを自動的にロードするにはどうすればよいでしょうか?これで、フレームワーク ディレクトリにクラスと関数をロードする新しい Loader クラスを作成できます。フレームワーク クラスをロードするときは、この Loader クラスのメソッドを呼び出すだけです。 OClass Loader {
// ライブラリ クラスを読み込みます
public function library ($ lib) {
include lib_path. "$ Lib.class.php" です。
public function helper($helper); HELPER_PATH を含めます。 "{$helper}_helper.php";