2012-09-21 5 views
3

CakePHP의 컨트롤러가 URL로 액세스 할 수없는 개인 기능을 포함하지 않아야하는지 궁금합니다. 컨트롤러가 CakePHP에서 개인 기능을 사용하지 않아야합니까?

때때로 같은 와 같은 일부 기능은 또는 내가 그들을 분할하는 것을 선호 너무 클 수 있습니다을 삭제 추가 할 수 있습니다. 컨트롤러에서 비공개로 설정하는 대신 모델에 함수를 넣어야합니까?

감사합니다.

+0

당신은 개인적인 방법을 사용할 필요가 없습니다. 대신 protected를 사용하십시오. 프레임 워크 컨텍스트에서는 모든 클래스가 언젠가는 확장 될 수 있기 때문에 어느 시점에서 sth를 비공개로 만드는 것은 의미가 없습니다. 그러나 컨트롤러 내부의 보호 된 메소드는 꽤 일반적입니다. – mark

답변

4

예. 모델에 메서드를 보관하는 것이 가장 좋습니다. 당신 자신이 코멘트에서 언급 한 것처럼, "모델을 뚱뚱하고 컨트롤러를 얇게"유지하십시오. 컨트롤러는 모델과 뷰를 상호 작용하는 매개체 일뿐입니다.

데이터 소스, 테이블의 변경 사항을 처리해야하는 경우 문제가 발생합니다. 컨트롤러가 뚱뚱한 경우 필드를 사방에 사용했을 것입니다. 이제는 전체 설정을 정리하지 않아도 될 장소에서 정리할 수 있습니다.

모델의 다른 장점은 모델을 호출하고 코드를 다시 사용할 수 있다는 것입니다. 예 :

class User extends AppModel { 

    public function getAllActiveUsers() { 
     // return active users 
    } 

} 

위의 방법은 사용자와 관련된 모델 및 컨트롤러의 다른 모든 방법으로 액세스 할 수 있습니다.

다른 곳에서 이러한 기능이 필요하고 User 모델에서 정의하지 않은 경우 컨트롤러로 리디렉션되거나 결국 전체 로직을 다시 작성하게됩니다.

리다이렉트하는 것은 그렇게 나쁘지는 않지만 다른 곳에서 로직을 다시 작성하고 ActiveUsers의 구현을 변경하면 어디서든 수정하게 될 것입니다.

그러나 컨트롤러에는 몇 가지 작업을 수행해야합니다. 예를 들어, 가까운 거리에 대해 사용자의 Geolocation과 모든 일치하는 레스토랑 간의 거리를 계산해야하는 경우 컨트롤러에서이 작업을 수행해야합니다. 하지만 컨트롤러가 얇게 유지되는 것이 가장 좋습니다.이 목적을 위해 구성 요소가 있습니다. 복잡하고 긴 로직을위한 사용자 정의 컴포넌트를 생성 할 수 있습니다.

+0

컨트롤러에 있어야하는 기능과 모델 내부에 있어야하는 기능을 구분하는 방법은 무엇입니까? – Alvaro

+0

글쎄, 삽입 또는 추출과 관련된 레코드와 관련된 모든 작업은 삽입 및 추출과 관련된 사전 및 사후 로직을 포함하는 모델에 포함됩니다. 다른 모델을 포함 할 수도있는 데이터의 해석/계산 같은 것들은 컨트롤러에 보관하는 것이 가장 좋습니다. "컨트롤러는 뷰에 데이터를 표시합니다." 제어 흐름 방법은 컨트롤러에 있어야합니다. 인증과 같은 것들. 제 3 자와 이메일, 다른 API 또는 API 열기와 상호 작용하는 메소드. –

+0

그래서, URL에서 액세스 할 수없는 개인 (또는 보호 된) 함수를 컨트롤러에서 사용하는 것은 잘못된 것이 아닙니다. (그들은 단지 데이터를 가지고 어떤 모델도 가지고 있지 않다면) – Alvaro

-2

아니요. CakePHP는 프레임 워크이므로 재사용 가능한 로직 비트에 대해 개인 기능을 만들 수 있습니다. 그것은 아마도 권장됩니다.

+0

다운 - 투표의 이유가 인정 될 것입니다. –

1

모델에 하위 수준 기능을 추가했습니다. 특히이 기능을 여러 컨트롤러에서 사용할 수있는 경우. "저급"이란 가능한 한 모델 데이터에 가까운 것을 의미합니다. 데이터에 대한 뷰 특정 수정을 수행하거나 다른 모델의 데이터와 결합하는 경우 (관련 모델은 예외 임) 해당 함수는 모델에 속하지 않습니다.

또한 컨트롤러 함수 앞에 밑줄을 붙이면 URL을 통해 사용할 수 없습니다.

1

데이터베이스에서 항목을 추가하고 제거하는 논리는 도메인 비즈니스 논리의 일부입니다. 이러한 메소드는 모델 계층의 일부 여야합니다.

CakePHP의 구현이 매우 제한되어 있기 때문에 당신이 도우미의 일종으로 그 방법을 이동하거나 AppModel에서 상속하지 않는 별도의 "모델"을 사용할 수 있습니다, (그것은 그 모델 층은 액티브 레코드 인스턴스의 모음입니다 척) .대신 이러한 구조는 도메인 비즈니스 로직과 컨트롤러 (및 프리젠 테이션 레이어 전체)를 분리하는 서비스처럼 작동 할 수 있습니다.