2012-04-15 44 views
2

我不知道我的問題是否應該問here或不。請讓我知道或移動它/刪除它,如果是這樣的話。PHP - MVC - 更好的方法來防止調用控制器中不需要的方法?

問:

對於學習的緣故,我在做我自己的小MVC「庫」爲一個非常小的個人網站。這裏是正在使用的過程(請糾正我,如果我不甚至接近做正確的方式):

中,控制器是控制器,動作稱爲控制器上的方法。在這種情況下,這將最終被:控制器 - >行動ARGUMENT1ARGUMENT2);現在

,如果用戶訪問:

http://www.Domain.com/Controller/__destruct 

http://www.Domain.com/Controller/__get/password 

當前解決方案(S):

  • 運行通過$請求config-> getURIFilter()方法或東西
  • 做method_exists支票()和is_callable()等
  • 不必在控制器中不用於處理請求的任何方法

這似乎只是這不應該成爲一個問題開始,我的設計是錯誤的。

P.S.我已經看了很多很好的MVC的PHP框架(笨,Yii的,CakePHP的,Zend公司,金絲燕等)

+0

您可能會發現[此問題](http://stackoverflow.com/questions/3430181/acl-implementation)有關。它是關於MVC中的訪問控制。 – 2012-04-15 22:36:23

回答

0

要麼讓你的控制器只處理特定的動作,例如,

/controllers 
/user 
    loginController.php 
    logoutController.php 

,然後上課,只有做一件事情,就是

class LoginController implements RequestHandler 
{ 
    public function handleRequest(Request $request, Response $response) 
    { 
     … 
    } 

    private function someAuxiliaryMethod() { 
     … 

使example.com/user/login將創建一個新的LoginController並調用接口方法handleRequest。這是一種戰略模式。

或者 - 如果你不想拆你這樣的控制器的動作 - 用一個字後綴您的行爲(Zend Framework中做到這一點):

class UserController 
{ 
    public function loginAction() { 
     … 

,並在你的引導你加後綴,並調用這些方法然後。

另一種選擇是引入可以將URL映射到控制器動作並且可以可選地進行消毒以過濾畸形URL的路由器,例如,帶下劃線。

+0

謝謝,戈登。我愛這些優雅的解決方案。我在這裏潛伏了很多,我很高興我從你那裏得到了答案。我通常會遵循你的建議,因爲我來這裏搜索很多關於良好設計的問題等等,我個人更喜歡你的方法。我想在閱讀更多關於Stratgey模式並閱讀它之後,我可能會使用你的第一個解決方案。再次感謝。編輯:在第二個想法,我喜歡第二個更好的簡單性,而不必使每個控制器的請求處理程序(即使這是一個控制器無論如何),似乎在每個控制器 – 2012-04-15 12:39:31

+0

@DanielElkins不用工作,歡迎您。很高興在SO學習我的隨筆對人們有用。謝謝:) – Gordon 2012-04-15 12:43:06

0

我建議你把前面有下劃線作爲私有方法的任何方法(只顯示一個當您執行method_exists檢查它是否以下劃線開頭時,找不到頁面)。

0

只需將不想公開給控制器的方法標記爲私有或受保護的方法即可。

保持簡單!

+0

一般是的,但不會在'__get'的情況下工作,就像OP顯示 – Gordon 2012-04-15 07:47:52

+0

'if(substr($ method,0,2)=='__'){return; }' – ThiefMaster 2012-04-15 08:01:25

+0

一般來說,我反對魔術獲得者;) – 2012-04-15 15:21:31

0

我轉了轉自己的MVC結構曾經爲你做同樣的原因,我解決了這個方式,它只是簡單地提出一個架構決策前綴與「行動」一詞的所有路由控制器操作,即:

public function actionGetData(){ 

} 

public function actionUpdateSomething() { 

} 

我這樣做的原因:

  • 您保持對你的類的公共/保護/私有範圍的完全控制,而不必擔心一個方法是無意中通過某個URL公開。
  • 它使程序員明白可路由的行爲。 public function actionDoSomething()顯然可以通過公共URL(/controllerName/doSomething)訪問,而public function getErDone()則不是。
  • 你不必爲了識別可路由的動作而跳過箍筋。只需在傳入的參數前添加「action」並查看該方法是否存在。快速和簡單。

我發現這工作得很好。