2010-06-28 70 views
5

在一個PHP MVC框架中,我該如何乾淨優雅退出當前控制器/操作,但繼續正常的腳本執行?PHP MVC:如何儘早退出Actions/Controllers?

例如,假設我的框架通常遵循這個綱要:

  1. 地圖URL到控制器/動作
  2. 實例化控制器,調用動作(捕獲輸出)
    1. 做的東西
    2. 渲染視圖
    3. 在操作結束時,繼續正常操作
  3. 過程輸出如有必要
  4. 輸出發送到瀏覽器

現在,讓我們說,我想阻止「正常」執行中「做的東西」步的地方,比方說,呈現了不同的看法,或做一個標題重定向,我想停止處理Action的其餘部分,但繼續進行「Process output」步驟

我該如何實現這個最佳方式?我唯一的想法是:

//in controller 
protected function redirect($url) { 
    header("Location: $url"); 
    exit(); 
} 

但這完全跳過框架的執行的其餘部分,並轉儲無論是在輸出緩衝區直接發送到用戶。一種替代方案:

//in dispatcher 
call_user_func_array(array($controller,$action),$params); 
afterwards: 
... 

//in controller 
protected function redirect($url) { 
    header("Location: $url"); 
    goto afterwards; 
} 

然而,這讓我twitch和違背一切我已經學會了,特別是因爲它引用的標籤在另外的文件完全。

那麼,有沒有其他方法可以實現這一目標?

注意:重定向示例可能應該使用exit()的方式,因爲我們只是重定向到其他頁面而不關心輸出。我正在尋找一種通用解決方案。

回答

3

在您的Action方法中,您可以將所有輸出收集到一個字符串中,而不是將其打印出來。僅在方法結束時打印出來。如果你需要重定向或保釋,那麼你還沒有輸出任何東西,你可以重定向或從方法返回。

+0

+1用於緩衝Action的輸出。 – 2010-06-28 15:52:03

2

也許你可以編寫一個自定義異常來表示「停止正常執行」'執行''步驟?這很混亂......但它會起作用。

+0

哇,我沒有想到這一點!當然,它違反了異常的想法,但它會冒泡直到碰到一個catch(EarlyExitException)',我可以將其包裹在我的調度方法中...... – 2010-06-28 15:57:21

+0

正是......除了整個「它違反了異常的想法「,因爲PHP還沒有」Throwable「接口。 – 2010-06-28 16:01:49

+1

例外應該用於特殊(錯誤)情況。這聽起來像「渲染不同的觀點」更像是流量控制問題。如果是這樣,則不應在「正常」條件下使用例外。 – 2010-06-28 16:08:10

0

你需要抽象更多的東西。不要只輸出一個動作!不要設置標題,因爲之前可能會出現這麼多錯誤。有不同的處理程序。響應處理器。處理責任並根據您的反應採取行動。不要只輸出行動。如果你有錯誤,拋出異常,用exceptionhadler捕獲它們,等等。

基本控制器動作

public function view(int $user_id): ResponseHandler { 
    $this->validate($user_id); //throws exception 

    if (1 == 2) throw new ControllerInvalidArgumentException(); 

    $view = new View('nameof view'); 

    return new ResponseHandler($view); 

}

只是看看現有的框架他們的設計模式,如laravel或symfony的非常好implemntations。不確定你嘗試什麼,只是不寫你自己的框架。如果你想學習閱讀和學習他人,如果你明白他們爲什麼他們會做,你會知道該怎麼做。

+0

感謝您的回覆。注意到a)當我在6年前提出這個問題時,我正在通過自己編寫探索許多大型框架背後的概念,b)當時PHP是一個不同的野獸。也就是說,我同意你的觀點,即正確的方法是創建更大的抽象並在其基礎上構建,但有時候你想避免太多的抽象。恕我直言,Laravel和Symfony是偉大的,但如果你只是想要簡單的東西非常沉重。 – 2016-06-25 18:40:30

+0

現在,我傾向於結合使用單個庫來組成更大的PHP框架。 [PHP聯盟](http://thephpleague.com/)擁有很多圖書館來幫助解決這個問題,還有許多其他的。 – 2016-06-25 18:44:20