転載する場合はその旨を明記してください: 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 チュートリアルに興味のある友人の参考になれば幸いです。