Nasıl çok uzun bir Codeigniter denetleyici işlevi refactor mı?

7 Cevap php

Ben tercih ederim ve ben daha kolay yönetebilmek için birkaç ayrık fonksiyonları çağırmak için refactor istiyorum daha uzun büyüdü benim denetleyicisi bir işlevi var. Nasıl daha iyi bir Codeigniter denetleyicisi uzun bir işlevi organize edebilir?

What I've tried:

Ben bir lider çizgi (_myfunc) ile onları adlandırma bir denetleyicisi özel işlevler oluşturmak biliyorum, ama sonra işlevi değişkenler çağıran denetleyici fonksiyonunun kapsamı dışındadır. Yani bir güçlük işlevi tüm gerekli verileri geri dönmek zorunda.

Bu karmaşık bir denetleyici işlevi yönetmek için en iyi seçenek mi? Değişkenler tüm standart sınıf üye değişkeni gibi denetleyici sınıfına küresel olabileceğini daha kolay bir yolu var mı?

Önerileriniz? Şimdiden teşekkürler!

EDIT: Birisi bu yüzden aşağıdaki dev denetleyici için kod eklendi kodunu istedi. Iyileştirilmesi için bir fırsat (, vb önizleme, sipariş, silme) ayrı işlevleri switch ifadeleri mantık hareket etmektir. Ama bundan sonra bir sonraki adıma karar çalışıyorum. O kendi işlevi büyük doğrulama kurulum kodunu hareket gerçekten biraz kilo almak istiyorum, ama nereye hareket etmelidir?

    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);		
}

7 Cevap

Kodu baktığımızda, birkaç eylemler için bir yöntem kullanıyor. Ben her eylem kendi yöntemi yapmak istiyorum. Ortak kaynaklar sınıf üyeleri ve kurucu yüklenen olabilir.

Yani bunun yerine "category_controller / eklemek" için url değişebilir "your_controller / kategoriler / add" ve her eylem için bir yöntem var gibi bir url. Eğer adresler değiştirmek istemiyorsanız, o zaman bir yolu kullanın:

$route['your_controller/categories/(.*)'] = 'your_controller/$1';

Eğer modeller kullanıyor musunuz? Kod ateşleyici bu zorlamak, ancak denetçi ve görünümlerin yanı sıra modelleri kullanarak daha kısa bir denetleyici işlevi için iyi bir yoldur değil. Alternatif olarak, ithal, sonra kendi yardımcısı olarak bazı fonksiyonları yer olabilir.

Eğer tüm kurucu için bazı varsayılan değerler ayarlamak istiyorsanız eğer, sınıf kurucu kullanabilirsiniz. Bu burada belirtilmiştir:

http://codeigniter.com/user_guide/general/controllers.html#constructors

A Service Layer yardımcı olacaktır.

CodeIgniter'daki denetleyicisi _remap () fonksiyonu içine bakarak deneyin.

Eğer _remap işlevi ortak kod tutmak, ve sonra vb güncelleme, silme için _remap içinde herhangi başka bir işlevi çağırabilirsiniz kullanarak (uri_segment dayalı (3)).

Şahsen ben bir tek denetleyicisi yöntemi ile çok fazla yaptığını düşünüyorum. Ben yapacağını ilk şeylerden biri ayrı yöntemleri gibi işlevleri (Oku Güncelle Sil oluşturma) ve CRUD ayrı olduğunu. Örneğin, örnek "kategoriler" ile çalışmak için neden ayrı bir "kategoriler" kontrolörüne sahip değil mi?

class Categories extends Controller
{
  function __construct()
  {
    parent::Controller();
  }

  function index() 
  {
    //display logic/code here
  }

  function edit()
  {
    //get the category to update from the post or url for editing
    //do the editing, etc
  }

  function delete()
  {
    //delete the category
  }

  function add()
  {
    //create the new category
  }
}

Sizin URL'ler kategoriler denetleyicisi başvurur:

http://www.example.com/categories/edit http://www.example.com/categories/delete etc.

Ben öneririm ikinci şey CodeIgniter 1.7.1 yükseltiliyor - güncellenmiş form_validation Kütüphane kolay ayrı bir yapılandırma dosyasına doğrulama kuralları tüm hareket yapar.

PHP hangi sürümü kullanıyorsunuz? PHP 5 gerçek OO desteği vardır, bu nedenle tercüman tarafından bu şekilde muamele edilecek özel bir işlevi bildirebilirsiniz:

private function foo(){
...
}

Eğer sınıf (çocuk sınıflar) genişletmek sınıfları değiştirin private ile, işlevine erişimi olmasını istiyorsanız protected.

Ben özel problem alanı ile size yardımcı olamaz korkuyorum o yüzden CodeIgnniter hiç kullanmadım. Ancak, uzun büyümüş bir işlev üstlenmeden ortak çözümleri ile, çok yaygın bir sorundur. Martin Fowler iyi kabul edilmektedir konuyla ilgili bazı kitaplar yazılmış olan bir akıllı bir adam olduğunu, bu nedenle birini bulabilirsiniz eğer görebilirsiniz his books. Eğer üstlenmeden başlamak için çevrimiçi Derslikler da vardır.

Bir kütüphanede ortak fonksiyonları koymak ve bunu diyebiliriz.