YIIのソースコード解析(3)
YII ソースコード解析 (3)
yii プログラムの起動プロセスとページのレンダリング方法についてはすでに見てきました。私たちが今日分析したいのは、Yii がユーザーのリクエストをどのように処理するかということです。それがコントロールとアクションの部分です。
このプロセスを説明するために helloworld を例に挙げてみましょう。アドレスバーに http://localhost/study/yii/demos/helloworld/index.php と入力すると、ページに hello world が表示されます。
前の分析ではデフォルト値が使用されていますが、URL にYii はパラメータをどのように処理しますか?この質問を念頭に置いて、詳しく分析してみましょう。
CWebApplication には次のようなコード行があります。
<span style="color: #800080;">$route</span>=<span style="color: #800080;">$this</span>->getUrlManager()->parseUrl(<span style="color: #800080;">$this</span>->getRequest());
これは、ちょっとチキンゼリーっぽくないですか?まずは getUrlManager がいかに素晴らしいかを見てみましょう。
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> getUrlManager() { </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->getComponent('urlManager'<span style="color: #000000;">); }</span>
これは再度見つける必要があります。
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> getComponent(<span style="color: #800080;">$id</span>,<span style="color: #800080;">$createIfNull</span>=<span style="color: #0000ff;">true</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->_components[<span style="color: #800080;">$id</span><span style="color: #000000;">])) </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->_components[<span style="color: #800080;">$id</span><span style="color: #000000;">]; </span><span style="color: #0000ff;">elseif</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->_componentConfig[<span style="color: #800080;">$id</span>]) && <span style="color: #800080;">$createIfNull</span><span style="color: #000000;">) { </span><span style="color: #800080;">$config</span>=<span style="color: #800080;">$this</span>->_componentConfig[<span style="color: #800080;">$id</span><span style="color: #000000;">]; </span><span style="color: #0000ff;">if</span>(!<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$config</span>['enabled']) || <span style="color: #800080;">$config</span>['enabled'<span style="color: #000000;">]) { Yii</span>::trace("Loading \"<span style="color: #800080;">$id</span>\" application component",'system.CModule'<span style="color: #000000;">); </span><span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$config</span>['enabled'<span style="color: #000000;">]); </span><span style="color: #800080;">$component</span>=Yii::createComponent(<span style="color: #800080;">$config</span><span style="color: #000000;">); </span><span style="color: #800080;">$component</span>-><span style="color: #000000;">init(); </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->_components[<span style="color: #800080;">$id</span>]=<span style="color: #800080;">$component</span><span style="color: #000000;">; } } }</span>
return $this->components[$id ]; ID は渡された urlManager です。実際、ここからは何も表示されません。urlManager クラスを直接見つけて parseUrl を確認します。上記のコードから、次のようになります。 URL に何かをアップロードする必要はありません。「」を返すだけで済みます。そこで、パラメータをどのように渡すかという疑問が生じます。
<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> parseUrl(<span style="color: #800080;">$request</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$this</span>->getUrlFormat()===self::<span style="color: #000000;">PATH_FORMAT) { </span><span style="color: #800080;">$rawPathInfo</span>=<span style="color: #800080;">$request</span>-><span style="color: #000000;">getPathInfo(); </span><span style="color: #800080;">$pathInfo</span>=<span style="color: #800080;">$this</span>->removeUrlSuffix(<span style="color: #800080;">$rawPathInfo</span>,<span style="color: #800080;">$this</span>-><span style="color: #000000;">urlSuffix); </span><span style="color: #0000ff;">foreach</span>(<span style="color: #800080;">$this</span>->_rules <span style="color: #0000ff;">as</span> <span style="color: #800080;">$i</span>=><span style="color: #800080;">$rule</span><span style="color: #000000;">) { </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">is_array</span>(<span style="color: #800080;">$rule</span><span style="color: #000000;">)) </span><span style="color: #800080;">$this</span>->_rules[<span style="color: #800080;">$i</span>]=<span style="color: #800080;">$rule</span>=Yii::createComponent(<span style="color: #800080;">$rule</span><span style="color: #000000;">); </span><span style="color: #0000ff;">if</span>((<span style="color: #800080;">$r</span>=<span style="color: #800080;">$rule</span>->parseUrl(<span style="color: #800080;">$this</span>,<span style="color: #800080;">$request</span>,<span style="color: #800080;">$pathInfo</span>,<span style="color: #800080;">$rawPathInfo</span>))!==<span style="color: #0000ff;">false</span><span style="color: #000000;">) </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$_GET</span>[<span style="color: #800080;">$this</span>->routeVar]) ? <span style="color: #800080;">$_GET</span>[<span style="color: #800080;">$this</span>->routeVar] : <span style="color: #800080;">$r</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">useStrictParsing) </span><span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".', <span style="color: #0000ff;">array</span>('{route}'=><span style="color: #800080;">$pathInfo</span><span style="color: #000000;">))); </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">return</span> <span style="color: #800080;">$pathInfo</span><span style="color: #000000;">; } </span><span style="color: #0000ff;">elseif</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$_GET</span>[<span style="color: #800080;">$this</span>-><span style="color: #000000;">routeVar])) </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$_GET</span>[<span style="color: #800080;">$this</span>-><span style="color: #000000;">routeVar]; </span><span style="color: #0000ff;">elseif</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$_POST</span>[<span style="color: #800080;">$this</span>-><span style="color: #000000;">routeVar])) </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$_POST</span>[<span style="color: #800080;">$this</span>-><span style="color: #000000;">routeVar]; </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">return</span> ''<span style="color: #000000;">; }</span>
isset($_GET[$this-><span>routeVar]) <br><br></span>
<span style="color: #0000ff;">public</span> <span style="color: #800080;">$routeVar</span>='r';
を追加すると、エラーが報告されることがわかりました。それは、abc コントローラーが存在しないことを意味します。それは、ことわざにあるように、男が悪くなければ、女は彼を愛さないでしょう。
helloworld/index.php?r=site に変更すると、hello world が表示されます。これは一体何でしょうか。理由は非常に簡単で、サイトコントローラーが定義されているからです。
わかりました、これには異論はありませんが、actionIndex とは一体何ですか? Yii では、これをアクションと呼びます。 ?r=site/index と入力すると、アクションが「/」で区切られ、コントローラーの背後にあるパラメーターがキャプチャされます。ブラウザにアクションを追加して表示します:
<span style="color: #0000ff;">class</span> SiteController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> CController{ </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Index action is the default action in a controller. </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionIndex() { </span><span style="color: #0000ff;">echo</span> 'Hello World'<span style="color: #000000;">; }</span><span style="color: #000000;">}</span>
?r=site/view にアクセスすると、「Hello View」という出力が表示されますか?確かに、私はほとんど本を読んでいませんが、写真と真実があります:
<span style="color: #0000ff;">class</span> SiteController <span style="color: #0000ff;">extends</span><span style="color: #000000;"> CController{ </span><span style="color: #008000;">/*</span><span style="color: #008000;">* * Index action is the default action in a controller. </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionIndex() { </span><span style="color: #0000ff;">echo</span> 'Hello World'<span style="color: #000000;">; } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actionView() { </span><span style="color: #0000ff;">echo</span> 'Hello View'<span style="color: #000000;">; }}</span>
この名前のサイトはまったく使いたくないです。 test は私のお気に入りなので、それを試すために別のテスト コントローラーを作成しました。
鋭い目のある人はアクションの書き方を見たはずです。これは一体何ですか?やってみて初めて、実は別の表現方法だということが分かりました。
ブログの例で確認コードを表示するために使用したことを覚えています:
<span style="color: #008000;">/*</span><span style="color: #008000;">* * Declares class-based actions. </span><span style="color: #008000;">*/</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> actions() { </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">array</span><span style="color: #000000;">( </span><span style="color: #008000;">//</span><span style="color: #008000;"> captcha action renders the CAPTCHA image displayed on the contact page</span> 'captcha'=><span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>'class'=>'CCaptchaAction', 'backColor'=>0xFFFFFF,<span style="color: #000000;"> )</span>, <span style="color: #008000;">//</span><span style="color: #008000;"> page action renders "static" pages stored under 'protected/views/site/pages' // They can be accessed via: index.php?r=site/page&view=FileName</span> 'page'=><span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>'class'=>'CViewAction',<span style="color: #000000;"> )</span>,<span style="color: #000000;"> ); }</span>
一体何だ?これは、設定ファイルから始める必要があります。
urlFormat には path と get の 2 つのタイプがあります。main.php で指定されていない場合は、get メソッド (index.php?r=site) になります。 /キャプチャ。
'urlManager'=><span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>'urlFormat'=>'path', 'rules'=><span style="color: #0000ff;">array</span><span style="color: #000000;">( </span>'post/<id:\d+>/<title:.*?>'=>'post/view', 'posts/<tag:.*?>'=>'post/index', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',<span style="color: #000000;"> )</span>,<span style="color: #000000;"> )</span>,

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Index.html は Web ページのホームページ ファイルを表し、Web サイトのデフォルト ページです。ユーザーが Web サイトにアクセスすると、通常、index.html ページが最初に読み込まれます。 HTML (HypertextMarkupLanguage) は Web ページの作成に使用されるマークアップ言語であり、index.html も HTML ファイルです。これには、Web ページの構造とコンテンツに加えて、書式設定とレイアウトに使用されるタグと要素が含まれます。以下は、index.html コードの例です: <

多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

C 言語における return の使い方は、 1. 戻り値の型が void の関数については、return 文を使用して関数の実行を早期に終了することができます; 2. 戻り値の型が void ではない関数については、 return ステートメントは、関数の実行を終了するためのものです。結果は呼び出し元に返されます。 3. 関数の実行を早期に終了します。関数内で return ステートメントを使用して、関数の実行を早期に終了することもできます。関数が値を返さない場合。

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

ソースコード: publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}#出力 上記のコードの出力は、単純に次のように結論付けることができます:finally の前に return が実行されます。バイトコード レベルで何が起こるかを見てみましょう。以下は、case1 メソッドのバイトコードの一部をインターセプトし、ソース コードを比較して、各命令の意味に注釈を付けます。

パート 1: 最初のトラブルシューティング手順 Apple のシステムステータスを確認する: 複雑な解決策を掘り下げる前に、基本から始めましょう。問題はデバイスにあるのではなく、Apple のサーバーがダウンしている可能性があります。 Apple のシステム ステータス ページにアクセスして、AppStore が適切に動作しているかどうかを確認してください。問題があれば、Apple が修正してくれるのを待つしかありません。インターネット接続を確認します。「AppStore に接続できません」問題は接続不良が原因である場合があるため、安定したインターネット接続があることを確認してください。 Wi-Fi とモバイル データを切り替えるか、ネットワーク設定をリセットしてみてください ([一般] > [リセット] > [ネットワーク設定のリセット] > [設定])。 iOS バージョンを更新します。

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Vue3.2 セットアップ構文シュガーは、単一ファイル コンポーネント (SFC) で結合された API を使用して、Vue3.0 の面倒なセットアップを解決するコンパイル時構文シュガーです。宣言された変数、関数、インポートによって導入されたコンテンツは、インポートによって公開されます。使用上の問題点 1. 宣言した変数、関数、import で導入した内容を使用中に return する必要はなく、糖衣構文を使用することができます。 // 導入した内容をインポート import{getToday }from'./utils'//variable constmsg='Hello !'//function func
