2011-03-28 129 views
2

我正在創建一個MVC框架,它將「action」參數後面的任何url參數傳遞給請求的動作,通過動作的方法參數。有沒有一種方法可以找出定義的方法在該方法外有多少參數? (PHP)

所以如果網址是:

host/controller_name/action_name/param1/param2 

發生下述情況(簡化當然):

$requested_controller = new controller_name(); 
call_user_func_array(array($requested_controller, action_name), array(param1, param2); 

的問題是在錯誤報告。如果請求的URL數量錯誤(動作需要兩個參數,但url只包含一個參數,我會收到警告消息,然後破壞)。

由於這是一個程序錯誤,而不是一個例外,我不能試圖/以任何方式捕捉它,我可以嗎?有沒有辦法在嘗試運行之前檢查操作方法的預期參數數量?或者我應該用完全不同的方式來攻擊它?

EDIT(液)

   $action_method_relfection = new ReflectionMethod($requested_controller, $requested_action); 
       if (count($path_variables) < $action_method_relfection->getNumberOfRequiredParameters() || count($path_variables) > $action_method_relfection->getNumberOfParameters()) { 
        // if not, redirect to 404 error 
        self::redirect_to_404(); 
       } 
+0

可能重複的[如何動態檢查一個函數的參數數量在PHP](http://stackoverflow.com/questions/346777/how-to-dynamically-check-number-of-arguments-of-a -function-in-php) – GWW 2011-03-28 18:40:28

+0

只有最終的解決方案存在問題,如果開發者沒有在url中包含正確的參數數量,他們將不會收到警告。會找到一個方法。 – dqhendricks 2011-03-28 19:16:12

回答

4

我想的是,使用Reflection API,你能找出多少參數的每個方法接受,使用的


另一個解決方案是讓你的方法接受只有一個參數:一個數組,可以包含任何可能數量的項目。

這樣,你總是傳遞一個參數,所有的方法總是期望一個參數;並沒有警告/錯誤了。

+0

+1爲陣列法 – Alp 2011-03-28 18:43:35

+0

這些都是有意思的想法。第二個讓我感到緊張,因爲所有參數都會通過數組的數字索引來傳遞,而不是命名參數。含糊不清會使包含的代碼混淆。我將研究第一個想法的可能性。 – dqhendricks 2011-03-28 18:47:37

+0

@dqhendricks您不僅限於數字索引,還可以使用字符串作爲鍵。 – jeroen 2011-03-28 19:00:26

0

嘗試一些簡單的像

if (!isset($param1) || !isset($param2)) exit; 
+0

可能有數百個控制器類和數百種操作方法。我不能爲每個人做這樣的檢查。 – dqhendricks 2011-03-28 18:44:25

0

雖然你可以使用func_get_args()功能,那種感覺是錯誤的方式去了解它。

我總是確定我要調用什麼函數以及它需要什麼(可選...)參數。

+0

此功能僅在該方法內起作用,警告已經發生。 – dqhendricks 2011-03-28 18:43:22

+0

@dqhendricks只有在沒有足夠的參數的情況下,您纔可以使用1.默認值或2.您的函數中沒有定義任何參數。 – jeroen 2011-03-28 18:49:11

+0

需要使用默認值的任何公共控制器方法的要求看起來很麻煩,然後需要在每個方法中進行檢查,以確保正常處理無效請求。 - 同樣,沒有定義參數也會導致任何讀取包含代碼的人感到困惑。 - 我不希望對每種控制器方法的內容提出繁瑣的要求。 – dqhendricks 2011-03-28 18:52:57

相關問題