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ấtTrang 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ờ
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# yourmodule/config/services.yml imports: - { resource: services.php }
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]
0 sẽ xác định các dịch vụ có thể truy cập tại văn phòng phía trướcget['your_company.your_module.your_service']; return $this->render['@Modules/yourmodule/templates/admin/demo.html.twig', [ 'customMessage' => $yourService->getTranslatedCustomMessage[], ]]; } }
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"
1Như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"
2mô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ìnhDướ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 trongget['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[],
]];
}
}
3Xá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