2014-03-29 8 views
0

나는 노드라고 불리는 것들을 가지고 있는데 그들 사이에 HABTM과 관련이있다. 각 개별 관계는 프런트 엔드에서 사용자가 지정합니다.CakePHP의 아키텍처에 예비 코드를 넣을 수있는 정확한 위치는 어디입니까?

새 노드를 생성, 프런트 엔드 UI는의 형태로 데이터를 전송 :

나는이를 저장하기 전에 데이터베이스에서 자신의 ID에 필요한 노드의 제목을 해결해야
$exampleData = [ 
    'Node' => [ 
    'title' => 'The title of a new node', 
    'body' => 'The body of a new node'], 
    'NodeRequireNode' => [ // This is the HABTM-relation 
    0 => [ 
     'title' => 'The title of a required node'], 
    1 => [ 
     'title' => 'The title of another required node']]; 

관계. 즉, 다음과 같은 데이터가 필요합니다.

$exampleData = [ 
    'Node' => [ 
    'title' => 'The title of a new node', 
    'body' => 'The body of a new node'], 
    'NodeRequireNode' => [ // This is the HABTM-relation 
    0 => [ 
     'required_id' => 34], 
    1 => [ 
     'required_id' => 82]]; 

두 개의 노드가 같은 제목을 가질 수는 없으므로 이것은 안전하게 가능합니다. 문제는이 결의를 어디에서해야합니까?

은 처음에는 내 NodesController에 그것을했다 : 그것은 긴 방법을 생성하기 때문에이 좋아하지 않았다

// app/Controller/NodesController.php 

public function add() { 
    if ($this->request->is('post')) { 
    $data = $this->request->data; 

    $thereExistRequiredNodes = (count($data['NodeRequiringNode']) > 0); 
    if ($thereExistRequiredNodes) { 
     // Some long, clumsy code to do the thing. Removed for brevity. 
    } 

    $this->Node->create(); 
    $this->Node->saveAssociated($data) 
    } 
} 

. 간단히 헬퍼 메소드로 분해하는 것을 간단하게 생각했지만 컨트롤러를 얇게 만들고 모델을 뚱뚱하게 만들어야한다고 읽었습니다.

// app/Model/NodeRequiringNode.php 

// This method takes care of a couple forms the data might come in, relying on 
// the protected method beneath it to do the actual work. 
public function prepareRequiredNodesWithTitlesForSave($requiredNodes) {  
    if(isset($requiredNodes['title'])) { 
    $requiredNodes = $this->_prepareRequiredNodeWithTitleForSave($requiredNodes); 
    } elseif (isset($requiredNodes[0])) { 
    foreach ($requiredNodes as $index => &$requiredNode) { 
     $requiredNode = $this->_prepareRequiredNodeWithTitleForSave($requiredNode); 
    } 
    } 

    return $requiredNodes; 
} 

protected function _prepareRequiredNodeWithTitleForSave($requiredNode) { 
    $title = $requiredNode['title']; 
    unset($requiredNode['title']); 

    $conditions = ['title =' => $title]; 
    $required_id = $this->Node->field(// This line is a problem 
    'id', 
    $conditions); 

    $requiredNode['required_id'] = $required_id; 

    return $requiredNode; 
} 

이 더 나은 것 같다,하지만 그것은 작동하지 않습니다 그래서 대신 내 NodeRequiringNode 모델로 해결 코드를 리팩토링했습니다. 위에 표시된 행은 Nodes 모델을 사용하려고 시도합니다.이 모델은 NodeRequiringNode 모델에서 사용할 수없는 것 같습니다.

그래서 지금은 혼란 스럽습니다. 컨트롤러가 비즈니스 논리에 중점을 두는 동안 제목을 ID로 해결하는 작업은 청소 작업처럼 보입니다. 그러나 모델 객체는 다른 모델에서 데이터를 가져와야하기 때문에 모델 객체에서 수행 할 수 없습니다. 컨트롤러에서만 수행해야하는 작업입니다.

그렇다면 프로그램의이 부분을 어떻게 구성해야합니까? 특히 이것은 CakePHP의 영역에 있습니다. 은 일반적으로 MVC가 아닙니다.

답변

0

내게 컨트롤러에 대한 호출처럼 보이지 않습니다. 실제로 컨트롤러에 액세스하려하지 않고 Model::field()에 대한 호출처럼 보이지만 다른 모델입니까?

분명히 모델은 관련되어 있습니다. 이해하는 한 Node HABTM Node입니다. NodeRequireNode은 연결의 별칭입니까?

어쨌든, 모델들이 서로 관련되어있어 서로 액세스한다는 것은 완벽하므로 CakePHP가 관련 모델에 대한 참조로 적절한 속성을 자동으로 생성합니다. 즉 CakePHP에서 작동하는 방법입니다.

가능하면 제목 대신 ID를 전달하도록 프론트 엔드를 변경 했으므로 (양식 도우미가 제공 한 CakePHP 자동 매직이 btw에서 어떻게 작동하는지), 그러나 제목을 해결해야하는 경우 모델은 실제로 자체를 해결하고 있으므로 Node 모델에서 beforeSave() 및/또는 beforeValidate() (유효성 검사에 ID가 필요한 경우) 콜백 또는 사용자 지정 또는 재정의 된 저장 방법으로 데이터를 올바르게 준비 할 수 있습니다. 코멘트에 추가 질문에 대해서는

갱신는 - 나는 그것이, 표준이 얼마나 100 % 확실하지 않다, 그러나의는 아니, 관련 모델 참조 모델 만 만들어집니다 가정 해 봅시다.모델을 컨트롤러에로드 할 때 (명시 적으로 loadModel()을 사용하든 CakePHP 자동 마술을 사용하든) 특정 모델에 대한 참조 만 만들어집니다 (모델 자체에서 관련 모델에 대한 참조가 유지됩니다).

가 나는 모델 : 필드를 사용하고, 네 말이 맞아도 http://book.cakephp.org/2.0/en/models.html#understanding-models

+0

()를 참조하십시오. 그리고 협회에 대한 이해가 옳습니다. 세번째 단락 - CakePHP는 컨트롤러 객체뿐 아니라 모델 객체의 관련 모델에 대한 참조를 생성 할 예정입니까? 모델 개체에서 다른 모델에 액세스하려고합니다. 언급 한 콜백 메서드를 자세히 살펴보고 UI에 해상도를 적용하는 방법을 고려해 보겠습니다. 그것 역시 가능합니다. 위 질문에 대한 답변을 편집 할 수 있다면 귀하의 답변을 수락 한 것으로 표시하겠습니다. – DanielF

+0

나는 내 대답 @DanielF를 업데이트했습니다. – ndm

관련 문제