2012-09-17 17 views
0

數據我已經創建了一個登錄系統,我試圖堅持MVC的規則,儘可能多地。加工形式MVC/OOP結構

我有一個使用AJAX來提交表單數據到小的腳本,然後要求用戶名和密碼的處理之後,控制器一個簡單的登錄表單:

function __autoload($classname) { 
    include("../classes/$classname.php"); 
} 

$username = $_POST['username'] ; 
$password = $_POST['password'] ; 

$AC = new AccessControl ; 

$result = $AC->login($username, $password) ; 

if($result !== 0) 
{ 
echo $result ; 
exit() ; 
} 

AccessControl的是我的用戶認證類和帳戶管理操作,代碼是在我的其他職位:MVC Relationships and DRY

難道我這樣做不對,因爲這個小腳本是不是一個控制器或模型?它所做的只是將從控制器返回的信息傳遞迴接口/視圖,例如錯誤消息。

回答

1

首先,不要讓任何特定的範例妨礙您在特定情況下以最佳方式

這就是說,你的小腳本控制器。它正在處理一個動作並返回一個結果。它可能不是管理特定的視圖,而是委託處理並將結果交給視圖。

0

在我oppinion,尚未使用MVC結構法的血液,這是正確的,有一些小的changings。

我通常prefeer類似:

$AC = new AccessControl ; 
$AC->setUsername($_POST['username']); 
$AC->setPassword($_POST['password']); 
if ($AC->login()) 
    echo $result // if all is ok from login method return true 
else 
    // manage some error handling here if not true 

也許你想給用戶的是用戶名和密碼在更多的地方和其他方法,所以你可以使用getPassword()/getUsername()

0

你混合身份驗證和授權。像AccessControl結構應處理授權,不認證..你選擇的名字.. EMM ......還有改進的餘地。要了解在MVC的情況下授權更,我會推薦閱讀this post

在MVC和MVC靈感設計模式的背景下,身份驗證應該是模型層的一部分,並且通過某種形式的識別服務進行處理。


你對代碼snipper有什麼看起來像控制器方法的代碼,但它有幾個問題。

行..除了讓派克代碼:

  • 不推薦使用__autoload()功能。您應該學習如何利用spl_autoload_register()函數。它會讓你編碼使用多個領導者。

    此外,自5.3版本發佈以來,可以在PHP中使用namespaces。結合自動加載器,它可以讓你更好地組織你的代碼。最近,將項目目錄結構(至少部分)映射到名稱空間是很常見的做法。

    最着名的實現將是PSR-0,儘管它不應該被認爲接近理想。它有一些嚴重的缺陷,但它將爲說明在自動加載中使用名稱空間提供一個很好的例子。

  • 您應該避免在應用程序調用圖中深入使用new。這會導致與您正在創建新實例的類的名稱緊密耦合。

    相反,您的控制器應該有一個工廠注入構造函數,然後負責新實例的初始化。

    namespace Controller; 
    
    class Foo 
    { 
        protected $serviceFactory = null; 
        protected $view = null; 
    
        // --- SNIP --- 
        public function __construct(HasSomeFactoryInterface $factory, $view) 
        { 
         $this->serviceFactory = $factory; 
         $this->view = $view; 
        } 
    
        public function postLogin($request) 
        { 
         $recognition = $this->serviceFactory->create('AccessControl'); 
    
         // --- SNIP --- 
    
    } 
    
  • 控制器在MVC設計模式應該只改變模型層和當前視圖的狀態。它不會返回任何內容,也不會將模型圖層的數據傳遞到視圖中。你似乎混淆了經典MVC,Model2 MVC,MVP,MVVP和MVC模式的Rails模仿。

    在Model2 MVC(也稱爲Web MVC)設計模式中,控制器接收傳入的用戶請求,並通過將數據從所述請求傳遞給三元組的各個部分來更改其狀態。

    namespace Controller; 
    
    class Foo 
    { 
    
        // --- SNIP --- 
        public function postLogin($request) 
        { 
         $recognition = $this->serviceFactory->create('AccessControl'); 
         $recognition->login($request->getPost('username'), 
              $request->getPost('password')); 
    
         $this->view->prepare($request->getMethod()); 
        } 
        // --- SNIP --- 
    
    } 
    

    在此示例視圖接收通知,該POST請求被接收,這意味着,即,而不是從幾個模板生成HTML,它具有隻發送HTTP頭作爲響應。

    要查看關於MVC相關模式的簡短概述,請嘗試this post

  • 如果您打算使用Model2 MVC設計模式,那麼視圖應該從模型層自行檢索信息。但是所有MVC設計模式視圖都應該對錶示邏輯負責。

    這還包括處理模型層中的錯誤狀態。域業務邏輯與視圖如何表示錯誤無關。