2012-07-10 18 views

Trả lời

8

Tôi sẽ cố gắng hết sức để giải thích các dịch vụ, nhưng Symfony2 docs thực hiện công việc tốt hơn tôi có thể.

Ở cốt lõi, dịch vụ đơn giản chỉ là một lớp học. Một lớp trở thành một dịch vụ khi nó được đăng ký với số Dependency Injection Container của Symfony2 (hoặc chỉ ngắn Container). Tại thời điểm này, lớp này là một phần của Lớp Dịch vụ của ứng dụng.

Dịch vụ có thể có các phụ thuộc (và thường là thời gian), nhưng không bắt buộc. Một dịch vụ thường được sử dụng như một sự phụ thuộc cho các dịch vụ khác. Để tôi cho bạn một ví dụ:

  • Bạn có một lớp học sử dụng để gửi email, gọi EmailSender
  • Bạn có một lớp có chứa các hướng dẫn về cách gửi email qua SMTP, gọi SmtpTransport
  • EmailSender có phụ thuộc ở dạng SmtpTransport. Nói cách khác, đối với EmailSender để có thể thực hiện công việc của mình, nó cần một phiên bản SmtpTransport để được tiêm vào nó. (Lưu ý rằng mặc dù EmailSender có một sự phụ thuộc, SmtpTransport thì không.)

Giả sử bạn cần phải sử dụng EmailSender trong năm địa điểm khác nhau trong ứng dụng của bạn. Trong mỗi vị trí, bạn có thể có mã như thế này:

$emailSender = new EmailSender(new SmtpTransport()); 
$emailSender->send($email) 

Đó không phải là nhiều mã (từ EmailSender chỉ có một sự phụ thuộc), nhưng những gì xảy ra khi bạn quyết định rằng thay vì sử dụng SMTP, EmailSender nên sử dụng một phương tiện giao thông lớp học cho sendmail? Bạn sẽ phải chỉnh sửa từng khối mã để cập nhật nó.

Cách khác là đăng ký EmailSender và các phụ thuộc của nó làm dịch vụ.
Đăng ký doanh nghiệp trông như thế này:

// YourApp/YourBundle/Resources/config/services.yml 
services: 
    smtp_transport: 
    class: YourApp\YourBundle\Email\SmtpTransport 

    email_sender: 
    class: YourApp\YourBundle\Email\EmailSender 
    arguments: 
     - @smtp_transport 

Bây giờ, để sử dụng nó (từ một bối cảnh ý thức container):

$container->get('email_sender')->send($email); 

Chú ý cách đơn giản hơn nhiều và rõ ràng hơn đó là để thực sự sử dụng lớp để gửi email ? Chắc chắn, bạn phải làm công việc để đăng ký dịch vụ trước, nhưng đó là tầm thường và chỉ phải được thực hiện một lần.

Hãy tưởng tượng rằng EmailSender có ba phụ thuộc thay vì một. Bằng cách sử dụng dịch vụ, bạn chỉ cần sửa đổi đăng ký dịch vụ mà không phải thay đổi mã triển khai của mình (mã được sử dụng để gửi email).

Tóm lại, lớp dịch vụ hoạt động như một kho lưu trữ trung tâm cho các lớp mà a) có một hoặc nhiều phụ thuộc b) cần được sử dụng trong phạm vi 'toàn cầu'.Bằng cách tìm nạp các lớp dịch vụ này từ Dependency Injection Container, bạn kết thúc với ít mã dư thừa hơn và cách dễ dàng hơn để thực hiện các thay đổi tiếp cận rộng.

Tôi có thể sai, nhưng tôi nghĩ Symfony2 là khuôn khổ PHP đầu tiên để triển khai vùng chứa tiêm phụ thuộc. Như vậy, rất nhiều nhà phát triển PHP có thể không quen với khái niệm dịch vụ. Tôi chắc chắn khuyên bạn nên chắc chắn rằng bạn hiểu nó đầy đủ, vì bạn sẽ thấy rằng đó là một công cụ rất mạnh mẽ. Ngoài ra, khái niệm về dịch vụ không bị giới hạn bởi Symfony2 hay thậm chí là PHP - bạn sẽ có thể tận dụng khái niệm này trong nhiều khuôn khổ và ngôn ngữ khác nhau.

1

Hãy thử loạt Fabien của các bài báo về đề tài này: Dependency Injection.

+0

Tôi hiểu DI nhưng tôi không thể hiểu điều dịch vụ – user825904

+0

đó là điều tương tự. một dịch vụ chỉ là một lớp đã được chỉ định trong DIC – MDrollette

+0

Tôi đã học symfony2 từ liên kết này http://tutorial.symblog.co.uk/docs/customising-the-view-more-with-twig.html, Bất cứ ai có thể cho tôi biết những gì là lớp dịch vụ trong này hoặc làm thế nào hướng dẫn này sử dụng dịch vụ lớp – user825904

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