Hướng dẫn sử dụng php

Mặc dù nó có thể không bao gồm mọi trường hợp và làm hài lòng tất cả mọi người, nhưng nó có thể đóng vai trò như một bức tranh để giúp bạn bắt đầu tiêm phụ thuộc

Nếu bạn không đồng ý với bất kỳ điều gì được giải thích trong hướng dẫn đó, không sao cả. Đó là ý kiến ​​​​và bạn nên đưa ra ý kiến ​​​​của riêng mình về tất cả các chủ đề này;]. Nó không ngăn cản bạn sử dụng PHP-DI theo cách bạn muốn

Quy tắc sử dụng vùng chứa và nội xạ phụ thuộc

Dưới đây là một số quy tắc cơ bản để làm theo

  1. không bao giờ nhận được mục nhập trực tiếp từ vùng chứa [luôn sử dụng phép nội xạ phụ thuộc]
  2. tổng quát hơn, hãy viết mã tách rời khỏi vùng chứa
  3. gợi ý loại đối với các giao diện, định cấu hình triển khai nào sẽ sử dụng trong cấu hình của vùng chứa

Viết bộ điều khiển

Sử dụng phép nội xạ phụ thuộc trong bộ điều khiển thường là nơi gây tổn hại nhiều nhất

Nếu chúng tôi lấy Symfony 2 làm ví dụ [nhưng điều này thường áp dụng cho mọi khung], đây là các tùy chọn của bạn

  • đưa container vào bộ điều khiển và gọi $container->get[...]

Điều này thật tệ, hãy xem quy tắc số 1

  • đưa các phụ thuộc vào hàm tạo [bộ điều khiển dưới dạng dịch vụ trong Symfony]

Điều này thật khó khăn khi bạn có nhiều hơn 5 phụ thuộc và hàm tạo của bạn là 15 dòng mã soạn sẵn

  • tiêm phụ thuộc vào thuộc tính

Đây là giải pháp chúng tôi khuyên dùng

Thí dụ


class UserController
{
    #[Inject]
    private FormFactoryInterface $formFactory;

    public function createForm[$type, $data, $options]
    {
        // $this->formFactory->...
    }
}

Như bạn có thể thấy, giải pháp này yêu cầu rất ít mã, dễ hiểu và được hưởng lợi từ sự hỗ trợ của IDE [tự động hoàn thành, tái cấu trúc,…]

Việc tiêm tài sản thường không được tán thành và vì những lý do chính đáng

  • tiêm vào một tài sản tư nhân phá vỡ đóng gói
  • nó không phải là một sự phụ thuộc rõ ràng. không có hợp đồng nào nói rằng lớp của bạn cần thuộc tính được thiết lập để hoạt động
  • nếu bạn sử dụng thuộc tính của PHP-DI để đánh dấu phần phụ thuộc sẽ được đưa vào, thì lớp của bạn sẽ phụ thuộc vào vùng chứa [xem quy tắc thứ 2 ở trên]

NHƯNG

nếu bạn tuân theo các phương pháp hay nhất chung về cách viết ứng dụng của mình, bộ điều khiển của bạn sẽ không chứa logic nghiệp vụ [chỉ định tuyến các cuộc gọi đến mô hình và ràng buộc các giá trị được trả về để xem]

Vì thế

  • bạn sẽ không kiểm tra đơn vị nó [điều đó không có nghĩa là bạn sẽ không viết các bài kiểm tra chức năng trên giao diện]
  • bạn sẽ không cần phải sử dụng lại nó ở nơi khác
  • nếu bạn thay đổi khung, bạn có thể phải viết lại nó [hoặc một phần của nó] [vì hầu hết các phụ thuộc như Yêu cầu, Phản hồi, hệ thống tạo khuôn mẫu, v.v. sẽ thay đổi]

Giải pháp này mang lại nhiều lợi ích mà không có nhược điểm lớn, vì vậy chúng tôi khuyên bạn nên sử dụng các thuộc tính trong bộ điều khiển

dịch vụ viết

Với một dịch vụ nhằm mục đích sử dụng lại, thử nghiệm và độc lập với khung của bạn, chúng tôi khuyên bạn không nên sử dụng các thuộc tính để đưa vào các phụ thuộc

Thay vào đó, chúng tôi khuyên bạn nên sử dụng hàm tạo và tự động truyền

class OrderService implements OrderServiceInterface
{
    private $paymentService;

    public function __construct[PaymentServiceInterface $paymentService]
    {
        $this->paymentService = $paymentService;
    }

    public function processOrder[$order]
    {
        $this->paymentService->...
    }
}

Bằng cách sử dụng tính năng tự động nối dây [được bật theo mặc định], bạn tiết kiệm được việc ràng buộc mọi tham số của hàm tạo trong cấu hình. PHP-DI sẽ đoán đối tượng nào nó cần đưa vào bằng cách kiểm tra các loại tham số của bạn

Trong một số trường hợp, autowiring sẽ không đủ vì một số tham số sẽ là vô hướng [chuỗi, int,…]. Tại thời điểm đó, bạn sẽ cần xác định rõ ràng những gì cần thêm vào tham số vô hướng đó và để làm điều này, bạn có thể

  • xác định toàn bộ quá trình tiêm của phương thức/lớp [i. e. mọi tham số] bằng cách sử dụng DI\create[]

Thí dụ

Chủ Đề