2011-12-09 37 views
8

Tôi đã triển khai các đối tượng giá trị như các kiểu DBAL tùy chỉnh trong Doctrine 2 và nó đang hoạt động OK. Tuy nhiên tôi đã tự hỏi nếu đây là cách tốt nhất. Tôi đã nghĩ về việc sử dụng trình nghe Post Load để khởi tạo các đối tượng Value. Ngoài ra instantiating chúng thông qua Entity accessors khi được yêu cầu, lợi thế với thứ hai sẽ là tôi sẽ không instantiate nhiều đối tượng hơn tôi cần.Doctrine 2 Value Objects

Câu hỏi của tôi là: phương pháp nào là tốt nhất? Hoặc có cách nào tốt hơn để làm điều đó? Có bất kỳ gotchas hoặc hit hiệu suất không hợp lý với các bên trên?

Trả lời

8

IMHO, cả hai cách tiếp cận đều có giá trị như nhau, trong khi đợi native support for value objects.

Cá nhân tôi ủng hộ cách tiếp cận thứ hai (instantiating chúng thông qua accessors khi có yêu cầu) vì hai lý do:

  • Như bạn nói, nó cung cấp hiệu suất tốt hơn như việc chuyển đổi chỉ được thực hiện khi cần thiết;
  • Nó tách riêng ứng dụng của bạn khỏi phụ thuộc Doctrine: bạn đang viết ít mã hơn là Doctrine cụ thể.

Một ví dụ của phương pháp này:

class User 
{ 
    protected $street; 
    protected $city; 
    protected $country; 

    public function setAddress(Address $address) 
    { 
     $this->street = $address->getStreet(); 
     $this->city = $address->getCity(); 
     $this->country = $address->getCountry(); 
    } 

    public function getAddress() 
    { 
     return new Address(
      $this->street, 
      $this->city, 
      $this->country 
     ); 
    } 
} 

Mã này sẽ là khá dễ dàng để cấu trúc lại khi thuyết sẽ cung cấp hỗ trợ VO bản địa.

Về custom mapping types, tôi sử dụng chúng là tốt, cho lĩnh vực đơn VO (Decimal, Point, Polygon ...) nhưng sẽ có xu hướng dành chúng cho các mục đích chung, các loại tái sử dụng mà có thể được sử dụng trên nhiều dự án , không dành riêng cho dự án một lĩnh vực cụ thể VO nơi tôi sẽ ủng hộ cách tiếp cận ở trên.

Các vấn đề liên quan