我在我的控制器中有一個函數,它比我更喜歡的時間長了,我想重構它來調用一些離散函數,使它更容易管理。如何在Codeigniter控制器中更好地組織長功能?如何重構Codeigniter控制器功能太長?
我已經試過:
我知道你可以通過與領先的下劃線(_Myfunc)命名他們創建一個控制器專用的功能,但隨後在該函數的變量超出範圍的調用控制器功能。所以你必須從函數返回所有需要的數據,這是一個麻煩。
這是管理複雜控制器功能的最佳選擇嗎?是否有一種更簡單的方法,其中的變量可能全都是控制器類的全局變量,如標準類成員變量?
對此提出建議?提前致謝!
編輯:有人要求代碼,所以我在下面添加了巨型控制器的代碼。一個改進的機會是將switch語句中的邏輯移到單獨的函數中(刪除,預覽,排序等)。但是我想在此之後決定下一步。將大的驗證設置代碼移動到它自己的函數中真的需要一些權重,但我應該在哪裏移動它?
function categories() {
$this->load->library('upload');
$this->load->model('categories_m');
$this->load->model('products_m');
$this->load->model('pages_m');
$this->load->model('backoffice/backofficecategories_m');
$data['body'] = $this->load->view('backoffice/categories/navigation_v', '', TRUE);
$data['cat_tree'] = $this->categories_m->getCategoryTree();
$data['page_list'] = $this->pages_m->getPageList();
$data['category_dropdown'] = $this->load->view('backoffice/categories/category_dropdown_v',$data,TRUE);
switch ($this->uri->segment(3)) { //display views based on parameter in URL.
case 'delete':
$categoryTreeID = $this->sitewide_m->checkURLParam($this->uri->segment(4),'CategoryTree'); //if parameter is in URL, show 404 if invalid parameter is passed. Otherwise, set variable known to be safe.
if (isset($_POST['delete'])) {
$this->backofficecategories_m->deleteCategory($categoryTreeID);
$data['body'] .= '<span class="error">Category Deleted.</span>';
} else {
$data['cat_details'] = $this->categories_m->getCategoryDetails('',$categoryTreeID);
$data['parent_category'] = $this->categories_m->getParentCategory($categoryTreeID);
$data['products_to_reassign'] = $this->products_m->getProductsInCategory('',$categoryTreeID);
$data['body'] .= $this->load->view('backoffice/categories/delete_v',$data,TRUE); //pull fresh category tree data since tree was just updated.
}
break;
case 'preview':
if ($this->uri->segment(4)) $data['categoryTreeID'] = $this->sitewide_m->checkURLParam($this->uri->segment(4),'CategoryTree'); //if parameter is in URL, show 404 if invalid parameter is passed. Otherwise, set variable known to be safe.
$data['cat_details'] = $this->categories_m->getCategoryDetails(NULL,$data['categoryTreeID']); //get category ID being edited from the URL and store it. Returns false if category ID isn't found.
foreach ($data['cat_details']->result() as $detail) {
$data['categoryName'] = $detail->Name;
$data['categoryID'] = $detail->ID;
}
$data['body'] .= $this->load->view('backoffice/categories/preview_v', $data, TRUE);
break;
...cases continue...
default:
$this->load->library('table');
$data['body'] .= $this->load->view('backoffice/categories/categories_v', $data, TRUE);
break;
}
$this->load->view('backoffice/template_v',$data);
}
你可以發佈控制器功能供我們看看嗎? – robsymonds 2009-02-10 14:18:45
爲什麼你不讓CI做第三段的路由而不是使用switch語句? – 2009-02-10 15:33:59
這是一個很好的觀點 - 我之前沒有的理由是switch語句之前的代碼適用於switch語句正在檢查的所有操作。如果將switch語句拆分爲單獨的函數,如何才能在交換機可重用之前創建該部分?一個單獨的功能將超出範圍,對吧? – 2009-02-10 16:07:57