ホームページ >バックエンド開発 >PHPチュートリアル >yii ソースコード分析 3、yii ソースコード分析_PHP チュートリアル
次のように指定してください: 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アクション
リーリーこれら 2 つのクラスは非常に単純で、コントローラー クラスのアクション メソッドを実行するだけです。
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 インスタンスを取り出します。
ログインフィルターなど
リーリー内部にはプレフィックスとポストフィックスがあり、フィルターを有効にする必要があるアクション メソッドに対して、アクション メソッドの実行前と後に、それぞれ自己定義の preFilter メソッドと postFilter メソッドを実行することを意味します。
次に $filterChain->run (); ここで間違いを犯しやすいです。
実際、CFilterChain で run() を再度使用したところ、内部に $this->filterIndex++ があることに気付きました。これは再帰に少し似ています。
フィルターがアクションをフィルターしたい場合は、次のように CFilter に移動し、$filterChain->run (); return 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 を添付します
http://www.bkjia.com/PHPjc/909747.html