2011-08-19 9 views
1

모든 기능이 동일한 모델 피어 클래스 그룹이 있습니다. 그룹에 새 클래스를 추가 할 때마다 각각을 복사하여 붙여 넣는 것이 아니라 모델 피어 클래스가 확장하는 클래스에 함수를 추가하는 것이 좋습니다. 불행하게도, 모델 피어 클래스가 BaseModelPeer과 같은 Base 클래스에서 확장되었으므로 불가능합니다.Propel의 다중 기본 클래스에 기능 추가

Propel 1.5에는 basePeer 속성이 추가되어 있습니다.이 속성을 사용하면 BaseModelPeer을 특정 클래스에서 확장 할 수 있습니다. 그러나 기본적으로 BaseModelPeer 클래스는 확장되지 않습니다. 대신, 함수에 대한 서명이 다른 BasePeer 클래스에 대한 모든 호출을 수행합니다. basePeer 속성을 변경하면 BaseModelPeer이 새 클래스에서 확장되어 NewBasePeer으로 전화하고 BasePeer으로 전화를 NewBasePeer으로 변경합니다. 시그니처가 다르기 때문에 이것이 단지 붕괴되도록합니다!

실제로 Symfony의 Zend Lucene tutorial에서 항목을 인덱싱 할 수있는 기능 중 일부를이 NewBasePeer 클래스로 이동하려고합니다. 이 기능 중 하나는 doDeleteAll입니다.

을하지만이 함수 내에서이 같은 호출합니다 : :이 기능의 BaseModelPeer의 서명은 다음과 같습니다 BaseModelPeer는 BasePeer를 확장하지 않기 때문에

$affectedRows += BasePeer::doDeleteAll(ModelPeer::TABLE_NAME, $con, ModelPeer::DATABASE_NAME); 

, 그것은 괜찮습니다. 그러나 스키마에 basePeer 속성을 변경하여,에 함수 호출 변경 :

$affectedRows += NewBasePeer::doDeleteAll(ModelPeer::TABLE_NAME, $con, ModelPeer::DATABASE_NAME); 

BaseModelPeer 지금은 doDeleteAll()에 전화를 무시하는 의미 NewBasePeer를 확장

, 그들은 동일한 서명을해야합니다. 분명히 BaseModelPeer 클래스는 이제 스스로 모순입니다!

Propel에서는 버그가 있습니까? 그렇지 않다면, 사람은 basePeer 속성을 어떻게 사용합니까?

답변

0

새 파일을 그룹에 추가 할 때마다 복사하여 붙여 넣기보다는 모델 피어 클래스가 확장하는 클래스에 함수를 추가하는 것이 좋습니다.

올바른 방법은 Propel Behavior

을 정의하는 것입니다