2010-11-22 6 views
1
여기 좋아, 내 질문을 올

, 내 사용자 입력 예를 들어 컴퓨터가 나는 객체 레코드를 만들 때 DRY : 코드를 중복하지 않는 방법에 대한 조언?

+-------------+ +------------+ +-----------+ 
+ Object  + + car  + + computer + 
+-------------+ +------------+ +-----------+ 
+ id   + + object_id + + object_id + 
+ some_col + + max_speed + + CPU_speed + 
+ type  + + n_gears + + memory + 
+-------------+ +------------+ +-----------+ 

그래서 요약하기 등의 기법을 사용하여 데이터베이스를 가지고, 그것으로 모든 공유 필드를 저장하고 내가 만든 저장되는 컴퓨터에 대한 모든 특정 데이터가있는 컴퓨터 기록.

지금까지 모든 작업 (및 각 유형의 개체에 대한 컨트롤러 메서드보기)을 복제해야하므로 내 문제가 발생했습니다. 그래서 지금 내 컨트롤러에서 나는 이러한 작업이 :

+ new-car 
    + new-computer 
    + show-car 
    + show-computer 
    + edit-car 
    + edit-computer 
    + list-car 
    + list-computer 

각 유형에 대해 나는 기본적으로 모든 코드를 복제 그래서 및 코드 몇 줄을 변경 (예 : 컴퓨터 매퍼에 의해 자동차 매퍼를 대체 기록 개체에 대한 동일) . 나는 여러분에게 zend 프레임 워크를 언급하고 PHP에있다.

나는 "자신을 반복하지 말고"모든 코드를 복제 할 필요가없는 무언가를하고 싶습니다. 어떤 생각을 더 우아하게하는 방법?

+0

-object, 개체가 디렉토리 경로와 같은 환경에 의해 결정되는 경우 또는 메서드의 매개 변수로 전달할 때 – ajreal

+0

@AJreal은 컨트롤러 동작이며, 실제로는 나는 내 컨트롤러에 개인 메소드를 만들고 PHP 마법 ($ className = 'Application_Model_')을 사용하여 일종의 템플릿 함수를 만들려고한다. $ object_type; $ o = 새 $ className(); – RageZ

답변

2

기본 CRUD 클래스를 알려 드리겠습니다. 있는 그대로 공급됩니다. 직접 시험 해봐.

만들기 ...)

+0

누가 영어가 아닌 방식으로 메서드 이름을 씁니까? – raveren

+1

@Raveren, 누구가 질문을 질문합니까? –

+1

모국어를 사용하는 것이 좋다고 생각하는 학업 환경 (학사 학위 논문의 일부)을 위해 수업을 작성한 사람.나는 그렇게 생각하지 않는다. 그러나 나는 나의 마지막 시험의 시간에 단지이 오랜 시간의 관습들을 바꿀 의도가 없다 : D –

1

각 유형의 객체에 대한 정보, 예를 들어 어떤 필드가 있는지, 각 필드를 표시하는 방법 (예 : 입력 또는 선택), 그 순서와 같은 정보로 메타 테이블을 만들어야합니다.

그런 다음 주체 컨트롤러에 액세스하여 개체 이름 만 전달하면 적절한 CRUD 양식을 생성해야합니다.

+0

그래서 개인적인 방법이있어서 행동에 사용합니다. 예를 들어 개인 함수 _list ($ object_type). 그리고 당신의 행동에서 $ this -> _ list ('car'); 내가 맞습니까? – RageZ

+0

네, 유효한 패턴 중 하나입니다. '_list' 메쏘드는 아이템 목록을 보여주고 그리는 데 필요한 컬럼 정보를 가져옵니다. – raveren

1

나는 토마스 Fejfar 비슷한 않았다;이 도움이

<?php 
class FunkceController extends Controller_Crud 
{ 
    protected $_url = '/admin/funkce/'; 
    protected $_modelClass = 'Admin_Functions'; 
    protected $_formClass = 'Form_Admin_Functions'; 
    protected $_filterFormClass = 'Form_Admin_FilterFunctions'; 
    protected $_viewKey = 'funkce'; 
    protected $_title = 'Funkce'; 
} 

희망 : 다음

<?php 
abstract class Controller_Crud extends Controller 
{ 
/* definované v dalších třídách */ 
protected $_viewKey = ''; 
protected $_url = 'admin/'; 
protected $_modelClass; 
protected $_formClass; 
protected $_filterFormClass = null; 
protected $_title = 'Untitled'; 

/* pro vnitřní potřebu */ 
protected $_model; 
protected $_form; 
protected $_filterForm; 
private $_defaultViewKey = 'crud'; 

/* 
* Inicializace třídy, vytvoření instancí modelů a formulářů 
* @see Tul/Controller/Tul_Controller_Admin#init() 
*/ 
public function init() 
{ 
    parent::init(); 
    $this->_model = new $this->_modelClass(); 
    $this->_form = new $this->_formClass(); 
    $this->view->indexUrl = $this->_url; 
    $this->view->viewKey = $this->_viewKey; 
    $this->view->title = $this->_title; 
} 

public function postDispatch() 
{ 
    // Po provedení akce je nastaven titlek 
    $this->view->headTitle($this->_title); 
} 
/** 
* základní akce zabezpečující výpis záznamů a filtrování 
* @return void 
*/ 
public function indexAction() 
{ 
    if(null !== $this->_filterFormClass){ 
     $this->_filterForm = new $this->_filterFormClass; 
    } 
    $filter = null; 
    if(null !== $this->_filterFormClass){ 
     if($this->_getParam('filter') && $this->_filterForm->isValid($this->_getAllParams())){ 
      $filter = $this->_filterForm->getValues(); 
     } 
     $this->_filterForm->populate($this->_getAllParams()); 

    } 
    /* @var Tul_Paginator */ 
    $paginator = $this->_model->getAllPaginator($filter); 
    $paginator->setCurrentPageNumber($this->_getParam('page',1)); 
    $this->view->data = $paginator; 
    $this->view->form = $this->_filterForm; 
} 

/* 
* Načte ID záznamu a pokud není nalezeno přesměruje s chybovou hláškou na hlavní stránku 
* @see Tul/Controller/Tul_Controller_Admin#getId() 
*/ 
public function getId() 
{ 
    $id = $this->_getParam('id', false); 
    if(false === $id){ 
     $this->addFlashMessage('error','Neplatné ID.'); 
     $this->_gotoUrl($this->_url); 
    } 
    return $id; 
} 

/** 
* akce pro přidání nového záznamu 
* @return void 
*/ 
public function pridatAction() 
{ 
    $this->view->headTitle('Přidat'); 
    if ($this->_request->isPost()) { 
     if ($this->_form->isValid($_POST)) { 
      $data = $this->_form->getValues(); 
      try { 
       $this->_beforeAdd($data); 
       $result = $this->_model->insert($data); 
       $this->_afterAdd($data, $result); 
       $this->addFlashMessage('success','Úspěšně přidáno. '); 
      } catch (Exception $e){ 
       $this->addFlashMessage('error','Došlo k chybě při přidávání:<br />' . htmlspecialchars($e->getMessage())); 
      } 
      $this->_gotoUrl($this->_url); 
     } else { 
      $this->_form->populate($_POST); 
     } 
    } 
    $this->view->form = $this->_form; 
    $this->_renderView('pridat.phtml'); 
} 

/** 
* Akce pro smazání záznamu 
* @return void 
*/ 
public function smazatAction() 
{ 
    $id = $this->getId(); 
    try{ 
     $this->_beforeDelete($id); 
     $result = $this->_model->delete($this->_model->quoteInto('id = ?',$id)); 
     $this->_afterDelete($id, $result); 
     $this->addFlashMessage('success','Úspěšně smazáno. '); 
    } catch (Exception $e){ 
     $this->addFlashMessage('error','Došlo k chybě při mazání:<br />'.htmlspecialchars($e->getMessage())); 
    } 
    $this->_gotoUrl($this->_url); 
} 

/** 
* akce pro úpravu záznamu 
* @return void 
*/ 
public function upravitAction() 
{ 
    $this->view->headTitle('Upravit'); 
    $id = $this->getId(); 
    $item = $this->_model->getById($id); 
    if ($this->_request->isPost()) { 
     if ($this->_form->isValid($_POST)) { 
      $data = $this->_form->getValues(); 
      try { 
       $this->_beforeUpdate($data, $item); 
       $result = $this->_model->update($data, $this->_model->quoteInto('id = ?',$id)); 
       $this->_afterUpdate($data, $result); 
       $this->addFlashMessage('success','Úspěšně upraveno. '); 
      } catch (Exception $e){ 
       $this->addFlashMessage('error','Došlo k chybě při úpravě:<br />'.htmlspecialchars($e->getMessage())); 
      } 
      $this->_gotoUrl($this->_url); 
     } else { 
      $this->_form->populate($_POST); 
     } 
    } else { 
     $this->_form->populate((array)$item); 
    } 
    $this->view->form = $this->_form; 
    $this->_renderView('upravit.phtml'); 
} 

/** 
* Pokud existuje načte pohled zděděné třídy, pokud neexistuje použije interní 
* @param $name string název pohledu 
* @return void 
*/ 
private function _renderView($name) 
{ 
    $completeName = $this->_viewKey . '/' . $name; 
    /* @var Zend_View_Abstract */ 
    foreach ($this->view->getScriptPaths() as $dir) { 
     if (is_readable($dir . $completeName)) { 
      return $this->renderScript($completeName); 
     } 
    } 
    return $this->renderScript($this->_defaultViewKey . '/' . $name); 
} 

/** 
* Metoda, která je zavolaná těsně před přidáním záznamu. 
* Umožňuje upravit data podle potřeby před vložením do databáze. 
* Vyhozením vyjímky přidání záznamu skončí chybou 
* @param $data array data, která budou přidána 
* @return void 
*/ 
protected function _beforeAdd(&$data){} 
/** 
* Metoda, která je zavolaná těsně po přidání záznamu. 
* Umožňuje upravit data podle potřeby ještě po vložení do databáze. 
* Vyhozením vyjímky přidání záznamu skončí chybou 
* @param $data array data, která budou přidána 
* @param $result mixed primární klíč přidaného záznamu 
* @return void 
*/ 
protected function _afterAdd(&$data, $result){} 
/** 
* Metoda, která je zavolaná těsně před úpravou záznamu. 
* Umožňuje upravit data podle potřeby ještě před úpravou v databázi. 
* Vyhozením vyjímky uprava záznamu skončí chybou 
* @param $data array data, která budou upravena 
* @param $item mixed původní data 
* @return void 
*/ 
protected function _beforeUpdate(&$data,$item){} 
/** 
* Metoda, která je zavolaná těsně po úpravě záznamu. 
* Umožňuje upravit data podle potřeby po úpravě v databázi. 
* Vyhozením vyjímky uprava záznamu skončí chybou 
* @param $data array data, která budou upravena 
* @param $result integer počet ovlivněných záznamů 
* @return void 
*/ 
protected function _afterUpdate(&$data,$result){} 
/** 
* Metoda, která je zavolána před smazáním záznamu. 
* Vyhozením vyjímky smazání záznamu skončí chybou 
* @param $id id mazaného záznamu 
* @return void 
*/ 
protected function _beforeDelete($id){} 
/** 
* Metoda, která je zavolána po smazání záznamu. 
* Vyhozením vyjímky smazání záznamu skončí chybou 
* @param $id id mazaného záznamu 
* @param $result počet smazaných řádků 
* @return void 
*/ 
protected function _afterDelete($id, $result){} 

} 

과) 구체적인 구현, 일부 버그가있을 수 있습니다 기본 CRUD 컨트롤러 및 CRUD 메서드가있는 기본 모델 클래스가 있습니다. 기본 CRUD 템플릿의 모든 콘텐츠 유형에 사용할 수있는 일반보기 스크립트를 사용할 수도 있습니다.

각 컨트롤러에는 필요한 부분을 변경하기 위해 상단에 몇 개의 변수 만 있으면됩니다.

관련 문제