2012-08-16 73 views
0

我想明確一些事情,然後繼續我的項目以防止錯誤的代碼實踐。 我在軌道上的紅寶石開發之前,我想知道它是否可以使它像PHP一樣,因爲我開始學習,但我不想使用像Zend,Yii等框架php MVC概念,導軌

對我來說, 模型是數據插入數據庫的地方。

控制器是查找所有參數並使用模型中的函數將數據處理成數據庫的地方。此外,當程序返回成功或失敗時,它也會路由或重定向。

視圖是獲取在控制器中初始化的即時變量並將其用於以適當格式呈現數據的位置。

所以,這裏是我在PHP中的問題。 我想創建CRUD在php.I走過了很多文章或帖子(在stackoverflow &其他人),但我很困惑,一些人說不同種類的東西。

在我看來,模型只是與數據插入/查詢到數據庫有關的地方。所以,我的創建,顯示,更新,刪除的每個查詢都會放入我的模型中。 這裏是我的模型中create_user函數的例子。

function create_user($firstName, $lastName,$username, $password){ 
    $query = "INSERT INTO `users` (`user_id`, `first_name`, `last_name`, `email`, `username`, `password`, `created_at`, `handphone_no`, `street_address`, `city`, `state`, `country`, `postal`, `birthday`, `company_id`) 
      VALUES (NULL, ?, ?, NULL, ?, ?, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2)"; 

    if($stmt = $this->conn->prepare($query)) { 
     $stmt->bind_param('ssss', $firstName, $lastName,$username, $password); 
     $stmt->execute(); 
    } 

} 

所以,我FIRST問題:在我的模型,是我該對象,並傳遞給控制器​​?或者只是返回true或false來表示過程的成功或失敗。

在我的用戶控制器

class Users_controller { 

private $user; 

function __construct(){ 
    $this->user = New User(); 
} 

function create($firstName, $lastName,$username, $password){ 
    $this->user->create_user($firstName, $lastName,$username, $password); 
} 
} 

第二問題:我的CRUD,在導軌,它要麼找對象和顯示/編輯它的ID或創建/銷燬的新模式。那麼,我的控制器在這裏必須返回一個對象來呈現數據?以及我如何將我的表單連接到控制器。從我的表單向控制器傳遞參數。

所以,現在我想到目前爲止只有,任何指導和明確的例子,讓我更多的瞭解,因爲我是新來的PHP。謝謝你...

+2

這裏有一個想法:忘記你所瞭解的關於rails的所有知識,並學習MVC,而不是在柵欄的PHP端尋找rails-clones。 – 2012-08-16 17:14:03

回答

0

好了,希望這個答案也不會太,但在這裏我們去...

首先,回報率實際上是在一個框架,所以最接近你會在PHP中得到的將是一個框架。但是,您不會在PHP中找到rails副本(或任何關閉的東西)。而且,幾乎所有PHP框架都聲稱實現了MVC,但幾乎沒有一個可以實現。他們中的大多數提出了某種修改的& MVC的猖獗SOLID違規和各種其他問題的簡化版本。在這個答案中,我將把MVC的這些變體簡稱爲「FMVC」。儘管如此,正確的MVC在PHP中在技術上是不可能的,因爲持久化模型的必要性。 (注意:你可以使用在PHP中完成這項工作,但這並不容易,而且很可能會是一些醜陋的/「hacky」代碼)。

這裏是我的建議,如果你因爲某些學習:如果你心裏有一個項目,選擇一個框架,通常吸引你,並用它去。深入學習它,深入瞭解源代碼,檢查一些代碼,並確保(大部分)忽略特定框架的所有可能的人員。我說「大多是」因爲如果你真的想學MVC或OOP-PHP在一般情況下,做到這一點的最好辦法是看現有的實現,真正瞭解黃金三鏢客的部分代碼。這會給你帶來的是堅實的原則(固然是雙關語)的知識基礎,以及固體違規。

如果你正在尋找寫自己的MVC框架或一般學習MVC,有幾件事情首先要了解:

  1. 在OP好像你誤會究竟是什麼模型是;在MVC模式中,「M」(模型)是。如果您想要對模型進行冗長但非常準確的描述,請參閱this post by tereško,因爲它目前是SO上最好的答案。簡而言之,模型層由許多部分組成,即數據映射器,域對象和「服務」。 Data mappers與FMVC中的「模型」類相似 - 它們包含數據庫查詢。 Domain Objects基本上只是域數據的容器。 「服務」是與模型層的交互點:您調用服務來做某件事,並在模型層中完成工作。一般而言,您不會直接在服務外部調用數據映射器(或域對象)。

  2. CRUD是不是一個東西,這是一個概念 - 的方法的列表,包括在類(創建,讀取,更新,刪除)。數據映射器通常包含CRUD方法(通過擴展等做服務,雖然有時有點更抽象)

  3. 要重申(因爲它是非常重要的),幾乎沒有任何PHP框架實施適當的MVC,所以希望他們關於學習MVC的指導是一個壞主意。你可能以這種方式學習FMVC,但適當的MVC與他們實現的方法相去甚遠。

  4. 如果您不知道完全瞭解OOP和SOLID原則,在MVC編碼將是一場噩夢。回去和再學習或清涼的OOP的基本知識是第一件事情,如果你想了解MVC

現在爲您的具體問題,你應該做的:

  1. 這個問題沒有按真的沒有道理。對模型層的調用是通過服務完成的,服務通常將域對象傳遞給相關數據映射器進行處理。數據映射器將域對象(包含所有結果數據)返回給從模型層以外調用的服務。

  2. 這個問題也沒有意義 - 讀the post that I linked earlier應該清除一些混淆。

tl; dr - 讀取this post

+0

感謝您對我的問題的詳細回覆。所以,即時通訊是一個人力資源系統的項目,有很多CRUD將會被實現。除了MVC還有其他的方式嗎?或者我怎麼能夠很好地組織我的代碼並且執行好的代碼實踐以便重用? – Nich 2012-08-17 15:50:36

0

我不知道你爲什麼不想使用PHP框架,因爲RoR也是一個框架。

我已經開發了我自己的PHP框架,並且可以告訴你,從經驗來看,這通常是一個壞主意,除非您對應用程序有一些非常特殊的要求。

我建議你試試Yii,它在允許的編碼中相當自由。

總之,要回答你的問題:

首先,我將創建一個具有CRUD的東西,而不是重新爲每個類別的通用模型類。因此,例如,您可以定義可用的屬性(或直接從數據庫中獲取)並具有通用的「保存」功能,該功能將根據主鍵的值的存在情況進行插入或更新。

然後當你保存時,你應該在成功時返回true,在無效數據/驗證時返回false,並且在SQL請求失敗時拋出異常。

從形式向控制器傳遞數據通過POST完成,並且該值被注入到該對象。從那裏你可以檢查對象是否存在於數據庫中。

HTH

+0

模型是**不是**類,它是一個層... – orourkek 2012-08-16 17:38:25