2010-01-12 73 views
1

編輯:結構CodeIgniter應用程序

使用CodeIgniter構造複雜應用程序的最佳方法是什麼?爲了使這個問題更具體,可能只關注結構化控制器:如果你有一個用戶控制器,那麼所有的功能都應該在這個文件中?換句話說,你可能有與特定視圖綁定的控制器動作,但也有一些輔助函數。

原始問題:給定一個複雜的應用程序,與用戶,交易,產品,是否有意義爲每個人都有一個控制器?並且由於每個這些對應於一個數據庫表,所以每個都有相應的模型?我認爲它確實,但我目前正在使用的應用程序包含一個3000線控制器和一個3000線模型。只是想驗證有關CI和應用程序結構的標準做法。

回答

3

我想在這裏分享我的應用程序結構。

我從模型開始。我爲mysql數據庫中的一個表編寫1個模型。我已經有MY_Model我放在system/application/libraries/文件夾中的課程。本課程有get_detail,get_list,get_total,get_all,insert,updatedelete方法。我存儲在一個變種表名,所以基本上我只需要在模型這個代碼,使其工作:

class Some_table_model extends MY_Model { 
    function Some_table_model() 
    { 
    $this->tablename = 'some_table'; 
    $this->primary_key = 'id'; 
    } 

} 

更新:經過一些項目,我已經添加了新的變種持有使用的列名爲表中的主鍵。這樣,通過在MY_Model中對主鍵的列名不進行硬編碼,我將具有更大的靈活性。

對於控制器,我根據用戶的使用情況創建它。一個產品的例子,我會有這個控制器:

function Product extends Controller { 
    function index() 
    { 
    //display product list, paginated 
    } 
    function admin() 
    { 
    //protected by session 
    //display product list for admin, paginated 
    //handle POST request to delete a product or products 
    } 
    function form() 
    { 
    //protected by session 
    //handle add/edit product for admin 
    } 
} 

查看與控制器有關。對於上述控制器,I將具有至少3視圖的文件:

product_list.php 
product_admin.php 
product_form.php 

視圖可以被放置在子目錄,例如,我可以這樣安排的:

system/application/views/front/product.php 
system/application/views/admin/product_list.php 
system/application/views/admin/product_form.php 

如果產品有類別,我需要另一個表和模型,但對於控制器,我可以把頁面產品控制器內部,通過添加類別到函數名稱:

function category_admin() 
{ 
    //get parameter 
    //... 
    //process data 
    //... 
    //redirect or load view 
    //... 
} 

function category_form() 
{ 
    //get parameter 
    //... 
    //process data 
    //... 
    //redirect or load view 
    //... 
} 

這就是我做的,這是爲我工作。希望這可以幫助你找到更好的方式來重構你的CodeIgniter的代碼。

+0

這是否假設你的所有主鍵都是'id'? – karlipoppins 2010-09-08 09:50:49

+0

最近我通過添加新的屬性$ primary_key來更新MY_Model。該屬性將保存表的主鍵列名稱,默認值爲'id'。通過這種方式,我可以靈活地處理使用'id'以外的列作爲主鍵的表,例如'country_id'。 – 2010-09-12 12:51:58

+1

大多數這是一個好主意,但我通常避免混合管理員代碼和前端代碼。儘管大部分數據交互會相同或相似,但您必須記住,控制器中的代碼越多,代碼越慢。 PHP不需要爲每個前端用戶解析所有不相關的管理代碼來查看您的網站。 – 2010-09-13 13:09:22

0

應該單獨控制器。但是如果您不使用路由器來更改它,控制器也會更改網址。

對於Model,我通常將1個控制器映射到1個模型,如果DB花費超過4行。

0

首先,模型肯定需要對分隔條件類似:

user_model: 
add_user(); 
delete_user(); 
... 

products: 
add_product(); 
delete_product(); 
... 

transaction: 
... 
... 

你應該明白我的意思。

控制器也可以做一些分離。在這種情況下我的控制器會。

products: 
add_product(); 
show_product(); 
get_product(); 
... 

users: 
add_user(); 
delete_user(); 
... 

等等。 在控制器和模型中重複相同功能的原因是,您可以輕鬆更改模型以訪問不同的數據庫/數據源,除此之外不需要更改。

此外,當您添加用戶時絕對不需要加載產品型號。

+1

在我的角度來看,一流的產品的方法並不需要‘_產品’,如$產品 - >添加()就足夠了,$產品 - > add_product()被重複自己。 – joetsuihk 2010-01-13 01:44:29

+0

我開始「_產品」公約很久以前的一個項目,我願意付出一切回去。它結束了很多額外的打字。 – Zack 2010-01-13 15:25:38

+0

你們都是絕對正確的。 – LukeP 2010-01-13 15:51:41

0

如果你真的關心項目的組織,你應該看看Matchbox

從火柴盒文檔:

火柴盒是一套擴展庫,可以讓您安排在小部件(模塊)應用程序。這些模塊有幾個優點,主要是便攜性。模塊存儲在他們自己的文件夾中,因此它們可以在其他應用程序中重用,或者通過複製該文件夾在用戶之間共享。

這可以讓你真正通過將相關模型和控制器在同一文件夾組織內容。