ホームページ  >  記事  >  バックエンド開発  >  Cakephpの実行処理コードの解釈

Cakephpの実行処理コードの解釈

黄舟
黄舟オリジナル
2016-12-20 09:40:07991ブラウズ

最近、仕事で Cakephp という PHP フレームワークを使用する必要があり、以前はあまり使用していなかったので、最近いくつかのマニュアルを読んだのですが、Cakephp のいくつかの点があまり明確ではないように感じたので、見てみることにしました。そのソースコードは次のとおりです。プロセス中にいくつかのメモがあります

このドキュメントに興味がある場合は、対応する PHP ファイルを開いて比較するのが最善だと思います。そうしないと、私が何を言っているのかわからないかもしれません。 。

開始:

デフォルトでインターネットからダウンロードしてインストールすると、app、cake、vendors、.htaccess、index.php ファイルの 3 つのディレクトリが作成されます。

マニュアルの説明と経験によれば、cake ディレクトリはフレームワークのコア コードであり、開発中に触れる必要のないディレクトリでもあります。これは、将来フレームワーク コアをアップグレードするのに役立ちます。開発プロセス中に独自のクラスを作成する必要がある場合は、ファイルをベンダー ディレクトリに配置し、app::import などのメソッドを使用して呼び出すことができます。 .htaccess とindex.php は、実行のためにデフォルトのアクセス要求を app/webroot/index.php ファイルに渡します (サーバーが .htaccess をサポートしていない場合は、index.php ファイルを再度変更する必要があります)。アプリがデフォルトのメイン戦場であることを決定します (もちろん、これは変更できます。たとえば、複数のアプリケーションがコアを共有する場合、ここでは詳しく説明しません)

app/webroot/index.php ファイルを開くとき、このファイルは次のように記述されていることがわかります。コードの最初の部分は、いくつかの基本的なパス定数 (アプリのパス、ディレクトリのパスなど) を定義し、その後にcake/bootstrap.php ファイルが続きます。必要な情報をすべてロードし、フレームワークを初期化します。何が行われるかを見てみましょう。 B は、bootstrap.php ファイルのコードの一部です。

If (! Isset ($ BOOTSTRAP)) {

'Cake' Ds.フレームワークの共通関数メソッド

'Object.php'; // すべてのクラスの親クラス

'Inflector'; .php'; // 単一複数こぶの名前付けを処理するカテゴリの名前付け: 例:
、、、 ,,, ,, ,,,' '; //キャッシュエンジンクラス

をロードする‐ ‐ ‐ ‐‐‐‐‐‐‐‐'; 'コア', array('ディスパッチャ') / /Import パス処理クラス、プログラム エントリ パスなど。

app/webroot/index.php ファイルの最後で、$Dispatcher->dispatch メソッドが呼び出され、プログラムが実行されます
$Dispatcher = new Dispatcher( ); //パス処理クラスを初期化します
$Dispatcher->dispatch($url); //フレームワークが URL 実行プログラムを決定し始めます

フレームワークがどのように Dispatcher をロードしてプログラムを実行するかを見てみましょう。

まず、cake/dispatcher.php ファイルの 106 行目でディスパッチ メソッドを見つけます。デフォルトでは、ディスパッチに渡すパラメータは空になります。url パラメータが空の場合、フレームワークは自動的に getUrl を呼び出します。 URL とその他の情報を取得するメソッド

次のようなコード:

$url = $this->getUrl(); //URL パスを取得します
$this->params = array_merge($this->parseParams($url), $AdditionalParams); $_POST および $_GET によって渡される値を含む配列、およびコントローラーとメソッド。プログラムは parseParams メソッドを通じて URL パラメーターを処理し、routes クラス メソッドを呼び出してコントローラーとアクションの情報を取得し、それを通常の配列に組み立てます。それを $this->params に渡すと、次のコードでは、$this->params が $controller->params に割り当てられることに注意してください。これが、$this->params を使用できる理由です。例: $this->params['controller'] は現在のリクエストのコントローラー名を取得します
次に、現在のアクションが、アクションの前にアンダースコア (_) があるかどうかで判断されます。次に、いくつかのパラメータが現在のコントローラに割り当てられます。 $controller->base = $this->base ;
$controller->ここ = $this->ここ;
$controller ->webroot = $this->webroot;
$controller->plugin = $this->plugin;
$controller- >params =& $this->params; //コントローラーとアクション名、フォームデータ、URL などを含むすべてのパラメーターを $controller->プラグインに渡します
$controller->action =& $this- >params['action'];
$controller->passedArgs = array_merge($ this->params['pass'], $this->params['named']); //渡されたすべてのパラメータを割り当てます/controller /action/a:1/b=2/3/4 などの名前付きパラメーターがあるかどうかを含む、$_GET による $controller->passedArgs

(注: コントローラーが render メソッドを実行すると、いくつかの変数をビューに自動的に渡します。これをテンプレートと呼びます。たとえば、コントローラーはビューに passArgs 変数の値を割り当てます。これにより、$this->passedArgs を直接呼び出すことができます。
ここで注意すべき点は、現在の操作に $_POST、$_GET、その他の値があるかどうかをフレームワークが判断することです。たとえば、$_POST には、データ フィールドのフィールド名があります。 $controller->data =& $this->params['data'];を実行します
最後に変更されたメソッドは、現在のコントローラーを呼び出し、実行用のパラメータを渡します


コードは次のとおりです: return $this - >_invoke($controller, $this->params); //アドレス参照を通じて $controller にパラメータを渡し、$controller を呼び出し、正式に実行します

呼び出された _invoke

関数を見てみましょう _invoke(&$ controller, $params)

function _invoke(&$controller, $params) {

$controller->constructClasses(); //必要なコントローラー情報をロードし、appController などをマージします (モデル、ヘルパー、コンポーネントのロードを含む)、詳細は、controller.php のクラスメソッドを確認してください
$controller->Component->initialize($controller); // コントローラーの前にコンポーネントの初期化メソッドを呼び出します beforeFilter

$controller->beforeFilter();

$controller - >Component->startup($controller);

ここでは、$controller->Component->initialize が $controller->beforeFilter() の前に実行されることがわかりますが、このマニュアルでは説明しません。ここで注意すべき点は、$controller->constructClasses メソッドが、現在のユーザー定義コントローラー クラスと、$users などの AppController (app_controller.php) 内のいくつかの変数をマージすることです。ヘルパーやコンポーネントなど、ここでより重要なことは、$users 変数のすべての値を循環して、対応するモデルをロードするということです。$this->uses 変数が false の場合、モデルはロードされません。初期化済み: コントローラーを定義するだけで、対応するモデル ファイルを定義したくない場合は、この変数を空にする必要があることに注意してください。コントローラーが呼び出されたときに他のモデルを自動的にロードしたい場合は、目的のモデルを割り当てることができます。 name を $this->users=array('modelname1', 'modelname2') などに変更します。別の状況として、ユーザーが $users の値を自分で設定しない場合、フレームワークは自動的に対応するモデル ベースの呼び出しを試みます。名前について (モデルファイルは必要ありませんが、この時点ではデータベースに対応するテーブルが存在する必要があります。そうでない場合はエラーが報告されます)

その他の説明は不要です


以下
$output = $controller ->dispatchMethod($params['action'], $params['pass ']);

このメソッドはオブジェクトクラスのdispatchMethodメソッドを呼び出すもので、実際にはコントローラークラスが対応するアクションメソッドを実行します


。以下は小さなコードです

if ($controller->autoRender) {
output = $output; 時間になると、フレームワークは対応するテンプレートを呼び出して最終的な HTML を表示および出力します


フレームワークの実行手順もちろん、まだ書ききれていないことがたくさんあります。第一に、私の文章力には限界があります。第二に、関数が多すぎるため、ここでは一つずつ説明しません

これは単純化した実行プロセスであり、モデルやその他の内容は含まれません。ソースコードを読むのが面倒に感じることもあるので、参考にしてください。マニュアルを読むよりも理解しやすいです

上記は次のとおりです。 Cakephp の実行処理コードの解釈の内容 さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


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