У меня есть функция в контроллере, которая выросла дольше, чем мне хотелось бы, и я хотел бы реорганизовать ее, чтобы вызвать несколько отдельных функций, чтобы упростить управление. Как лучше организовать длинную функцию в контроллере 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);
}