簡単に言えば、コントローラーの役割はリクエストを受け入れることです。 get メソッド (この場合は URI 経由) を使用して、プレゼンテーション層を更新または送信するための汎用モジュールをロードします。コントローラーは $_GET 自動グローバル変数を使用して、どのモジュールをロードするかを決定します。
リクエストの例は次のようになります。
http://example.com/index.php?module=login
これは簡単そうに見えますが、実装プロセスではそうではありません。複数のコントローラーで認識できる引数部分は次のとおりです。
モジュールは、ユーザーなど、どのモジュールを使用するかを定義します。 モジュール クラスは、ユーザーにログインまたはログアウトするかどうかなど、使用する機能クラスを定義します。
イベントは、使用する特定のイベントを定義します。
より複雑な例では、上記の各引数で最終的に構成されるリクエスト URL を説明できます。
http://example.com/index.php?module=users&class=login
このリクエストは、コントローラに次のことを伝えます。特定のイベントが定義されていないため、users モジュールをロードし、次にログイン クラスをロードし、最後にデフォルト イベントの login::__default() を実行する必要があります。
以下は特定のコード部分です:
<?php
/**
*index.php
*
* @author Joe Stump < [email protected] >
* @copyright ジョー・スタンプ < [email protected] >
* @license http://www.opensource.org/licenses/gpl-license.php
* @packageFramework
*/
require_once('config.php')
// {{{ __autoload($class);
/**
* __オートロード
*
* オートロードは、ロードしようとしているクラスが見つからない場合に PHP によって実行されます。
* クラスに賢く名前を付けることで、ほとんどのクラスをロードできるようになります。
*動的に。
*
* @author Joe Stump < [email protected] >
* @param string $class ロードしようとしているクラス名
* @return void
* @packageFramework
*/
関数 __autoload($class)
{
$file = str_replace('_','/',substr($class,2)).'.php';
require_once(FR_BASE_PATH.'/includes/'.$file);
}
// }}}
if (isset($_GET['module'])) {
$module = $_GET['モジュール'];
if (isset($_GET['event'])) {
$イベント = $_GET['イベント'];
} それ以外 {
$event = '__default';
if (isset($_GET['class']))
{
$class = $_GET['クラス'];
} それ以外 {
$クラス = $モジュール;
.
$class.'.php';
if (file_exists($classFile)) {
require_once($classFile);
if (class_exists($class)) {
試す {
$instance = 新しい $class();
if (!FR_Module::isValid($instance)) {
die("要求されたモジュールは有効なフレームワーク モジュールではありません!");
$
instance->moduleName = $module;
if ($instance->authenticate()) {
試す {
$result = $instance->$event();
if (!PEAR::isError($result)) {
$presenter = FR_Presenter::factory($instance->presenter,$instance);
if (!PEAR::isError($presenter)) {
$presenter->display();
} それ以外 {
die($presenter->getMessage());
}
}
} catch (例外 $error) {
die($error->getMessage());
}
} それ以外 {
die("要求されたページへのアクセス権がありません!");
}
} catch (例外 $error) {
die($error->getMessage());
}
} それ以外 {
die("リクエストに対する有効なモジュールが見つかりませんでした");
}
} それ以外 {
die("$classFile が見つかりませんでした");
}
} それ以外 {
die("有効なモジュールが指定されませんでした");
以下
、
上記のコードに関する具体的なコメントです:
__autoload() 関数を定義するために
「config.php」をロードします
。これは PHP5 の新機能で、さまざまなクラスの動的ロードを容易にします。
引数が定義されている場合
は、関連するモジュール、クラス、および特定のイベントがロードされ、
いくつかの判断と特定のエラー操作が続きます。
最後に、すべてが正しい場合、プレゼンテーション層
[フレンドリー URL]
がロードされます。上の例で述べたように、不快に感じる場合は、mod_rewrite を使用してフレンドリーな URL を実装してください。次は、このフレームワーク用に作者が書いた実際の書き換え標準コードです:
RewriteEngine On
# ここの URI をホームページにしたいものに変更します
RewriteRule ^/$ /index.php?module=welcome [L,QSA]
# Changes / Index.php?module=/welcome
RewriteCond %{DOCUMENT_ROOT}/
%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)$ /index へようこそ。 php?module=$1 [L,QSA]
# /index.php?module=users&class=login を /users/login に変更します
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/([^/]*)$ /index.php?module=$1&class=$2 [L,QSA]
# 変更 /index.php?module=users&class=login&event =foo
# /users/login/foo.html へ
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/( [^/]*)/([^/]*).html$
/index.php?module=$1&class=$2&event=$3 [L,QSA]
コントローラーの拡張
[拡張コントローラー]
には、集中コントローラーがあります。利点は、機能を追加した後、コントローラーを通じてすぐに反映できることです。このコントローラーを拡張してフレームワーク全体をより強力にするためのアイデアをいくつか紹介します。
PHP5 の新機能である SoapServer を使用すると、リクエストが SOAP かどうかを自動的に検出できます。
コントローラーを使用して、$_GET や $_POST などのすべての自動グローバル変数をフィルターして、悪意のある HTML コードなどを防ぐことが
できます
。たとえば
、レイヤーをデフォルト モードから PDF モードに変換すると
、キャッシュ メカニズムをコントローラに直接追加できるため、アプリケーション全体でキャッシュを使用して効率を向上させることができます。
注意すべき点は、追加された機能がプログラム全体に反映されることです。たとえば、すべての自動グローバル変数をフィルタリングしたいとしますが、多くのアプリケーション管理者は HTML コードを使用する必要があり、これは難しいことになります (翻訳者注: 私のアイデアは、フィルタリングを適用せずに特定のモジュールをロードする if 条件文を追加することです)関数)。