ホームページ  >  記事  >  バックエンド開発  >  Yii フレームワークのソースコード解析 (3)

Yii フレームワークのソースコード解析 (3)

WBOY
WBOYオリジナル
2016-08-08 09:33:281155ブラウズ

転載する場合はその旨を明記してください: TheViper http://www.cnblogs.com/TheViper/

前回の記事ではCWebApplicationの¥route=$this->getUrlManager()->parseUrl($this->getRequest());と$route=controler/actionidの取得についてお話しました。

この記事では $this->runController ($route); について説明します。

リーリー

$ca = $this->createController ($route)); createController の機能は、$route 内のコントローラーとアクションを分離し、コントローラー インスタンスを作成することです。

最後に、コントローラー インスタンスとアクション ID が返されます。

次に、CWebApplication の runController($route),$controller->init (); に戻り、コントローラーの初期化時にこれを実行します。これは、たとえば次のように書き換える必要があります。

リーリー

このように、$this->db を使用して、VideoController の db コンポーネントを呼び出すことができます。

$controller->run ( $actionID );Ccontrollerに転送します。

リーリー

$this->createAction ( $actionID ); アクション インスタンスを作成します。

次に、 runActionWithFilters($action, $filters); filter() がない場合は、直接 runAction($action) します。

$action->runWithParams ( $this->getActionParams () ).$action は CInlineAction インスタンスです。

リーリー

Cアクション

リーリー

どちらのクラスも非常に単純で、コントローラー クラスのアクション メソッドを実行するだけです。

filter() がある場合は、上記の runActionWithFilters($action, $filters) に戻り、CFilterChain::create ( $this, $action, $filters )->run ();

明らかに、フィルターがある場合は、アクション メソッドを実行する前にフィルター リストを設定する必要があります。

CFilterChain は、「application.filters.LoginFilter+upload_video」のような構成を解析してフィルター チェーンを作成します。

フィルター チェーン内の各項目は、CInlineFilter または CFilter インスタンスです。

リーリー

'application.filters.LoginFilter+upload_video' この構成により、CFilter インスタンスが作成されます。

リーリー

次に、上記の CFilterChain::create ($this, $action, $filters)->run (); に run() があり、リクエストによって解析されたアクションが Upload_video の場合、Yii は LoginFilter インスタンスを取り出します。

たとえば、私の LoginFilter

リーリー

内部にはプレフィックスとポストフィックスがあり、フィルターを有効にする必要があるアクション メソッドに対して、アクション メソッドの実行前と後に、それぞれ自己定義の preFilter メソッドと postFilter メソッドが実行されることを意味します。

次に $filterChain->run(); ですが、ここは間違いやすいです。

実際、CFilterChain で run() を再度使用したところ、内部に $this->filterIndex++ があることに気付きました。これは再帰に少し似ています。

フィルターがアクションをフィルターする場合は、次のように CFilter に移動し、$filterChain->run (); で CFilterChain を返し、$this->filterIndex++ から $filterChain->run (); に進みます。 。 。 。 。 。 。

私の「application.filters.LoginFilter+upload_video」では、upload_video アクションのみがフィルタリングされるため、CFilterChain が返されると、$this->filterIndex は 1 になり、フィルタ リストにはフィルタ インスタンスが 1 つだけあるため、今回は$this->controller->runAction ( $this->action ); に進みます。これは、フィルターが設定されていない場合の $this->runAction ( $action ); と同じです。

フィルターが解析された後、いくつかのデータ操作などがあり、最後にレンダリング ビュー render() が行われます。これは単純すぎます。extract($data) を実行して、ビュー ファイルをインクルードします。

別のコントローラー/アクションにジャンプする forward() メソッドもあります。本質は、CWebApplication の runController に戻り、上記の分析プロセスを繰り返すことです。

最後に、トリミングされた yii http://files.cnblogs.com/TheViper/framework.zip を添付します。

以上、yii フレームワークのソースコード解析 (3) を紹介しました。これには、yii フレームワークのソースコードの内容も含まれており、PHP チュートリアルに興味のある友人の参考になれば幸いです。

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