簡體   English   中英

PHP MVC概念,rails

[英]php MVC concept, rails

在進行項目之前,我想弄清楚一些事情,以防止錯誤的代碼實踐。 我之前在鐵路上開發過Ruby,我想知道它可以使它像PHP中一樣,因為即時消息開始學習,但是我不想使用Zend,Yii等框架。

對我而言,模型是將數據插入數據庫的地方。

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

視圖是獲取在控制器中初始化的即時變量並使用其以正確格式呈現數據的地方。

所以,這里的PHP我的問題。 我想在php中創建CRUD。我瀏覽了許多文章或帖子(在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();
    }

} 

所以,我的第一個問題:在我的模型中,我是否應該傳遞給對象並傳遞給控制器​​? 或僅返回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,在rails中,它將找到對象的ID並進行顯示/編輯,或者創建/銷毀新模型。 因此,這里的控制器必須為我返回一個對象以在視圖中呈現數據? 以及我應該如何將表單連接到控制器。 從我的表單將參數傳遞給控制器​​。

所以,現在我只是想到目前為止,任何指導和明確的例子讓我了解更多,因為我是php新手。 謝謝...

我不確定為什么您不想使用PHP框架,因為RoR也是一個框架。

我以前已經開發了自己的PHP框架,並且可以從經驗中告訴您,除非您對應用程序有一些非常具體的要求,否則通常這不是一個好主意。

我建議您嘗試使用Yii,它在允許的編碼方面相當寬松。

無論如何,回答您的問題:

首先,我將創建一個執行CRUD的通用模型類,而不必為每個類都重新創建。 因此,例如,您定義了可用的屬性(或直接從DB獲取),並具有一個通用的“保存”功能,該功能將根據主鍵的值的存在來進行插入或更新。

然后,在保存時,如果成功,則應返回true,如果數據/驗證無效,則應返回false,如果SQL請求失敗,則將引發異常。

通過POST將數據從表單傳遞到控制器,然后將值注入到對象中。 從那里可以檢查對象是否存在於數據庫中。

高溫超導

好的,希望這個答案不會太長 ,但是我們開始吧...

首先,RoR實際上是一個框架,因此與PHP最接近的是框架。 但是,您不會在PHP中找到rails克隆(或任何接近的東西)。 另外,幾乎所有的PHP框架都聲稱要實現MVC,但幾乎沒有一個實現。 他們中的大多數人都提出了某種MVC的修改和簡化版本,其中普遍存在違反SOLID的行為以及其他各種問題。 在此答案中,我將把MVC的這些變體簡稱為“ FMVC” 話雖如此,由於持久性模型的必要性,在PHP中,正確的MVC在技術上是不可能的。 (請注意:您可以在PHP中執行此操作,但這並不容易,並且可能會是一些難看/“ hacky”的代碼)。

如果您想學習一些東西,這是我的建議:如果您有一個項目,請選擇一個通常吸引您的框架,然后再進行開發。 從內而外地學習它,深入研究源代碼,對您的一些代碼進行審查,並確保(主要)忽略該特定框架的所有反對者。 我之所以說“主要”是因為,如果您真的想一般地學習MVC或OOP-PHP,最好的方法是查看現有的實現,並真正理解代碼的好,壞和丑陋的部分。 這將為您提供SOLID原則以及SOLID違規知識的堅實基礎(不好意思)。

如果您想編寫自己的MVC框架或學習一般的MVC,首先需要了解以下幾點:

  1. 在OP中,您似乎誤解了模型的確切含義。 在MVC模式中,“ M”(模型)是一層 如果您想要一個冗長而又極其准確的模型描述,請參閱tereško的這篇文章 ,因為它目前是SO上最好的答案。 簡而言之,模型層由許多部分組成,即數據映射器,域對象和“服務”。 數據映射器類似於FMVC中的“模型”類-它們包含數據庫查詢。 域對象基本上只是域數據的容器。 “服務”是與模型層交互的點:您調用服務以執行某項操作,並且服務在模型層內完成工作。 通常,您不會在服務之外直接調用數據映射器(或域對象)。

  2. CRUD不是一回事,而是一個概念-包含在類中的方法列表(創建,讀取,更新,刪除)。 數據映射器通常包含CRUD方法(通過擴展,服務也包含CRUD方法,盡管有時更抽象一些)

  3. 重申一下(因為它非常重要),幾乎沒有PHP框架實現正確的MVC,因此,向他們尋求學習MVC的指導是一個壞主意。 您可能會以這種方式學習FMVC,但是正確的MVC與實現它們之間還有很長的路要走。

  4. 如果您不完全了解OOP和SOLID原理,那么使用MVC進行編碼將是一場噩夢。 如果要學習MVC,首先應該重新學習OOP的基礎知識或對其進行更新。

現在針對您的具體問題:

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

  2. 這個問題也沒有任何意義-閱讀我之前鏈接的帖子應該可以消除一些困惑。

tl; dr-閱讀此文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM