2008-09-28 2 views
2

PHP에서 ORM을 만들고 있는데, 기본적으로 데이터베이스 테이블에 해당하는 객체를 만드는 클래스 'ORM'이 있습니다. ActiveRecord 패턴과 비슷한 기능을 목표로합니다.) ORM 자체는 데이터베이스 연결을 설정하는 '데이터베이스'를 확장합니다. (등 방법) 클래스의 속성을 설정하고, (,) (, 찾기() 저장 findall은 제공) 이 수업을 연장해야합니까? (PHP)

$c = new Customer(); 
$c->name = 'John Smith'; 
$c->save();

ORM 클래스는이 기능을 제공하고, 고객은 ORM 확장 :

그래서 저는 호출 할 수 있습니다. 그러나 앞으로는 고객 (또는 내가 만든 다른 모델)에 공용 메서드를 추가하고자 할 수 있습니다. 따라서 ORM을 확장해야할까요?

여기서 많은 정보를 제공하지는 못했지만 잘하면이 코드는 300 라인 이상의 코드를 게시하는 것과는 달리 모호한 설명으로 이해할 수 있습니다.

+0

또 다른 ORM? 이것은 오픈 소스 화 될 것인가? 나는 호기심있다! – Till

+0

제목과 태그에서 "PHP"를 제거하는 것이 좋습니다. OOP에 대해서는 매우 일반적인 질문이며 PHP에는 특별한 것이 없기 때문입니다. – nickf

+0

질문에 PHP가 언급되었지만 OOP 질문이 많기 때문에 '언어에 구애받지 않습니다'를 추가했습니다. – Chris

답변

3

다른 답변에 동의합니다. 추가 메서드를 하위 클래스에 넣으십시오. 또한 별표를 추가 할 것입니다 : 추가 메서드를 사용하여 클래스를 확장 할 때마다 확장을 사용하여 달성하려는 내용에 대해 생각하고 일반화되어 다시 부모 클래스로 돌아갈 수 있는지 생각해보십시오 . 예 :

// Customer.class.php 
function getByName($name) { 
    // SELECT * FROM `customer` WHERE `name` = $name 
} 

// ** this could instead be written as: ** 
// ORM.class.php 
function getByField($field, $value) { 
    // SELECT * FROM `$this->table` WHERE `$field` = $value 
} 
1

예, 비즈니스 논리를 하위 클래스에 배치하십시오. 이것은 대부분의 데이터 액세스 레이어 생성 프레임 워크에서 볼 수있는 매우 일반적인 패턴입니다.

2

'ORM'외부의 새로운 클래스에 비즈니스 로직을 정확하게 넣으려고하는 것은 분명합니다. 대신 ORM 클래스를 확장하는 대신 클래스를 순수한 비즈니스 객체로 생각할 수 있도록 데이터베이스 디자인에서 자유로운 수준을 제공하기 위해 새로운 값 객체 클래스로 캡슐화하려고합니다.

0

반드시 ORM 클래스를 확장해야합니다. 다른 것들은 다른 클래스의 객체이어야합니다. 고객은 제품과 매우 다르며 단일 ORM 클래스에서 두 가지를 모두 지원하면 불필요한 부 풀림이 발생하고 OOP의 목적을 완전히 무마합니다.

또 다른 좋은 일은 저장하기 전, 저장 후 등에 후크를 추가하는 것입니다. 이렇게하면 ORM 확장 클래스가 다양 해짐에 따라 유연성이 향상됩니다.

0

PHP에 대한 제한된 지식으로 인해 관련이 있는지 확실하지 않지만 많은 비즈니스 개체를 만들려고한다면 엄청난 시간이 소요될 수 있습니다. 아마도 CakePHP과 같은 프레임 워크를 고려해야합니다. 비즈니스 논리를 작성하는 과정에있는 경우 유용합니다.

2

아니요. 상속 대신 컴포지션을 사용해야합니다. 다음 예를 참조하십시오

class Customer { 
    public $name; 
    public function save() { 
     $orm = new ORM('customers', 'id'); // table name and primary key 
     $orm->name = $this->name; 
     $orm->save(); 
    } 
} 

그리고 ORM 클래스 Database를 확장하지 않아야합니다. 컴포지션이이 사용 사례에 가장 적합합니다.

+0

작문은 OO 디자인에서 거대한 아니요. 아니요. – Till

+0

이 기능이 상속보다 나은 이유에 대한 자세한 정보가 있습니까? – nickf

+1

상속은 "is"관계이지만 반면에 composition은 "has"관계입니다. 따라서 "ORM은 데이터베이스 연결"이라는 사실은 거짓입니다. 대신 "ORM에는 데이터베이스 연결이 있습니다."라고 명시해야합니다. –

0

나는 이것을 내 Pork.dbObject에서 해결했습니다. 그것을 확인하고 이미했던 braincrunching의 일부를하다가하십시오 :이 방법은, 데이터베이스 또는 ORM 기능이 떨어져 설문 조사 객체로부터 추출되는 P

class Poll extends dbObject // dbObject is my ORM. Poll can extend it so it gets all properties. 
{ 
     function __construct($ID=false) 
     { 
      $this->__setupDatabase('polls', // db table 
       array('ID_Poll' => 'ID', // db field => object property 
         'strPollQuestion' => 'strpollquestion', 
         'datPublished' => 'datpublished', 
         'datCloseDate' => 'datclosedate', 
         'enmClosed' => 'enmclosed', 
         'enmGoedgekeurd' => 'enmgoedgekeurd'), 
         'ID_Poll', // primary db key 
         $ID); // primary key value 
     $this->addRelation('Pollitem'); //Connect PollItem to Poll 1;1 
     $this->addRelation('Pollvote', 'PollUser'); // connect pollVote via PollUser (many:many) 


     } 

function Display() 
{ 

// do your displayíng for poll here: 
    $pollItems = $this->Find("PollItem"); // find all poll items 
    $alreadyvoted = $this->Find("PollVote", array("IP"=>$_SERVER['REMOTE_ADDR'])); // find all votes for current ip 
} 

참고. 알고 있지 않다면 이 필요하지 않습니다. 필드/매핑을 연결하기위한 설치 데이터베이스. addRelation은 다른 dbObject와 관계를 연결합니다.

dbObject 클래스도 SQL에 대해 많이 알지 못합니다. select/join 질의는 특별한 QueryBuilder 객체에 의해 만들어집니다.

0

여기에는 상속을 통해 올바른 방향으로 생각하고 있습니다.

건물을 짓기 위해 (또는 다른 사람이 물건을 다루는 방식이 맘에 들지 않기 때문에) 건물을 짓기 위해 ORM을 만드는 경우 그렇지 않은 경우에 가장 많은 것을 생성 할 수있는 미리 만들어진 ORM을 볼 수 있습니다. 귀하의 데이터베이스 스키마에서 바로 귀하의 코드. 그것은 당신에게 시간의 보트로드를 저장합니다. CoughPHP은 현재 내 즐겨 찾기입니다.

관련 문제