Làm cho lớp tùy chỉnh của bạn triển khai ServiceLocatorAwareInterface
.
Khi bạn khởi tạo nó với ServiceManager, nó sẽ thấy giao diện đang được triển khai và tự tiêm vào lớp.
Lớp học của bạn giờ đây sẽ có người quản lý dịch vụ hoạt động trong suốt quá trình hoạt động.
<?php
namespace My;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
class MyClass implements ServiceLocatorAwareInterface{
use ServiceLocatorAwareTrait;
public function doSomething(){
$sl = $this->getServiceLocator();
$logger = $sl->get('My\CusomLogger')
}
}
// later somewhere else
$mine = $serviceManager->get('My\MyClass');
//$mine now has the serviceManager with in.
Tại sao tính năng này hoạt động?
Điều này chỉ hoạt động trong ngữ cảnh của Zend \ Mvc, mà tôi cho rằng bạn đang sử dụng vì bạn đã đề cập đến bộ điều khiển.
Nó hoạt động vì Zend\Mvc\Service\ServiceManagerConfig
thêm bộ khởi tạo vào ServiceManager.
$serviceManager->addInitializer(function ($instance) use ($serviceManager) {
if ($instance instanceof ServiceLocatorAwareInterface) {
$instance->setServiceLocator($serviceManager);
}
});
Hãy thử và cho tôi biết điều gì sẽ xảy ra.
Nguồn
2013-07-26 19:07:55
Ngoài câu trả lời của Jerry, tôi khuyên bạn chỉ nên tiêm phụ thuộc bạn cần vào lớp tùy chỉnh. Vì vậy, nếu bạn chỉ cần đối tượng logger trong lớp tùy chỉnh của bạn thì làm cho nhà máy của lớp tùy chỉnh của bạn tiêm cá thể logger khi tạo một cá thể mới của lớp tùy chỉnh của bạn. – Ruben
Như Sam và Ruben đã chỉ ra, sẽ tốt hơn nếu KHÔNG có lớp của bạn phụ thuộc vào ServiceManager. Thay vào đó, nó sẽ là tốt hơn để tiêm logger vào lớp trực tiếp. Bạn có thể thực hiện điều này thông qua một Trình khởi tạo tìm kiếm một "LoggerAwareInterface" tùy chỉnh HOẶC tạo một lớp nhà máy cho lớp tùy chỉnh của bạn. –