2013-07-11 22 views
2

在我當前實現的MVC設計模式中(使用PHP和CodeIgniter演示):如何處理這些頁面特定的小類,它們似乎不適合作爲CodeIgniter中的模型或庫?

假設我有一個位於「www.mysite.com/blue/page」的「頁面」,它最終由以下(大大簡化)文件:

/庫
    session_lib.php
/控制器
    /紅色
    /白色
    /藍
          page.php文件
/型號
    /紅色
    /白色
    /藍
          funky_class.php
          page_model.php
/視圖
    /紅色
    /白色
    /藍色
          page.php文件

下面是一個易於理解的控制器:

// FILE: /controllers/blue/page.php 

// Get some paramaters from URL 
$params = $this->input->get(); 

// Use a library to do some stuff with these params with a session 
$this->load->library('session_lib'); 
$this->session_lib->store_in_session($params); 

// Use a very page specific class to do some funky stuff with the params 
$this->load->model('blue/funky_class'); 
$funkified_params = $this->funky_class->funkify($params); 

// Pass params to a model 
$this->load->model('blue/page_model'); 
$data['output_from_db'] = $this->page_model->get_some_output_from_db($funkified_params); 

// Send to view 
$this->load->view('blue/page', $data); 

現在的問題...

什麼是這些「時髦」小頁的特定類的最佳方法不與數據庫交互?在這個例子中,我使用模型存儲小類,並且在某些情況下,可能會在模型類中添加其他方法來做時髦的事情。 這是一個很好的做法嗎?或者圖書館和時髦類都應該進入模型內部,以便控制器更加瘦(但是模型可能在其他地方使用,而不需要會話和funkiness)?

+0

什麼是「時髦的東西」在做什麼?它是數學轉換嗎?計算佈局?將過去的迴應與潛在的未來回應聯繫起來 – wallyk

+0

好吧,一個例子可能是「funky」是一個類,用於根據用於過濾數據網格(模型)的傳遞參數創建一組時髦表單輸入。 – prograhammer

+0

另一個值得關注的問題是:有時候控制器會調用如此多的庫和模型,並在控制器本身看起來像一個模型,處理大量的業務邏輯之間傳遞東西。 – prograhammer

回答

2

我會用一個幫手。

  • 加載助手時,該函數將在全局範圍內可用,因此您可以在任何地方調用它。
  • 他們是偉大的小,單機是隻做一兩件事,不一定涉及到代碼中的模型或庫
  • 助手轉換一種格式或另一種之間的事情時(slugify尤其是對我的Excel函數, convert_timezone,change_query_string)或做的小任務,你不想去想(force_ssl,is_image,uri_string)

funkify()好像,可能會阻止很多重複的代碼適當的輔助功能。

下面是對他們的笨文檔頁面:http://ellislab.com/codeigniter/user-guide/general/helpers.html

如果你在一個情況下輔助功能是如此具體會在一個地方只使用的時候,你仍然可以使用的輔助工具。例如,在控制器後命名助手,例如page_helper.php

page_helper.php

function funkify($params) { 
    // do funky stuff 
    return $funky_params; 
} 

然後在你的控制器:

class Page extends CI_Controller { 
    public function __construct() { 
     parent::__construct(); 
     $this->load->helper('page'); 
    } 

    public function page() { 
     // do stuff 
     $funky_params = funkify($params); 
     // do more stuff 
     $this->load->view('blue/page', $data); 
    } 

我沒有任何藉口,但有時如果我在一個情況下,我需要一個剃刀特定的功能,將只能在一個位置(比如說一個控制器)上使用,我會把它放在控制器的文件中。您可以在類定義之外粘貼一個函數,它將像助手一樣工作,並且可以全局使用(只要該控制器已加載)。您還可以在視圖內定義函數。 Yucky,但可能。我不喜歡經常這樣做,因爲這是不尋常的,並非預期的(由我自己或其他開發人員)

+0

是的,我想我最終決定的只是將它們作爲附加方法添加到特定於頁面的模型中(我發現每個頁面都有模型,但我也有一些「核心」模型可供我的頁面特定模型使用)。但如果我稍後改變主意並認爲它們更可重用,那麼我將它們轉換爲助手。讓我給你一個投票,知道我和其他人的MVC方法相距甚遠是有幫助的。 – prograhammer

+0

我認爲真正的缺點是,框架在組織事物方面做得很好,但是沒有提供如何使用該組織的真實世界的示例。所有類型的事情都可能是灰色區域,比如:具有大量HTML輸出的模型,與要查詢的數據緊密結合,無法放入視圖for-loop或大量頁面特定幫助程序需要放在一個普遍的地方,但應該與用於構建頁面的模型一起使用,或者如何最好地保持那些控制器的瘦身或者所有那些javascript/jquery/ajax。 – prograhammer

+0

Darunada ...如果你擴展你的好答案一點,包括你做的非常頁面特定的「幫手」的情況,這將不會重複許多其他地方,我會繼續並接受它作爲答案。 – prograhammer

相關問題