J'ai une fonction dans mon contrôleur qui a pris plus de temps que je ne le souhaiterais et que je voudrais refactoriser pour appeler quelques fonctions discrètes pour le rendre plus facile à gérer. Comment puis-je mieux organiser une longue fonction dans un contrôleur Codeigniter?Comment refactoriser une fonction de contrôleur Codeigniter trop longue?
Ce que j'ai essayé:
Je sais que vous pouvez créer des fonctions privées dans un contrôleur en les nommant avec un underscore (_myfunc), mais les variables de la fonction sont hors de portée pour la appeler la fonction du contrôleur. Donc, vous devez retourner toutes les données nécessaires à partir de la fonction qui est un problème.
Est-ce la meilleure option pour gérer une fonction de contrôleur complexe? Existe-t-il un moyen plus simple où les variables peuvent toutes être globales à la classe de contrôleur comme une variable de membre de classe standard?
Suggestions? Merci d'avance!
EDIT: Quelqu'un a demandé le code alors j'ai ajouté le code pour le contrôleur géant ci-dessous. Une possibilité d'amélioration consiste à déplacer la logique dans les instructions de commutation vers des fonctions distinctes (suppression, prévisualisation, ordre, etc.). Mais j'essaie de décider de la prochaine étape après cela. Déplacer le gros code de configuration de validation dans sa propre fonction prendrait vraiment un peu de poids, mais où devrais-je le déplacer?
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);
}
Pourriez-vous poster la fonction du contrôleur pour nous de regarder? – robsymonds
Pourquoi ne pas laisser CI faire le routage du troisième segment au lieu d'utiliser une instruction switch? –
C'est un bon point - la raison pour laquelle je n'ai pas été le code avant que l'instruction switch ne s'applique à toutes les actions que l'instruction switch vérifie. Comment puis-je rendre la section avant le commutateur réutilisable si je divise l'instruction switch en fonctions séparées? Une fonction séparée serait hors de portée, n'est-ce pas? –