2014-09-15 2 views
0

정확히 모든 CakePHP Model 메소드가 인스턴스 메소드입니까?CakePHP 모델 : 왜 인스턴스 메소드입니까?

의 대신에
$post = $this->Post->findById($id); 

$post = Post::find($id); 

내가 인스턴스 메서드 것 모델 인스턴스 (또는 기록)에 근무하는 모든 방법, 예를 들어 생각 :

$post = ...; 
$post->publish(); // Would be $this->Post->publish($id) using Cake 

을 예를 들어 레코드의 전체 컬렉션에서 작동하는 레코드를 만들거나 찾는 모든 메서드는 클래스 메서드 (인스턴스 메서드)입니다 (예 :

).
$post = Post::findById($id); // Would be $this->Post->findById($id) using Cake 

$newPost = Post::create(['title' => 'My post', 'body' => '<p>...</p>']); 
// Would be $newPost = $this->Post->create([...]); using Cake 

이 케이크 규칙은 논리적 인 OOP 규칙에 위배된다고 생각합니다. 누구든지이 디자인의 이유를 알고 있습니까?

+2

각 모델마다 개별적인 설정이 필요하기 때문에 거의 확실합니다. 따라서 모델에서 이러한 설정을 저장할 상태를 유지하는 것이 좋습니다. 예를 들어 모델 관계 및 유효성 검사 규칙은 개별 모델간에 매우 가변적 인 일반적으로 사용되는 설정입니다. – Kai

+0

하지만 정적 변수는 어떻습니까? 예 : 클래스 게시 모델 확장 { static $ validations = array (...); 정적 $ belongsTo = '사용자'; } – user1065745

+0

정적 속성은 상속으로 덮어 쓸 수 없으며 물론 CakePHP의 모든 사용자 정의 모델은 Model에서 상속되므로 실제로 작동하지 않습니다. http://stackoverflow.com/questions/532754/inheritance-of-static-members-in-php – Kai

답변

2
  • 정적 전화 또는 싱글 톤은 종속성 주입을 사용하기 어렵게 만들고 코드를 테스트하기 어렵게 만듭니다. 당신은 단단히 결합 된 코드를 만들고 있습니다. loose coupling을 원합니다.
  • 모델을 연결을 통해 사용하면 새 인스턴스가 만들어 지므로 모델의 별칭 속성이있는 것입니다. 완전히 다른 행동을 다른 행동으로 묶거나 다른 방식으로 상태를 변경할 수 있습니다.
  • 속성과 메서드를 수정하고 오버로드하고 즉시 새 인스턴스를 만들려는 경우가 있습니다. 예 : 동일한 테이블의 두 개의 모델 인스턴스가 있지만 두 개의 DB에 쓰십시오. 예를 들어 로그인 한 사용자 또는 가상 호스트에 따라 DB 연결을 사용하는 응용 프로그램의 시나리오와 매우 유사합니다.
  • 당신 명확 모델을 확장하기 위해이 단지를 통해 가고 싶어하지 않습니다 Extending singletons in PHP

나는이 케이크 규칙은 논리적 OOP 규칙에 위배되는 생각합니다. 누구나이 디자인의 이유를 알고 있습니까?

당신이 묘사 한 것은 논리적이거나 우수하지 않습니다. 글쎄, 왜 이것을 "논리적 인 OOP 규칙"이라고 생각하는지 설명 할 수있는 몇 가지 링크를 제공 할 수 있습니다. 규칙은 없지만 design patterns입니다. A good 유스 케이스는 CakePHP의 "Utility"폴더 안에있는 클래스와 같은 "유틸리티"클래스입니다. 다중 인스턴스를 가질 필요가 없습니다.

뿐만 아니라 이러한 질문에 대한 링크를 참조하십시오 :

당신이 원하는 경우에 그 "모양"또는 "필요"생각 CakePHP 대신 Laravel을 사용하여 exce를 만들 수 있습니다. 거의 모든 것에 facade pattern을 사용합니다. 그러나 나는 이것이 당신의 코드를 더 좋게 만들지 않을 것이라고 당신에게 보증합니다.