ホームページ >バックエンド開発 >PHPチュートリアル >独自の PHP MVC フレームワークを作成する (2)

独自の PHP MVC フレームワークを作成する (2)

WBOY
WBOYオリジナル
2016-06-23 13:46:55968ブラウズ

必要なディレクトリは最初の記事で設定しました


public/index.php ファイルをエディタで開き、次のコードを記述します


<?php    define(DS, DIRECTORY_SEPARATOR);    define(ROOT, dirname(dirname(__FILE__)));        $url = $_GET['url'];        // 加载引导    require_once( ROOT . DS . 'core' . DS . 'bootstrap.php' );            

エントリーファイルのコードは非常に簡潔で、$url はグローバル変数であり、リクエストとして使用されるパラメーターを取得するために使用されます

次に、ブートのロードに関する文をコメントアウトし、以下の $url をエコーし​​ます

//require_once( ROOT . DS . 'core' . DS . 'bootstrap.php' );echo $url;

次に、ブラウザのアドレス バーに http://localhost/wudicsmvc/ と入力します

注: D:AppServwwwwudicsmvc

すると、何も表示されないことがわかります。


次に http://localhost/wudicsmvc/wudics

と入力します

ウェブページに wudics という文字が表示されます


これは、URL パラメーターが正常に取得できることを意味し、グローバル変数として存在します。主に使用されるのは クライアントのリクエストを取得するため

どのコントローラーのどのメソッドにアクセスするかなど

http://localhost/wudicsmvc/home/index

ホームコントローラーのインデックスメソッドにアクセスするにはこのように規定できますもちろん、mvc では非常に重要な概念であるルーティング ルールを設定することもできます。 、コア ディレクトリの bootstrap.php ファイルが開きます:


<?php    // 加载配置    require_once(ROOT . DS . 'cfg' . DS . 'config.php');        // 路由请求    require_once(ROOT . DS . 'core' . DS . 'route.php');

2 つのファイルもロードされます。1 つは cfg ディレクトリの config.php で、もう 1 つはコア ディレクトリの Route.php です


config.php を見てください


<?php    // mysql连接参数    define('DB_HOST', 'localhost');    define('DB_USER', 'root');    define('DB_PASS', '123456');    define('DB_NAME', 'transdb');        // smarty的一些常量    define('DIR_TPL', ROOT . DS . 'app' . DS . 'view' . DS . 'template_dir' . DS . 'default' . DS);    define('DIR_CPL', ROOT . DS . 'app' . DS . 'view' . DS . 'compile_dir' . DS);    define('DIR_CFG', ROOT . DS . 'app' . DS . 'view' . DS . 'config_dir' . DS);    define('DIR_CAC', ROOT . DS . 'app' . DS . 'view' . DS . 'cache_dir' . DS);        // 默认控制类方法    $default['controller'] = 'home';    $default['action'] = 'index';        // pulibc文件夹的路径,方便模板设计    define('WEBSITE', 'http://localhost');    define('WEBIMG', WEBSITE . dirname(dirname($_SERVER['PHP_SELF'])) . '/public/img/');

いくつかの定数とグローバル変数、これは非常に重要です 定数とグローバル変数は単一エントリの PHP プログラムの共有リソースなので便利です


次に、route.php ファイル


<?php    function callHook()    {        global $url;        global $default;                // Get the $controller $action $param        $param = array();                $urlArr = explode("/", rtrim($url, "/"));        $controller = array_shift($urlArr);        $action = array_shift($urlArr);        $param = $urlArr;                if ($controller == "")        {            $controller = $default['controller'];            $action = $default['action'];        }                if ($action == "")        {            $action = $default['action'];        }                        // 控制类书写规则 HomeController->Index         $controllerName = ucfirst($controller).'Controller';        $dispatch = new $controllerName($controller, $action);                if (method_exists($dispatch, ucfirst($action)))        {            call_user_func_array(array($dispatch, ucfirst($action)), $param);        }        else        {            /* Error Code for Method is not exists */            die('method not exitsts.<br />');        }    }     // 自动加载类    function __autoload($classname)    {        if (file_exists(ROOT . DS . 'core' . DS . strtolower($classname) . '.class.php'))        {            require_once(ROOT . DS . 'core' . DS . strtolower($classname) . '.class.php');        }        else if (file_exists(ROOT . DS . 'app' . DS . 'controller' . DS . strtolower($classname) . '.php'))        {            require_once(ROOT . DS . 'app' . DS . 'controller' . DS . strtolower($classname) . '.php');        }        else if (file_exists(ROOT . DS . 'app' . DS . 'model' . DS . strtolower($classname) . '.php'))        {            require_once(ROOT . DS . 'app' . DS . 'model' . DS . strtolower($classname) . '.php');        }        else        {            /* Error Code for can not find the files */            die('class not found.<br />');        }    }        callHook();
このページでは、まず callHook と __autoload という 2 つの関数を定義し、次にページの下部に callHook() という文があり、この時点でプログラムが実行を開始します。


callHook 関数:

その機能は、上記のコントローラー、メソッド、パラメーターを見つけることです

ここでコードが実行されると

// 控制类书写规则 HomeController->Index         $controllerName = ucfirst($controller).'Controller';        $dispatch = new $controllerName($controller, $action);
プログラムは __autoload メソッドを実行します。このメソッドは使用できますクラスを使用するとき、必要なファイルを自動的にロードできます

手動で要求する必要はありません。これはさまざまなクラス ライブラリに便利で、便利でトラブルフリーです。.php クラス ファイルを手動でロードする必要はありませんクラスを呼び出す前に毎回


method_exists メソッドは、このクラスにメソッドが存在するかどうかを判断します。存在する場合、call_user_func_array はメソッドを呼び出します


注: __autoload メソッドは、クラス ライブラリ ファイルをロードするためのいくつかのルールです。これはあなたの習慣に従って定義する必要があります。


この時点で、プログラムは特定のコントローラーの特定のメソッドにジャンプして実行されます。たとえば、HomeController クラスの Index メソッドは、__autoload ルールで定義されます。

ここにあるのは app/controller/homecontroller.php ファイルです


<?phpclass HomeController extends Controller{    public function Index()    {        $user = new user();        $tpl = new tpl();        $tpl->set('name', $user->name);        $tpl->render('index.html');    }}

このメソッドはユーザー クラス (モデル) と tpl クラス (ビュー) をロードします

ユーザー クラスはデータベースからデータを読み取る責任があります

tpl クラス データの表示を担当します

したがって、コントローラー クラスは、データと表示を接続して制御する役割を果たしているとも言えます。これにより、2 つが適切にバインドされ、モデルとビューが分離しました

こうすることで、独自のアイデアを実現し、php コードと html レイアウトを分離することができます


自分の便利な php フレームワークを統合できれば幸いです。皆さんも QQ グループに来てください。意見をお聞かせください。QQ グループ番号: 667110936671109366711093

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