2012-05-21 22 views
13

Tôi không hiểu cách sử dụng "DI container" này. Các ví dụ được hiển thị trên trang web chính thức cho tôi biết không có gì: http://pimple.sensiolabs.orgHiểu Pimple

Về cơ bản tôi có một trang web đơn giản, bao gồm một nhóm lớp: lớp DB, lớp Cache, Lớp người dùng và một vài thứ khác xử lý các loại nội dung.

Tất cả các lớp này giống như "dịch vụ" được đề cập trong Pimple và mỗi dịch vụ sẽ có thể gọi một dịch vụ khác. Ngay bây giờ tôi đang khởi tạo các dịch vụ trong một lớp học chính mà tôi sử dụng nó như một singleton để chia sẻ các dịch vụ trên các lớp khác.

Từ những gì tôi đọc, Pimple thực hiện chính xác loại điều này, nhưng làm cách nào để sử dụng? : s

Trả lời

18

Có hướng dẫn tại http://phpmaster.com/dependency-injection-with-pimple/ giải thích cách sử dụng Pimple làm DIC.

Phương pháp tiếp cận khác (nhưng không nhất thiết được khuyến nghị) là đưa thùng chứa vào tất cả các thành phần cần thiết (ví dụ bạn sử dụng nó như ServiceLocator) và sau đó bạn chỉ cần làm những gì tài liệu nói bạn nên làm để lấy đối tượng Pimple:

class SomeClassThatNeedsSession 
{ 
    private $session; 
    public function __construct(Pimple $container) 
    { 
     $this->session = $container['session']; 
    } 
} 

Nói cách khác, bạn chỉ cần tìm những gì bạn cần và Pimple will handle the lifetime of that object, e.g. whether it needs to be created or is reused. OffsetGet là một phần của giao diện ArrayAccess cho phép bạn truy cập vào một đối tượng giống như một mảng, vì vậy khi bạn làm $container['foo'] Mụn sẽ kiểm tra xem nó có đóng cửa được xác định cho foo cho dù chỉ một số tham số và lắp ráp dịch vụ tương ứng.

Mụn là kết quả của số blog post about Lambdas and Closures mà bạn có thể muốn đọc để hiểu rõ hơn cách hoạt động của nó.

+4

Được coi là thực hành tốt để cung cấp cho một lớp toàn bộ vùng chứa? Điều đó không vi phạm luật demeter, nhờ đó bạn đang cho một lớp nhiều hơn cần làm công việc của mình? – AgmLauncher

+2

@AgmLauncher Luật Demeter không áp dụng cho các phương pháp tạo đối tượng theo giấy gốc trên LoD. Vì một Service Locator có hiệu quả là một nhà máy tạo ra các đối tượng, nó không thực sự vi phạm LoD. Tuy nhiên, tất cả các lớp bằng cách sử dụng một Service Locator sẽ có một sự phụ thuộc vào SL sau đó nó sẽ sử dụng lại, vì vậy tốt hơn là không nên sử dụng nó như một nhưng theo cách sử dụng được gợi ý trong liên kết đầu tiên tôi đưa ra. – Gordon

+1

Nếu bạn tiêm toàn bộ thùng chứa Pimple trong hàm tạo, làm thế nào chúng ta có thể biết phụ thuộc thực sự cho lớp SomeClassThatNeedsSession là gì? Làm thế nào tôi có thể biết những phụ thuộc để giả lập cho các bài kiểm tra? –

4

Tôi không biết Pimple, nhưng động cơ DI mà tôi biết sẽ mất ngay lập tức. Các đối tượng của bạn không tạo ra các cá thể của các phụ thuộc của chúng. Thay vào đó, động cơ DI tạo ra chúng và đưa chúng ra theo yêu cầu.

Vì vậy, nếu mã PHP của bạn đang tạo phiên bản mới, tôi nghĩ bạn nên thay đổi nó để mã của bạn nhận được công cụ DI và yêu cầu phụ thuộc từ nó.

+0

Mụn chỉ là một vật chứa không phải là động cơ, nó không thể xử lý sự khởi tạo. – erdeszt

+2

Vì vậy, những người instantiates cho Pimple? Tôi không thấy điểm nếu nó không thể tạo ra các đối tượng. – duffymo

+1

Bạn cấu hình Pimple với các bao đóng để thực hiện các cảnh báo cho bạn. Pimple sẽ xử lý các phụ thuộc giữa các đối tượng và khởi tạo từng lazily, nghĩa là chỉ khi cần thiết. – Jason