关于MVC
这里不详细讲解何为MVC模式,只是简单介绍,关于MVC的具体信息可以去网络上找寻,MVC模式在我理解来它将一个项目分解成三部分,分别是Model(模型),View(视图),Controller(控制器),这三个单词的缩写组合即为MVC.MVC是一种普遍的软件敏捷开发模式,在许多领域特别是桌面编程领域早已经得到了广泛的应用,然而在像php一样的脚本语言中比较难以实现,特别是几年前在脚本语言中很难看到MVC的实现,但是今年随着众多框架的涌现,MVC在各个框架中得到了初步实现,其他框架中的实现方式暂且不提,这里只是介绍codeigniter是如何实现MVC的.
关于单一入口
单一入口指在一个网站(应用程序)中,所有的请求都是指向一个脚本文件的,例如CI中的http:\localhostindex.php,所有对应用程序的访问都是必须通过这个入口,正是单一入口才使得MVC模式得以实现,因为当你访问index.php的时候,应用程序会做大量的初始化工作,调用大量的基础类库,并根据index.php后面的参数加载控制器,然后加载试图,模型等内容信息.
ci的所有文件加载都要经过控制器调用,因为控制器是CI中的超类,也就是其他的类都依附于它,所以用单一入口方式访问CI应用程序的时候,需要在index.php的后面加上控制器名和控制器中的方法名,如果你对于此没有任何概念或者无法理解,可以去CI的官方网站下载它的官方文档,然后详细了解它的工作方式
CI的官方文档非常详尽易懂,这里描述的是文档上所不存在的基本原理部分.
开始
或许应该先讲解CI的控制器是如何工作的,CI中的一个控制器就是用户编写的一个类,它继承自系统的Controller类,例如假设我们要构建一个可以通过http:\localhostindex.phpcontrolfuncparam1param2访问的页面,我们需要做哪些工作呢,首先我们要在systemapplicationcontrollers文件夹下新建一个文件contro.php文件,这个文件即是我们要访问的控制器类所在文件,在此文件中创建以下内容:
1 class Controller extends Controller {<br>2 <br>3 function Controller()<br>4 {<br>5 parent::Controller(); <br>6 }<br>7 <br>8 function func($param1,$param2)<br>9 {<br>10 $this->load->model('MSomemodel','',TRUE);<br>11 $data['data1']= $this->MSomemodel->getvalue();<br>12 $this->load->view('welcome',$data);<br>13 }<br>14 }<br>15 ログイン後にコピー |
これはコントローラーの基本的なコンポーネントではなく、モデルとビューを含むコントローラーの例です。
まず、コントローラーのクラス名の最初の文字を大文字にし、その後コンストラクター内で使用する必要があることに注意してください。親クラスのコンストラクターを呼び出し、その後に URL の後のパラメーターの 2 番目の部分である func() メソッドを呼び出します。このメソッドは 2 つのパラメーターを受け取り、これら 2 つのパラメーターの値は次のとおりです。 3 番目の部分と URL の 3 番目の部分の 4 つの部分の値、つまり 1 つの入り口のアクセス メソッドは実際には次のようになります: http:localhostindex.php コントローラー名 メソッド名 メソッド パラメーター 1 メソッド パラメーター 2...
コントローラー クラスの各メソッドは、モデルをロードするときに、func() メソッドの他の部分がそれぞれモデルとビューをロードするために、多くの同様の操作をコントローラーに入れることができることを意味します。ロードされるのは、models フォルダー内の msomemodel.php ファイル内の MSomemodel クラスです。このクラスは、データベース ストレージなどのデータ交換を担当する、アプリケーションのモデル部分を担当します。
次に、$data= $ を渡します。 this->MSomemodel->getvalue() は、モデル内のメソッドを実行し、このメソッドからデータを返し、それを $data['data1'] に割り当てます。$data は、この配列をビュー ファイルに渡します。 .value を使用すると、一般的なテンプレート パターンを使用する代わりに、MVC のさまざまな部分の処理がより適切に分離され、パフォーマンスの点で独自の独自の側面が得られます。
その後、$data 配列を views フォルダーに渡します。 .php ファイルでは、このファイルは通常の php と html が混合されたスクリプトです。このスクリプトでは、渡された $data 配列を使用して情報を出力できますが、情報を出力するときに $data['data1 を使用する必要はないことに注意してください。ビューファイルに.']を追加し、$data1;をエコーするだけです。
基本的な動作方法は以下のようなコードレベルで解析されます
コード解析CIでは、Controllerクラスつまり、MVC 実装パターンをロードするすべてのプロセスはコントローラー クラスから開始されるため、CI がこのクラスにロードされる直前の実行プロセスを無視して、ファイルから直接分析を開始します。
コントローラー クラスが配置されているファイルは、system/libraries/Controller.php ファイルです。
このクラスでは、「Config」、「Input」を含むすべての必要な基本クラスが最初にロードされます。 、'Benchmark'、'URI'、'Output'、'Language'、'Router' クラス。その後、Roader クラスがロードされ、その _ci_autoloader() メソッドが実行されます。このクラスは、その他すべての MVC パターンの中核となります。コードは次のとおりです: 分析: まず、_ci_autoloader() メソッドを見てください。この関数は、特定のクラスが常にアプリケーションで使用される場合に使用します。これらのクラスが自動的にロードされている場合は、config/autoload.php ファイルでライブラリ、ヘルパー、またはプラグインの配列を自動的にロードするように設定できます。詳細についてはマニュアルを参照してください。
まず、CI がライブラリをロードする方法を見てください。このメソッドを使用すると、コントローラー内の任意の場所 (通常はコンストラクター内) で $this->load->library("name"); を使用して、このクラスをロードできます。ユーザー定義クラスまたはシステム クラス ライブラリにすることができます。詳細については、マニュアルの「独自のクラス ライブラリの作成」セクションを参照してください。最初のパラメータとして文字列またはクラス ライブラリ名の配列を指定すると、後続の処理ですべてのクラスを走査してロードできます。2 番目のパラメータを使用して、ロードされるクラスのコンストラクタにパラメータを渡すことができます。次の 2 つのパラメータ パラメータは通常は使用されません。このメソッドは、パラメータが空かどうかを単純に判断した後、メソッド _ci_load_class($class, $params = NULL, $object_name = NULL) を呼び出します。このクラスは、パラメータで指定されたクラスが最初にロードされ、必要なクラス ファイルが見つかった後、メソッド _ci_init_class($class, $params, $object_name) が呼び出されます。クラスをインスタンス化するために使用されます。このクラスをロードするステートメントに上記の 3 番目のパラメーターが含まれている場合、インスタンスが返され、このパラメーターがインスタンス名として使用されます。3 番目のパラメーターが設定されていない場合は、インスタンスの名前が付けられます。クラス名が返されます。これが、前の例でモデルのロード後にモデルのクラス名がオブジェクトとして直接使用される理由です
次に、このメソッドでどのようにモデルをロードできるかを見ていきます。コントローラーで使用するには $this->load->model($modelname,$name,$db_conn) によってモデルがロードされます。これらの 3 つのパラメーターは、ロードされたモデルの名前、ロード後にインスタンス化されたオブジェクトの名前、および最後の 2 つのパラメータは省略できます。最初のパラメータを配列に設定するだけで済みます。このメカニズムにより、モデル内に複数層のフォルダーを作成して、コードのグループ化をより合理的に行うことができます。その後、プログラムは、ロードするクラスの名前として配列の最後の要素を取得し、それに応じてこのクラスを検索します。 2 番目のパラメータが設定されている場合は、$name のオブジェクトにインスタンス化されます。それ以外の場合は、デフォルトでクラス名がオブジェクト名として使用されます。
CI がビューをロードする方法を見てみましょう。 view($view, $vars = array(), $return = FALSE) メソッドの最初のパラメータはロードされるビューの名前であり、2 番目のパラメータはビューに渡されます。 view.変数値。3 番目のパラメーターは、出力バッファーのデータを返すかどうかを指定します。このメソッドは、すべての配列を 1 つの配列パラメーターとして使用して _ci_load($_ci_data) メソッドを呼び出します。このメソッドは、渡された変数配列をシンボル テーブルに解析します。 、キー名が変数名として使用され、値が変数の値として使用されます)、これらの変数はキャッシュされるため、異なるビューで変数を相互に交換できます。つまり、このメソッドでは複数の呼び出しが可能です。前のビューに渡された変数は呼び出されるたびに自動的にロードでき、ビューに渡されたすべての変数はクラスの属性にキャッシュされるため、毎回すべての変数が取得されます。次に、ビュー ファイルが呼び出され、出力バッファの一部としてグローバル変数 $OUT に割り当てられます。これにより、効率が向上し、デバッグ時間がより正確になります。
他のロード方法は基本的に上記の方法と同じですが、状況に応じて、これらのファイルをインクルードした後、コントローラー内のすべてのファイルがインクルードされます。コントローラー内でこれらのオブジェクトとデータを自由に使用でき、最終的にすべてのデータがバッファーされた出力クラスを介して出力されます。Loader クラスの構造は非常に複雑に見えますが、その実装は実際には非常に単純です。内部コードの原理は基本的に同じです。よく見るとわかります