Symfony lấy container trong bộ điều khiển

Trước tiên, chúng tôi thực sự khuyên bạn nên sử dụng không gian tên & tự động tải trong mô-đun của mình, điều này có thể được thực hiện nhờ nhà soạn nhạc. Có sẵn một chương dành riêng để tìm hiểu thêm về Composer và thiết lập nó

Xác định dịch vụ của bạn

Tất nhiên, lúc đầu, bạn sẽ cần tạo một lớp cho dịch vụ của mình

translator = $translator;
        $this->customMessage = $customMessage;
    }

    /**
     * @return string
     */
    public function getTranslatedCustomMessage[] {
        return $this->translator->trans[$this->customMessage, [], 'Modules.YourModule'];
    }
}

Bây giờ không gian tên của bạn đã được thiết lập, bạn có thể xác định các dịch vụ của mình trong tệp

# yourmodule/config/services.yml
services:
  _defaults:
    public: true

  your_company.your_module.your_service:
    class: YourCompany\YourModule\YourService
    arguments:
      - "@translator"
      - "My custom message"
7 của mô-đun của bạn

# yourmodule/config/services.yml
services:
  _defaults:
    public: true

  your_company.your_module.your_service:
    class: YourCompany\YourModule\YourService
    arguments:
      - "@translator"
      - "My custom message"

Có thể tải các tệp PHP/XML cho các dịch vụ mô-đun

# yourmodule/config/services.yml
imports:
    - { resource: services.php }

# yourmodule/config/services.yml
services:
  _defaults:
    public: true

  your_company.your_module.your_service:
    class: YourCompany\YourModule\YourService
    arguments:
      - "@translator"
      - "My custom message"
8

# yourmodule/config/services.yml
services:
  _defaults:
    public: true

  your_company.your_module.your_service:
    class: YourCompany\YourModule\YourService
    arguments:
      - "@translator"
      - "My custom message"
9 với cách thực hiện của riêng bạn, bạn viết vào
# yourmodule/config/services.yml
services:
  _defaults:
    public: true

  your_company.your_module.your_service:
    class: YourCompany\YourModule\YourService
    arguments:
      - "@translator"
      - "My custom message"
7

________số 8_______

Đã xong. Dịch vụ được đăng ký dưới tên

# yourmodule/config/services.yml
imports:
    - { resource: services.php }
1 hiện là dịch vụ của bạn.
# yourmodule/config/services.yml
imports:
    - { resource: services.php }
1 trước đó đã biến mất

Trang trí dịch vụ

Khi bạn chọn trang trí một dịch vụ, điều này có nghĩa là bạn khiến mọi người sử dụng dịch vụ của mình nhưng bạn vẫn giữ nguyên dịch vụ cũ. Dịch vụ trước đó đã được đặt tên mới và vẫn có thể được sử dụng. Mọi phần khác của mã mà dịch vụ này được sử dụng sẽ sử dụng phiên bản mới

Để làm điều đó. bạn khai báo dịch vụ mới của mình bằng từ khóa 'trang trí'. Vì vậy, nếu bạn muốn trang trí dịch vụ

# yourmodule/config/services.yml
imports:
    - { resource: services.php }
1 bằng cách thực hiện của riêng tôi, bạn viết vào
# yourmodule/config/services.yml
services:
  _defaults:
    public: true

  your_company.your_module.your_service:
    class: YourCompany\YourModule\YourService
    arguments:
      - "@translator"
      - "My custom message"
7

 mymodule.my_own_b2b_feature_service:
    class: 'YourCompany\YourModule\YourService'
    decorates: 'prestashop.core.b2b.b2b_feature'

Đã xong. Dịch vụ được đăng ký dưới tên

# yourmodule/config/services.yml
imports:
    - { resource: services.php }
5 hiện là dịch vụ của bạn. Việc triển khai
# yourmodule/config/services.yml
imports:
    - { resource: services.php }
1 trước đó vẫn có sẵn dưới tên
# yourmodule/config/services.yml
imports:
    - { resource: services.php }
7

Điều này có nghĩa là trong vùng chứa của bạn, bạn có thể truy cập 3 dịch vụ ngay bây giờ

  • # yourmodule/config/services.yml
    imports:
        - { resource: services.php }
    
    5 dịch vụ của bạn
  • # yourmodule/config/services.yml
    imports:
        - { resource: services.php }
    
    1 hiện là bí danh cho
    # yourmodule/config/services.yml
    imports:
        - { resource: services.php }
    
    5 [xem bí danh dịch vụ] vì vậy các dịch vụ khác dựa vào nó hiện sử dụng triển khai của bạn
  • # yourmodule/config/services.yml
    imports:
        - { resource: services.php }
    
    7 là lần triển khai trước, vẫn khả dụng

Chiến lược trang trí có thể rất hữu ích nếu

  • bạn muốn một số vùng trong mã của mình sử dụng dịch vụ mới, một số vùng khác sử dụng dịch vụ cũ
  • bạn muốn sử dụng dịch vụ cũ trong quá trình triển khai dịch vụ mới

Thật vậy, đôi khi điều bạn muốn là sửa đổi một phần nhỏ hành vi của một lớp. Vậy tại sao phải thay thế nó hoàn toàn?

decoratedService = $decoratedService;
    }

    /**
     * We want to modify the behavior of the function getTranslatedCustomMessage
     * without replacing the whole DecoratedService implementation
     *
     * @return string
     */
    public function getTranslatedCustomMessage[] {

        $unmodifiedOutput = $this->decoratedService->getTranslatedCustomMessage[];

        $modifiedOutput = $this->modifyTheOutput[$unmodifiedOutput];

        return $modifiedOutput;
    }
}

Điều này chỉ khả thi với trang trí dịch vụ, không ghi đè dịch vụ, vì dịch vụ trước đó vẫn khả dụng

Tìm đúng dịch vụ

Lệnh Symfony

2 sẽ cung cấp cho bạn danh sách tất cả các dịch vụ đã đăng ký

Duy trì khả năng tương thích

Tuy nhiên, điều gì sẽ xảy ra nếu dịch vụ bạn đã ghi đè hoặc trang trí được sử dụng ở một nơi khác?

Thậm chí tệ hơn. điều gì sẽ xảy ra nếu một phần khác của mã đặc biệt yêu cầu lớp này, như thế này

3 với nó

4 bạn nên có

5 giao diện tương thích với nó

6 lớp trước, 
7, thay vào đó

Như bạn có thể thấy, các giao diện đặt nền tảng cho việc mở rộng và tùy chỉnh dễ dàng, đó là lý do tại sao chúng tôi sử dụng chúng ngày càng nhiều trong cơ sở mã Core và chúng tôi khuyên bạn cũng nên sử dụng chúng

Dịch vụ trong môi trường Legacy

Có thể khai báo các dịch vụ cho môi trường Symfony là một tính năng hay khi bạn sử dụng các bộ điều khiển hiện đại, tuy nhiên khi bạn ở văn phòng chính hoặc trong một trang kế thừa ở văn phòng hỗ trợ [có nghĩa là một trang chưa được di chuyển với Symfony], bạn có thể'

Kể từ phiên bản 1. 7. 6, giờ đây bạn có thể xác định các dịch vụ của mình và truy cập chúng trong môi trường cũ. Chúng tôi quản lý một vùng chứa nhẹ cho môi trường này [

8] có thể truy cập được từ các vùng chứa cũ

Để xác định các dịch vụ của mình, bạn cần tuân theo nguyên tắc giống như các dịch vụ của Symfony, nhưng lần này bạn cần đặt các tệp định nghĩa của mình vào các thư mục con

  • 9 sẽ xác định các dịch vụ có thể truy cập tại văn phòng hỗ trợ [trong môi trường cũ VÀ môi trường Symfony]
  • get['your_company.your_module.your_service'];
    
            return $this->render['@Modules/yourmodule/templates/admin/demo.html.twig', [
                'customMessage' => $yourService->getTranslatedCustomMessage[],
            ]];
        }
    }
    
    0 sẽ xác định các dịch vụ có thể truy cập tại văn phòng phía trước

Truy cập dịch vụ của bạn

Sau đó, bạn có thể truy cập các dịch vụ của mình từ bất kỳ bộ điều khiển kế thừa nào [trong đó vùng chứa được đưa vào tự động]

# yourmodule/config/services.yml
services:
  _defaults:
    public: true

  your_company.your_module.your_service:
    class: YourCompany\YourModule\YourService
    arguments:
      - "@translator"
      - "My custom message"
0

# yourmodule/config/services.yml
services:
  _defaults:
    public: true

  your_company.your_module.your_service:
    class: YourCompany\YourModule\YourService
    arguments:
      - "@translator"
      - "My custom message"
1

Nhưng bạn cũng có thể truy cập chúng từ mô-đun của mình, để hiển thị nội dung của nó hoặc trong các móc nối

# yourmodule/config/services.yml
services:
  _defaults:
    public: true

  your_company.your_module.your_service:
    class: YourCompany\YourModule\YourService
    arguments:
      - "@translator"
      - "My custom message"
2

môi trường

Hãy nhớ rằng bộ chứa kế thừa là phiên bản rút gọn của bộ chứa Symfony đầy đủ nên bạn sẽ không có quyền truy cập vào tất cả các thành phần Symfony. Nhưng bạn sẽ có thể sử dụng dịch vụ Doctrine cũng như một vài dịch vụ cốt lõi từ PrestaShop

Để biết thêm chi tiết về các dịch vụ có sẵn, bạn có thể kiểm tra trong thư mục

get['your_company.your_module.your_service'];

        return $this->render['@Modules/yourmodule/templates/admin/demo.html.twig', [
            'customMessage' => $yourService->getTranslatedCustomMessage[],
        ]];
    }
}
1 những dịch vụ có sẵn trong quản trị viên hoặc phía trước. Hãy cẩn thận và luôn ghi nhớ bối cảnh/môi trường mà bạn đang gọi dịch vụ của mình

Dưới đây là tóm tắt nhanh để bạn biết nơi bạn nên xác định dịch vụ của mình

Tệp định nghĩaSymfony ContainerFront Legacy ContainerAdmin Legacy ContainerCác dịch vụ có sẵnconfig/services. ymlYesNoNoTất cả các thành phần của symfony và dịch vụ PrestaShopBundleconfig/admin/services. ymlYesNoYesDoctrine, các dịch vụ được định nghĩa trong
get['your_company.your_module.your_service'];

        return $this->render['@Modules/yourmodule/templates/admin/demo.html.twig', [
            'customMessage' => $yourService->getTranslatedCustomMessage[],
        ]];
    }
}
2 folderconfig/front/services. ymlYesYesNoDoctrine, các dịch vụ được xác định trong thư mục
get['your_company.your_module.your_service'];

        return $this->render['@Modules/yourmodule/templates/admin/demo.html.twig', [
            'customMessage' => $yourService->getTranslatedCustomMessage[],
        ]];
    }
}
3

Xác định một dịch vụ trên cả phía trước và quản trị viên

Đôi khi các dịch vụ chỉ hữu ích trong một bối cảnh cụ thể [văn phòng hỗ trợ hoặc văn phòng chính], nhưng đôi khi bạn cũng cần chúng trên cả hai [kho lưu trữ Doctrine là một ví dụ điển hình]. Bạn có thể dễ dàng xác định các dịch vụ giống nhau trong cả hai môi trường nhưng nó rất mô đun và có thể tạo ra lỗi trong trường hợp sửa đổi

Chủ Đề