コントローラーの関数が思ったよりも長くなりました。管理しやすくするために、いくつかの個別の関数を呼び出すようにリファクタリングしたいと考えています。Codeigniter コントローラーで長い関数をより適切に整理するにはどうすればよいですか?
私が試したこと:
先頭にアンダースコア (_myfunc) を付けて名前を付けることで、コントローラー内にプライベート関数を作成できることはわかっていますが、関数内の変数は呼び出し元のコントローラー関数の範囲外です。そのため、面倒な関数から必要なすべてのデータを返す必要があります。
これは、複雑なコントローラー機能を管理するための最良のオプションですか? 標準クラスのメンバー変数のように、変数がすべてコントローラ クラスに対してグローバルになる簡単な方法はありますか?
提案?前もって感謝します!
編集:誰かがコードを要求したので、以下に巨大なコントローラーのコードを追加しました。改善の 1 つの機会は、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);
}