Php 如何创建多个非共享实例而不在ZendFramework2中注入ServiceLocator?
我在module.config.php文件中有一个创建非共享服务的工厂和一个控制器工厂。这部分配置如下所示:Php 如何创建多个非共享实例而不在ZendFramework2中注入ServiceLocator?,php,dependency-injection,zend-framework2,factory,service-locator,Php,Dependency Injection,Zend Framework2,Factory,Service Locator,我在module.config.php文件中有一个创建非共享服务的工厂和一个控制器工厂。这部分配置如下所示: "service_manager" => [ "factories" => [ Entity\User::class => Factory\Entity\UserFactory::class ], "shared" => [ Entity\User::class => false ] ], "c
"service_manager" => [
"factories" => [
Entity\User::class => Factory\Entity\UserFactory::class
],
"shared" => [
Entity\User::class => false
]
],
"controllers" => [
"factories" => [
Controller\UserAdminController::class => Factory\Controller\UserAdminControllerFactory::class
]
]
<?php
namespace User\Factory\Controller\Core;
use User\Controller\UserAdminController;
use Interop\Container\ContainerInterface;
use User\Entity\User;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class UserAdminControllerFactory implements FactoryInterface{
/**
* @param ContainerInterface $container
* @param string $requestedName
* @param array|null $options
*
* @return UserAdminController
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
$serviceLocator = $container->getServiceLocator();
return new UserAdminController($serviceLocator->get(User::class));
}
/**
* @param ServiceLocatorInterface $serviceLocator
*
* @return UserAdminController
*/
public function createService(ServiceLocatorInterface $serviceLocator){
return $this($serviceLocator, UserAdminController::class);
}
}
用户实体是非共享的,因为我允许管理员同时添加多个用户,因此我需要实例化用户实体类的多个实例
这是我的控制器工厂:
<?php
namespace User\Factory\Controller\Core;
use User\Controller\UserAdminController;
use Interop\Container\ContainerInterface;
use User\Entity\User;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class UserAdminControllerFactory implements FactoryInterface{
/**
* @param ContainerInterface $container
* @param string $requestedName
* @param array|null $options
*
* @return UserAdminController
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
$serviceLocator = $container->getServiceLocator();
return new UserAdminController($serviceLocator->get(User::class));
}
/**
* @param ServiceLocatorInterface $serviceLocator
*
* @return UserAdminController
*/
public function createService(ServiceLocatorInterface $serviceLocator){
return $this($serviceLocator, UserAdminController::class);
}
}
最好的方法是将用户实体的新实例注入控制器。控制器工厂应如下所示:
"service_manager" => [
"factories" => [
Entity\User::class => Factory\Entity\UserFactory::class
],
"shared" => [
Entity\User::class => false
]
],
"controllers" => [
"factories" => [
Controller\UserAdminController::class => Factory\Controller\UserAdminControllerFactory::class
]
]
<?php
namespace User\Factory\Controller\Core;
use User\Controller\UserAdminController;
use Interop\Container\ContainerInterface;
use User\Entity\User;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class UserAdminControllerFactory implements FactoryInterface{
/**
* @param ContainerInterface $container
* @param string $requestedName
* @param array|null $options
*
* @return UserAdminController
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
$serviceLocator = $container->getServiceLocator();
return new UserAdminController($serviceLocator->get(User::class));
}
/**
* @param ServiceLocatorInterface $serviceLocator
*
* @return UserAdminController
*/
public function createService(ServiceLocatorInterface $serviceLocator){
return $this($serviceLocator, UserAdminController::class);
}
}
最好的方法是将用户实体的新实例注入控制器。控制器工厂应如下所示:
"service_manager" => [
"factories" => [
Entity\User::class => Factory\Entity\UserFactory::class
],
"shared" => [
Entity\User::class => false
]
],
"controllers" => [
"factories" => [
Controller\UserAdminController::class => Factory\Controller\UserAdminControllerFactory::class
]
]
<?php
namespace User\Factory\Controller\Core;
use User\Controller\UserAdminController;
use Interop\Container\ContainerInterface;
use User\Entity\User;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class UserAdminControllerFactory implements FactoryInterface{
/**
* @param ContainerInterface $container
* @param string $requestedName
* @param array|null $options
*
* @return UserAdminController
*/
public function __invoke(ContainerInterface $container, $requestedName, array $options = null){
$serviceLocator = $container->getServiceLocator();
return new UserAdminController($serviceLocator->get(User::class));
}
/**
* @param ServiceLocatorInterface $serviceLocator
*
* @return UserAdminController
*/
public function createService(ServiceLocatorInterface $serviceLocator){
return $this($serviceLocator, UserAdminController::class);
}
}
我不确定您现在看到的可能是什么,但是为什么不将工厂注入控制器并创建用户实体呢?您还可以共享UserFactory的内容吗?您是否有充分的理由为域实体编写工厂?无论如何,我会尝试为这样的任务编写一个控制器插件,因为我的工厂需要服务定位器,如果我注入工厂,我也必须注入服务定位器,这是一种反模式。因此,我不能这样做。有什么想法吗?@edigu我认为创建一个控制器插件不是一个好主意,因为它会在控制器中引入更多的依赖项,更具体地说,在每个控制器中,因为控制器插件在应用程序范围内都是可用的。我将添加UserFactory,但这适用于每个具有依赖项的obejct。例如,一个表单或一个必须重复多次(才能有多个实例)的字段集,用于查询数据库。@edigu我已经添加了UserFactory,您可以看一下。也许这里是您正在查看的内容,我不确定,但是为什么不将工厂注入控制器并创建用户实体呢?您还可以共享UserFactory的内容吗?您是否有充分的理由为域实体编写工厂?无论如何,我会尝试为这样的任务编写一个控制器插件,因为我的工厂需要服务定位器,如果我注入工厂,我也必须注入服务定位器,这是一种反模式。因此,我不能这样做。有什么想法吗?@edigu我认为创建一个控制器插件不是一个好主意,因为它会在控制器中引入更多的依赖项,更具体地说,在每个控制器中,因为控制器插件在应用程序范围内都是可用的。我将添加UserFactory,但这适用于每个具有依赖项的obejct。例如,一个表单或一个必须重复多次(才能有多个实例)的字段集,用于查询数据库。@edigu我已经添加了UserFactory,您可以查看一下。