PHPフレームワークにおけるMVCモードと単一エントリの浅い分析
7795 ワード
MVCについて
ここではMVCモードとは何か詳しく説明しないが、簡単に紹介するだけで、MVCに関する具体的な情報はネット上で探すことができる.MVCモードは一つの項目をModel(モデル)、View(ビュー)、Controller(コントローラ)の3つの単語の略語の組み合わせがMVCであることを理解している.MVCは普遍的なソフトウェア敏捷開発モデルであり、多くの分野、特にデスクトッププログラミング分野で広く応用されているが、phpのようなスクリプト言語では実現が困難であり、特に数年前にスクリプト言語ではMVCの実現が見られなかったが、今年は多くのフレームワークの出現に伴い、MVCは各フレームワークで初歩的な実現を得た.他のフレームワークにおける実現方式はともかく、ここではcodeigniterがMVCをどのように実現するかを紹介する.
単一エントリについて
単一のエントリは、1つのウェブサイト(アプリケーション)において、すべての要求が1つのスクリプトファイル、例えばCIのhttp:\localhostindexを指す.phpは、indexにアクセスするときにMVCモードを実現するために、アプリケーションへのアクセスはすべてこのエントリを通過しなければならない.phpの場合、アプリケーションは大量の初期化作業を行い、大量の基礎クラスライブラリを呼び出し、indexに基づいています.phpの後のパラメータはコントローラをロードし、試行、モデルなどの内容情報をロードする.
ciのすべてのファイルのロードはコントローラによって呼び出される.コントローラはCIのスーパークラス、すなわち他のクラスがそれに依存するため、単一のエントリ方式でCIアプリケーションにアクセスする場合はindexが必要である.phpの後にコントローラ名とコントローラのメソッド名を付けます.これについて何の概念も理解できない場合は、CIの公式サイトに公式ドキュメントをダウンロードし、その働き方を詳しく知ることができます.
CIの公式文書は非常に詳しく分かりやすく、ここでは文書に存在しない基本原理部分を説明する.
スタート
CIのコントローラがどのように動作するかを説明する必要があるかもしれませんが、CIのコントローラの1つはユーザーが作成したクラスで、システムのControllerクラスから継承されています.例えば、http:\localhostindexを構築すると仮定します.phpcontrolfuncparam 1param 2アクセスのページでは、まずsystemapplicationcontrollersフォルダの下にファイルcontroを新規作成する必要があります.phpファイル.このファイルは、アクセスするコントローラクラスがあるファイルです.このファイルには、次の内容が作成されます.
これはコントローラの基本的な構成部分ではなく、modelとviewのコントローラの例を含んでいます.
まずコントローラのクラス名が頭文字で大文字であることに注意し、クラスの構造関数で親クラスの構造関数を呼び出すべきであり、その後func()メソッド、すなわちurlの後ろにあるパラメータの2番目の部分であり、このメソッドには2つのパラメータがあり、この2つのパラメータの値はurlの3番目の部分と4番目の部分の値である.つまり単一エントリのアクセス方法は、実際にはhttp:\localhostindex.phpコントローラ名メソッド名メソッドのパラメータ1メソッドのパラメータ2・・
コントローラクラスでは、各メソッドが1つのページを表します.つまり、多くの類似の操作を1つのコントローラに配置し、操作の統一を実現することができます.
上記の例のfunc()メソッドの他の部分にはそれぞれmodelとviewがロードする、modelをロードするときにロードされるのはmodelsフォルダのmsomemodelである.phpファイルのMSomemodelクラスは、アプリケーションのモデル部分、すなわちデータベースの記憶などのデータの交換を担当する.
次に、$data=$this->MSomemodel->getvalue()によってmodelのメソッドを実行し、このメソッドからデータを返し、$data['data 1']に値を割り当てます.$dataは関連配列であり、一般的なテンプレートモードではなくviewビューファイルに値を渡します.このメソッドはMVCの各部分の処理をよりよく分離します.同時に性能の面でその独特な一面がある.
その後、$data配列をviewsフォルダのwelcomeに渡す.phpファイル、このファイルは通常のphpとhtmlが混在したスクリプトで、このスクリプトでは伝達された$data配列を利用して情報を出力することができますが、viewファイルで情報を出力する際に$data['data 1']を使用する必要はなく、echo$data 1のみが必要であることに注意してください.いいです.
基本的な動作は、コードレベルから実装を分析することです.
コード解析
CIではControllerクラスをスーパークラスとして扱う、つまりMVC実装モードをロードするプロセスはすべてControllerクラスから始まるので、このクラスにロードされた時点までのCIの実行プロセスを無視して、直接Controllerクラスが存在するファイルから分析を開始する.
Controllerクラスが存在するファイルはsystem/libraries/controller.にあります.phpファイルで
このクラスには、まず、「Config」、「Input」、「Benchmark」、「URI」、「Output」、「Language」、「Router」など、必要なすべてのベースクラスがロードされます.その後、Roaderクラスをロードして実行しました.ci_Autoloader()メソッド、このクラスはMVCモードのコアであり、コントローラ内の他のすべてのコンテンツのロードはそれによって実現され、以下ではそのコードを分析する.
まず見てみましょうci_Autoloader()メソッド.この関数は、特定のクラスライブラリまたはクラスを自動的にロードすることを実現します.アプリケーションで常にいくつかのクラスを使用する必要がありますが、CIでこれらのクラスが自動的にロードされているかどうかを確認しない場合は、config/autoload.phpファイルには、自動的にロードするlibraryまたはhelperまたはpluginの配列が設定.具体的にはマニュアルを参照してください.
まず、CIがlibrariesをロードする方法を見てみましょう.この方法では、コントローラのどこでも(通常はコンストラクション関数)$this->load->library(「name」)を使用できます.あるクラスをロードします.このクラスはユーザーがカスタマイズしたクラスでもシステムのクラスライブラリでもあります.ユーザーがカスタマイズしたクラスはCIの約束に従う必要があります.具体的な情報はマニュアルの「自分のクラスライブラリを作成する」部分を参照してください.library()メソッドは、1つの文字列またはクラスライブラリ名の配列を最初のパラメータとし、その後の処理ですべてのクラスを巡回してロードします.2番目のパラメータからロードするクラスのコンストラクション関数にパラメータを渡すことができます.3番目のパラメータでは、返されるオブジェクトの名前を定義できます.後の2つのパラメータは通常使用されません.このメソッドは、パラメータが空であるか否かを簡単に判断した後にメソッドを呼び出す_ci_load_class($class,$params=NULL,$object_name=NULL)は、最初のパラメータで指定されたクラスをロードし、このクラスで複雑なパス判定を行った後に必要なクラスファイルを見つけた後、メソッドを呼び出します.ci_init_class($class, '', $params, $object_name);このクラスはクラスをインスタンス化するために使用する、このクラスをロードする文に上記の3番目のパラメータが含まれている場合、インスタンスを返し、このパラメータをインスタンス名とし、3番目のパラメータが設定されていない場合、クラス名で命名するインスタンス名を返す.これも、前の例でモデルがロードされた後、直接モデルクラス名をオブジェクトとして使用する理由である.
その後、CIがどのようにモデルをロードするかを見てみましょう.この方法では、コントローラで$this->load->model($modelname,$name,$db_conn)を使用してモデルをロードできます.この3つのパラメータは、ロードされたモデルの名前、ロード後にインスタンス化されたオブジェクト名、データベースを自動的に接続するかどうかです.次の2つのパラメータは省略できます.複数のモデルを一度にロードするには、最初のパラメータを配列に設定するだけでいいです.この方法では、最初に渡された最初のパラメータを「」で配列に分解します.このメカニズムでは、モデルに多層フォルダを作成し、コードのグループをより合理的に配置できます.その後、プログラムは配列の最後の要素をロードするクラスの名前として取り出し、パスに基づいてその種類を探し、その後このファイルを含む、この種類をインスタンス化し、2番目のパラメータが設定場合、$nameのオブジェクトにインスタンス化し、そうでない場合、デフォルトではクラス名をオブジェクト名としてインスタンス化する.
CIがどのようにビューをロードするかを見ると、view($view,$vars=array(),$return=FALSE)メソッドの最初のパラメータはロードするビュー名であり、2番目のパラメータはビューに渡す変数値であり、3番目のパラメータは出力バッファに戻るかどうかを指定するデータである.このメソッドは、すべての配列を配列パラメータとして呼び出します.ci_load($_ci_data)メソッドは、伝達された変数配列をextract()関数によりシンボルテーブル(すなわち、キー名を変数名、値を変数の値とする)に解析し、これらの変数をキャッシュして、異なるビューで変数を互いに交流できるようにします.つまり、このメソッドは複数回呼び出すことができます.呼び出しのたびに前のビューに伝達する変数を自動的にロードするために、ビューに伝達されたすべての変数をクラスの1つの属性にキャッシュし、メソッドを呼び出すたびにすべての変数を取得する.その後、このビューファイルをロードする、出力バッファの一部としてグローバル変数$OUTに割り当て、バッファ出力を制御することで、効率を向上する、デバッグの時間をより正確にすることができる.
他のロード方法は上記の方法と基本的に同じであるが、状況によって若干変更されているだけで、CIはMVCモードを実現する方法ですべてのファイルをコントローラに含め、これらのファイルを含んだ後、コントローラでこれらの対象とデータを自由に使用することができ、最後に出力クラスをバッファリングすることですべてのデータを出力することができる.Loaderという類の構造は複雑に見えるが、実はその実現は簡単で、その内部のコード原理は基本的に同じで、しかもはっきりしていて、よく見ると理解しにくい.
ここではMVCモードとは何か詳しく説明しないが、簡単に紹介するだけで、MVCに関する具体的な情報はネット上で探すことができる.MVCモードは一つの項目をModel(モデル)、View(ビュー)、Controller(コントローラ)の3つの単語の略語の組み合わせがMVCであることを理解している.MVCは普遍的なソフトウェア敏捷開発モデルであり、多くの分野、特にデスクトッププログラミング分野で広く応用されているが、phpのようなスクリプト言語では実現が困難であり、特に数年前にスクリプト言語ではMVCの実現が見られなかったが、今年は多くのフレームワークの出現に伴い、MVCは各フレームワークで初歩的な実現を得た.他のフレームワークにおける実現方式はともかく、ここではcodeigniterがMVCをどのように実現するかを紹介する.
単一エントリについて
単一のエントリは、1つのウェブサイト(アプリケーション)において、すべての要求が1つのスクリプトファイル、例えばCIのhttp:\localhostindexを指す.phpは、indexにアクセスするときにMVCモードを実現するために、アプリケーションへのアクセスはすべてこのエントリを通過しなければならない.phpの場合、アプリケーションは大量の初期化作業を行い、大量の基礎クラスライブラリを呼び出し、indexに基づいています.phpの後のパラメータはコントローラをロードし、試行、モデルなどの内容情報をロードする.
ciのすべてのファイルのロードはコントローラによって呼び出される.コントローラはCIのスーパークラス、すなわち他のクラスがそれに依存するため、単一のエントリ方式でCIアプリケーションにアクセスする場合はindexが必要である.phpの後にコントローラ名とコントローラのメソッド名を付けます.これについて何の概念も理解できない場合は、CIの公式サイトに公式ドキュメントをダウンロードし、その働き方を詳しく知ることができます.
CIの公式文書は非常に詳しく分かりやすく、ここでは文書に存在しない基本原理部分を説明する.
スタート
CIのコントローラがどのように動作するかを説明する必要があるかもしれませんが、CIのコントローラの1つはユーザーが作成したクラスで、システムのControllerクラスから継承されています.例えば、http:\localhostindexを構築すると仮定します.phpcontrolfuncparam 1param 2アクセスのページでは、まずsystemapplicationcontrollersフォルダの下にファイルcontroを新規作成する必要があります.phpファイル.このファイルは、アクセスするコントローラクラスがあるファイルです.このファイルには、次の内容が作成されます.
class
Controller
extends
Controller
{
function
Controller()
{
parent
::
Controller();
}
function
func(
$param1
,
$param2
)
{
$this
->
load
->
model(
'
MSomemodel
'
,
''
,
TRUE
);
$data
[
'
data1
'
]
=
$this
->
MSomemodel
->
getvalue();
$this
->
load
->
view(
'
welcome
'
,
$data
);
}
}
これはコントローラの基本的な構成部分ではなく、modelとviewのコントローラの例を含んでいます.
まずコントローラのクラス名が頭文字で大文字であることに注意し、クラスの構造関数で親クラスの構造関数を呼び出すべきであり、その後func()メソッド、すなわちurlの後ろにあるパラメータの2番目の部分であり、このメソッドには2つのパラメータがあり、この2つのパラメータの値はurlの3番目の部分と4番目の部分の値である.つまり単一エントリのアクセス方法は、実際にはhttp:\localhostindex.phpコントローラ名メソッド名メソッドのパラメータ1メソッドのパラメータ2・・
コントローラクラスでは、各メソッドが1つのページを表します.つまり、多くの類似の操作を1つのコントローラに配置し、操作の統一を実現することができます.
上記の例のfunc()メソッドの他の部分にはそれぞれmodelとviewがロードする、modelをロードするときにロードされるのはmodelsフォルダのmsomemodelである.phpファイルのMSomemodelクラスは、アプリケーションのモデル部分、すなわちデータベースの記憶などのデータの交換を担当する.
次に、$data=$this->MSomemodel->getvalue()によってmodelのメソッドを実行し、このメソッドからデータを返し、$data['data 1']に値を割り当てます.$dataは関連配列であり、一般的なテンプレートモードではなくviewビューファイルに値を渡します.このメソッドはMVCの各部分の処理をよりよく分離します.同時に性能の面でその独特な一面がある.
その後、$data配列をviewsフォルダのwelcomeに渡す.phpファイル、このファイルは通常のphpとhtmlが混在したスクリプトで、このスクリプトでは伝達された$data配列を利用して情報を出力することができますが、viewファイルで情報を出力する際に$data['data 1']を使用する必要はなく、echo$data 1のみが必要であることに注意してください.いいです.
基本的な動作は、コードレベルから実装を分析することです.
コード解析
CIではControllerクラスをスーパークラスとして扱う、つまりMVC実装モードをロードするプロセスはすべてControllerクラスから始まるので、このクラスにロードされた時点までのCIの実行プロセスを無視して、直接Controllerクラスが存在するファイルから分析を開始する.
Controllerクラスが存在するファイルはsystem/libraries/controller.にあります.phpファイルで
このクラスには、まず、「Config」、「Input」、「Benchmark」、「URI」、「Output」、「Language」、「Router」など、必要なすべてのベースクラスがロードされます.その後、Roaderクラスをロードして実行しました.ci_Autoloader()メソッド、このクラスはMVCモードのコアであり、コントローラ内の他のすべてのコンテンツのロードはそれによって実現され、以下ではそのコードを分析する.
まず見てみましょうci_Autoloader()メソッド.この関数は、特定のクラスライブラリまたはクラスを自動的にロードすることを実現します.アプリケーションで常にいくつかのクラスを使用する必要がありますが、CIでこれらのクラスが自動的にロードされているかどうかを確認しない場合は、config/autoload.phpファイルには、自動的にロードするlibraryまたはhelperまたはpluginの配列が設定.具体的にはマニュアルを参照してください.
まず、CIがlibrariesをロードする方法を見てみましょう.この方法では、コントローラのどこでも(通常はコンストラクション関数)$this->load->library(「name」)を使用できます.あるクラスをロードします.このクラスはユーザーがカスタマイズしたクラスでもシステムのクラスライブラリでもあります.ユーザーがカスタマイズしたクラスはCIの約束に従う必要があります.具体的な情報はマニュアルの「自分のクラスライブラリを作成する」部分を参照してください.library()メソッドは、1つの文字列またはクラスライブラリ名の配列を最初のパラメータとし、その後の処理ですべてのクラスを巡回してロードします.2番目のパラメータからロードするクラスのコンストラクション関数にパラメータを渡すことができます.3番目のパラメータでは、返されるオブジェクトの名前を定義できます.後の2つのパラメータは通常使用されません.このメソッドは、パラメータが空であるか否かを簡単に判断した後にメソッドを呼び出す_ci_load_class($class,$params=NULL,$object_name=NULL)は、最初のパラメータで指定されたクラスをロードし、このクラスで複雑なパス判定を行った後に必要なクラスファイルを見つけた後、メソッドを呼び出します.ci_init_class($class, '', $params, $object_name);このクラスはクラスをインスタンス化するために使用する、このクラスをロードする文に上記の3番目のパラメータが含まれている場合、インスタンスを返し、このパラメータをインスタンス名とし、3番目のパラメータが設定されていない場合、クラス名で命名するインスタンス名を返す.これも、前の例でモデルがロードされた後、直接モデルクラス名をオブジェクトとして使用する理由である.
その後、CIがどのようにモデルをロードするかを見てみましょう.この方法では、コントローラで$this->load->model($modelname,$name,$db_conn)を使用してモデルをロードできます.この3つのパラメータは、ロードされたモデルの名前、ロード後にインスタンス化されたオブジェクト名、データベースを自動的に接続するかどうかです.次の2つのパラメータは省略できます.複数のモデルを一度にロードするには、最初のパラメータを配列に設定するだけでいいです.この方法では、最初に渡された最初のパラメータを「」で配列に分解します.このメカニズムでは、モデルに多層フォルダを作成し、コードのグループをより合理的に配置できます.その後、プログラムは配列の最後の要素をロードするクラスの名前として取り出し、パスに基づいてその種類を探し、その後このファイルを含む、この種類をインスタンス化し、2番目のパラメータが設定場合、$nameのオブジェクトにインスタンス化し、そうでない場合、デフォルトではクラス名をオブジェクト名としてインスタンス化する.
CIがどのようにビューをロードするかを見ると、view($view,$vars=array(),$return=FALSE)メソッドの最初のパラメータはロードするビュー名であり、2番目のパラメータはビューに渡す変数値であり、3番目のパラメータは出力バッファに戻るかどうかを指定するデータである.このメソッドは、すべての配列を配列パラメータとして呼び出します.ci_load($_ci_data)メソッドは、伝達された変数配列をextract()関数によりシンボルテーブル(すなわち、キー名を変数名、値を変数の値とする)に解析し、これらの変数をキャッシュして、異なるビューで変数を互いに交流できるようにします.つまり、このメソッドは複数回呼び出すことができます.呼び出しのたびに前のビューに伝達する変数を自動的にロードするために、ビューに伝達されたすべての変数をクラスの1つの属性にキャッシュし、メソッドを呼び出すたびにすべての変数を取得する.その後、このビューファイルをロードする、出力バッファの一部としてグローバル変数$OUTに割り当て、バッファ出力を制御することで、効率を向上する、デバッグの時間をより正確にすることができる.
他のロード方法は上記の方法と基本的に同じであるが、状況によって若干変更されているだけで、CIはMVCモードを実現する方法ですべてのファイルをコントローラに含め、これらのファイルを含んだ後、コントローラでこれらの対象とデータを自由に使用することができ、最後に出力クラスをバッファリングすることですべてのデータを出力することができる.Loaderという類の構造は複雑に見えるが、実はその実現は簡単で、その内部のコード原理は基本的に同じで、しかもはっきりしていて、よく見ると理解しにくい.