zf3 php,php – 用于互连服务的ZF3服务DI的有效模式

本文讨论了在PHP应用程序中如何有效地管理服务,特别是涉及依赖注入和服务定位器的使用。文章指出,通过在控制器中直接注入所需服务而不是使用服务定位器,可以降低资源浪费并提高代码的可读性和可维护性。同时,利用懒加载服务可以在减少不必要的服务实例化方面进一步优化。建议的做法是将依赖关系明确地注入到构造函数中,并在需要时才创建服务实例。
摘要由CSDN通过智能技术生成

据我所知,有效模式是:

>一个实例化所需服务的FooControllerFactory(FooService)

>一个带构造函数的FooController __construct(FooService $fooService)

> Controller获取一些基本数据并从服务中获取结果

>服务包含所有必需的业务逻辑

这是一项基本服务.最终,此服务将需要其他服务用于各种活动.

例如CacheService,SomeOtherDataService.

The question is, what is a valid/appropriate pattern for

including/injecting those other interconnected services?

我们目前的reallife示例极其简化:

AuctionController

/**

* get vehicles for specific auction

*/

public function getVehiclesAction ()

{

$auctionService = $this->getAuctionService(); // via service locator

$auctionID = (int) $this->params('auction-id');

$auction = $auctionService->getAuctionVehicle($auctionID);

return $auction->getVehicles();

}

AuctionService

public function getAuctionVehicles($auctionID) {

$auction = $this->getAuction($auctionID);

// verify auction (active, permissions, ...)

if ($auction) {

$vehicleService = $this->getVehicleService(); // via service locator

$vehicleService->getVehicles($params); // $params = some various conditions or array of IDs

}

return false;

}

VehicleService

public function getVehicles($params) {

$cache = $this->getCache(); // via service locator

$vehicles = $cache->getItem($params);

if (!$vehicles) {

$vehicleDB = $this->getVehicleDB(); // via service locator

$vehicles = $vehicleDB->getVehicles($params);

}

return $vehicles;

}

建议的有效模式的示例

AuctionController

public function __construct(AuctionService $auctionService) {

$this->auctionService = $auctionService;

}

/**

* get vehicles for specific auction

*/

public function getVehiclesAction ()

{

$auctionID = (int) $this->params('auction-id');

$auction = $this->auctionService->getAuctionVehicle($auctionID);

return $auction->getVehicles();

}

**AuctionService**

public function getAuctionVehicles($auctionID) {

$auction = $this->getAuction($auctionID); // no problem, local function

// verify auction (active, permissions, ...)

if ($auction) {

$vehicleService = $this->getVehicleService(); // we don't have service locator

$vehicleService->getVehicles($params); // $params = some various conditions or array of IDs

}

return false;

}

VehicleService

public function getVehicles($params) {

$cache = $this->getCache(); // we don't have service locator, but cache is probably static?

$vehicles = $cache->getItem($params);

if (!$vehicles) {

$vehicleDB = $this->getVehicleDB(); // where and how do we get this service

$vehicles = $vehicleDB->getVehicles($params);

}

return $vehicles;

}

一些说明:

>服务仅在某些情况下互连,95%是独立的

>拍卖有很多功能,不需要车辆

>车辆有VehicleController和VehicleService,只在某些情况下与拍卖有关,它是一个独立的模块,具有其他功能

>在控制器中注入所有需要的服务将浪费资源,因为在每个操作中都不需要它们(在现实生活中,我们有许多互连服务,而不仅仅是两个)

>在多个服务中编程相同的业务逻辑只是为了避免服务定位器显然是无效的模式而且是不可接受的.

解决方法:

如果控制器需要太多不同的服务,它通常表明控制器有太多的责任.

继续@ AlexP的回答,然后将此服务注入您的控制器.根据您的设置,当创建控制器时,这肯定会导致依赖注入级联.这至少会将创建的服务限制为控制器实际需要的服务(以及那些传递相关的服务).

如果其中一些服务很少需要,并且您担心每次请求都创建它们,那么新的Service Manager现在也支持lazy services.那些仍然可以作为常规依赖项注入服务/控制器(如上所述),但仅在第一次调用时创建.

从文档的示例中复制它:

$serviceManager = new \Zend\ServiceManager\ServiceManager([

'factories' => [

Buzzer::class => InvokableFactory::class,

],

'lazy_services' => [

// Mapping services to their class names is required

// since the ServiceManager is not a declarative DIC.

'class_map' => [

Buzzer::class => Buzzer::class,

],

],

'delegators' => [

Buzzer::class => [

LazyServiceFactory::class,

],

],

]);

请求服务时,不会立即创建它:

$buzzer = $serviceManager->get(Buzzer::class);

但只有在第一次使用时:

$buzzer->buz();

这样,您可以将多个依赖项注入控制器,并且只会创建实际需要的服务.当然,对于任何依赖项都是如此,例如其他服务所需的服务等.

标签:php,zend-framework2,zend-framework3,zend-framework-mvc,zf3

来源: https://codeday.me/bug/20190527/1166361.html

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值