[問題] 執行cakePHP的AP之流程

edited 十月 2013 in CakePHP
請問如果想要了解在cakePHP架構下,從user透過browser點選一個超連結,觸發一連串的程序反應的過程,該在google下下什麼樣的關鍵字,才能找到相關的討論文章?

這樣說可能很模糊,我舉一個例子:

例如在usersController中的beforeFilter()函式,是個回呼函式,它會在action(例如 index())被正式執行前被呼叫。

但是這個beforeFilter()函式在cakePHP架構下是如何被呼叫的?我依序追溯AppController, Controller, Object等底層類別,都看不到beforeFilter()被觸發的定義。

我之所以想了解這個問題,是因為cakePHP的架構有點"高階"(甚至是很多人標榜的magic?),就像早期寫BASIC一樣,很多底層的東西都被做掉了。高階的部份只要照"規格"寫就好,至於怎麼運作都不知道,寫起來感覺虛虛的。若要跟人家(包括自己)解釋原理,解釋不出來。甚至在debug環境還不是很熟悉(成熟?)的情況下,有時候程式當中出現一點莫名其妙的小bug,就疑神疑鬼地感覺好像底層架構有問題。。。:P

若時間允許的話,能夠將整個framework做個通盤性的了解那是最好。不過時間不夠,還是希望說能夠有這方面的文章可以導讀,至少能夠對於這個架構的運作原理及流程能稍微掌握一些。

謝謝。

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=3714

評論

  • edited 十一月 2008
    在 Controller 之前還會有 Dispatcher 與 Router ,可以看看這個:
    http://book.cakephp.org/view/21/A-Typical-CakePHP-Request
  • edited 十一月 2008
    kiang真是強者呀!這篇果然是我想要的文章。
    感謝。
  • edited 十一月 2008
    按圖索驥,總算追到beforeFilter()是在dispatcher.php中的dispatcher class的dispatch method當中被呼叫。dispatcher在載入controller後,先呼叫controller的beforeFilter(),再執行controller的action。

    程式碼:http://api.cakephp.org/dispatcher_8php-source.html#l00110
  • edited 十一月 2008
    這種預先埋下callback在一些需要彈性的流程裡面蠻常用的
    給個範例:
    列表、連結、設定、儲存、表頭、欄名、欄位、內容、存取、驗證
    這些都是callback
    	function _委派($方法, array &$參數 = array()){
    		static $_預設 = array();
    		if (empty($_預設)) {
    			$_預設 = array(
    				'列表' => array(),
    				'連結' => array(),
    				'設定' => array(),
    				'儲存' => true,
    				'表頭' => array(),
    				'欄名' => array(),
    				'欄位' => array(),
    				'內容' => array(),
    				'存取' => true,
    				'驗證' => true,
    			);
    		}
    
    		$_方法列表 = @array(
    			array($this, '_' . $this->action . '_' . $方法),
    			array($this, '_' . $this->委派[$this->action][$方法] . '_' . $方法),
    		);
    		foreach ($_方法列表 as $_方法){
    			if (is_callable($_方法)) {
    				return call_user_func_array($_方法, $參數);
    			}
    		}
    		
    		return $_預設[$方法];
    	}
    
    	function _共用流程($編號 = 0){
    		$this->viewPath = 'default';
    		$_設定 = &$this->列表['設定'];
    		$this->_設定($編號);
    		$this->_記錄();
    		$this->_明細();
    		$this->_列表();
    		$this->_訊息重導(!$this->_委派('存取'), $this->預設訊息['無法存取'], '', $_設定['重導']);
    	}
    					
    	function index(){
    		$this->view(null);
    	}
    
    	function view($編號 = 0){
    		$this->_共用流程($編號);
    	}
    
    	function add() {
    		$this->edit(null);
    	}
    
    	function edit($編號 = 0) {
    		$this->_共用流程($編號);
    		$_設定 = &$this->列表['設定'];
    		$_資料 = &$this->data;
    		if (false === empty($_資料) && $this->_委派('驗證')) {
    			$this->_訊息重導($this->_儲存(), $this->預設訊息['儲存成功'], $this->預設訊息['儲存失敗'], $_設定['重導']);
    		}
    		$this->_初始表單();
    	}
    
    	function language() {
    		$_資料 = &$this->data;
    		$_路徑 = (false === isset($_資料[$this->name]['url']) || false === isset($_資料[$this->name]['UI_language']))
    			? '/'
    			: $_資料[$this->name]['url'];
    		return $this->redirect($_路徑);
    	}
    
    
    
  • edited 十一月 2008
    上面那一篇只是要講,CakePHP在流程上還是切的不夠細,自由度還蠻高的,用他來開發時,要自己想一個合適的流程結構來堆積木
  • edited 十一月 2008
    感謝指教。

    我算是cakePHP新手,架構還沒摸熟..上面這段委派函式對我有啟發性,日後應該會用得著。 ^^
Sign In or Register to comment.