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